This is an automated email from the ASF dual-hosted git repository.
shwstppr pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 59e78cbc455 Fix KVM unmanage disks path (#8483)
59e78cbc455 is described below
commit 59e78cbc45542af2c9eca4d8f0e597dde4be3a3f
Author: Nicolas Vazquez <[email protected]>
AuthorDate: Thu Jan 11 06:15:57 2024 -0300
Fix KVM unmanage disks path (#8483)
This PR fixes the volumes path on KVM import unmanaged instances
Fixes: #8479
---
...LibvirtGetUnmanagedInstancesCommandWrapper.java | 16 ++++-
...irtGetUnmanagedInstancesCommandWrapperTest.java | 73 ++++++++++++++++++++++
2 files changed, 88 insertions(+), 1 deletion(-)
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java
index 9a4498b12fd..af00763895e 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java
@@ -191,7 +191,6 @@ public final class
LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra
disk.setLabel(diskDef.getDiskLabel());
disk.setController(diskDef.getBusType().toString());
-
Pair<String, String> sourceHostPath =
getSourceHostPath(libvirtComputingResource, diskDef.getSourcePath());
if (sourceHostPath != null) {
disk.setDatastoreHost(sourceHostPath.first());
@@ -210,11 +209,26 @@ public final class
LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra
disk.setDatastorePort(diskDef.getSourceHostPort());
disk.setImagePath(diskDef.getSourcePath());
disk.setDatastoreName(disk.getDatastorePath());
+ disk.setFileBaseName(getDiskRelativePath(diskDef));
disks.add(disk);
}
return disks;
}
+ protected String getDiskRelativePath(LibvirtVMDef.DiskDef diskDef) {
+ if (diskDef == null || diskDef.getDiskType() == null ||
diskDef.getDiskType() == LibvirtVMDef.DiskDef.DiskType.BLOCK) {
+ return null;
+ }
+ String sourcePath = diskDef.getSourcePath();
+ if (StringUtils.isBlank(sourcePath)) {
+ return null;
+ }
+ if (!sourcePath.contains("/")) {
+ return sourcePath;
+ }
+ return sourcePath.substring(sourcePath.lastIndexOf("/") + 1);
+ }
+
private Pair<String, String> getSourceHostPath(LibvirtComputingResource
libvirtComputingResource, String diskPath) {
int pathEnd = diskPath.lastIndexOf("/");
if (pathEnd >= 0) {
diff --git
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapperTest.java
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapperTest.java
new file mode 100644
index 00000000000..df40a3fe7d5
--- /dev/null
+++
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapperTest.java
@@ -0,0 +1,73 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.hypervisor.kvm.resource.wrapper;
+
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.UUID;
+
+@RunWith(MockitoJUnitRunner.class)
+public class LibvirtGetUnmanagedInstancesCommandWrapperTest {
+
+ @Spy
+ private LibvirtGetUnmanagedInstancesCommandWrapper wrapper = new
LibvirtGetUnmanagedInstancesCommandWrapper();
+
+ @Test
+ public void testGetDiskRelativePathNullDisk() {
+ Assert.assertNull(wrapper.getDiskRelativePath(null));
+ }
+
+ @Test
+ public void testGetDiskRelativePathBlockType() {
+ LibvirtVMDef.DiskDef diskDef =
Mockito.mock(LibvirtVMDef.DiskDef.class);
+
Mockito.when(diskDef.getDiskType()).thenReturn(LibvirtVMDef.DiskDef.DiskType.BLOCK);
+ Assert.assertNull(wrapper.getDiskRelativePath(diskDef));
+ }
+
+ @Test
+ public void testGetDiskRelativePathNullPath() {
+ LibvirtVMDef.DiskDef diskDef =
Mockito.mock(LibvirtVMDef.DiskDef.class);
+
Mockito.when(diskDef.getDiskType()).thenReturn(LibvirtVMDef.DiskDef.DiskType.FILE);
+ Mockito.when(diskDef.getSourcePath()).thenReturn(null);
+ Assert.assertNull(wrapper.getDiskRelativePath(diskDef));
+ }
+
+ @Test
+ public void testGetDiskRelativePathWithoutSlashes() {
+ LibvirtVMDef.DiskDef diskDef =
Mockito.mock(LibvirtVMDef.DiskDef.class);
+
Mockito.when(diskDef.getDiskType()).thenReturn(LibvirtVMDef.DiskDef.DiskType.FILE);
+ String imagePath = UUID.randomUUID().toString();
+ Mockito.when(diskDef.getSourcePath()).thenReturn(imagePath);
+ Assert.assertEquals(imagePath, wrapper.getDiskRelativePath(diskDef));
+ }
+
+ @Test
+ public void testGetDiskRelativePathFullPath() {
+ LibvirtVMDef.DiskDef diskDef =
Mockito.mock(LibvirtVMDef.DiskDef.class);
+
Mockito.when(diskDef.getDiskType()).thenReturn(LibvirtVMDef.DiskDef.DiskType.FILE);
+ String relativePath = "ea4b2296-d349-4968-ab72-c8eb523b556e";
+ String imagePath =
String.format("/mnt/97e4c9ed-e3bc-3e26-b103-7967fc9feae1/%s", relativePath);
+ Mockito.when(diskDef.getSourcePath()).thenReturn(imagePath);
+ Assert.assertEquals(relativePath,
wrapper.getDiskRelativePath(diskDef));
+ }
+}