From 348404449a4d5ed4ee007e279eb160515b22f5df Mon Sep 17 00:00:00 2001 From: Slavka Peleva Date: Thu, 4 Jan 2024 18:24:44 +0200 Subject: [PATCH 1/2] VM insert fixes 1 - Fix of VM insert for VMs with StorPool volumes 2 - Fix of list/insert unmanaged VMs with RBD volumes --- ...rtGetUnmanagedInstancesCommandWrapper.java | 29 +++++++++---------- .../vm/UnmanagedVMsManagerImpl.java | 2 +- 2 files changed, 14 insertions(+), 17 deletions(-) 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 a2d84063d741..a0a8b3787a71 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 @@ -27,20 +27,17 @@ import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VirtualMachine; -import org.apache.cloudstack.utils.qemu.QemuImg; -import org.apache.cloudstack.utils.qemu.QemuImgException; -import org.apache.cloudstack.utils.qemu.QemuImgFile; import org.apache.cloudstack.vm.UnmanagedInstanceTO; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.Domain; +import org.libvirt.DomainBlockInfo; import org.libvirt.LibvirtException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; @ResourceWrapper(handles=GetUnmanagedInstancesCommand.class) public final class LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWrapper { @@ -132,7 +129,7 @@ private UnmanagedInstanceTO getUnmanagedInstance(LibvirtComputingResource libvir instance.setPowerState(getPowerState(libvirtComputingResource.getVmState(conn,domain.getName()))); instance.setMemory((int) LibvirtComputingResource.getDomainMemory(domain) / 1024); instance.setNics(getUnmanagedInstanceNics(parser.getInterfaces())); - instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource)); + instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource, conn, domain.getName())); instance.setVncPassword(parser.getVncPasswd() + "aaaaaaaaaaaaaa"); // Suffix back extra characters for DB compatibility return instance; @@ -170,7 +167,7 @@ private List getUnmanagedInstanceNics(List getUnmanagedInstanceDisks(List disksInfo, LibvirtComputingResource libvirtComputingResource){ + private List getUnmanagedInstanceDisks(List disksInfo, LibvirtComputingResource libvirtComputingResource, Connect conn, String domainName) { final ArrayList disks = new ArrayList<>(disksInfo.size()); int counter = 0; for (LibvirtVMDef.DiskDef diskDef : disksInfo) { @@ -180,14 +177,11 @@ private List getUnmanagedInstanceDisks(List info = qemu.info(file); - size = Long.parseLong(info.getOrDefault("virtual_size", "0")); - imagePath = info.getOrDefault("image", null); - } catch (QemuImgException | LibvirtException e) { + Domain dm = conn.domainLookupByName(domainName); + DomainBlockInfo blockInfo = dm.blockInfo(diskDef.getDiskLabel()); + size = blockInfo.getCapacity(); + } catch (LibvirtException e) { throw new RuntimeException(e); } @@ -203,14 +197,17 @@ private List getUnmanagedInstanceDisks(List= 0) { + disk.setDatastorePath(diskDef.getSourcePath().substring(0, pathEnd)); + } disk.setDatastoreHost(diskDef.getSourceHost()); } disk.setDatastoreType(diskDef.getDiskType().toString()); disk.setDatastorePort(diskDef.getSourceHostPort()); - disk.setImagePath(imagePath); - disk.setDatastoreName(imagePath.substring(imagePath.lastIndexOf("/"))); + disk.setImagePath(diskDef.getSourcePath()); + disk.setDatastoreName(disk.getDatastorePath()); disks.add(disk); } return disks; diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index ebd11f119573..5ce37d385ce1 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -551,7 +551,7 @@ private StoragePool getStoragePool(final UnmanagedInstanceTO.Disk disk, final Da List pools = primaryDataStoreDao.listPoolsByCluster(cluster.getId()); pools.addAll(primaryDataStoreDao.listByDataCenterId(zone.getId())); for (StoragePool pool : pools) { - if (pool.getPath().endsWith(dsName)) { + if (StringUtils.containsAny(pool.getPath(), dsName, dsPath)) { storagePool = pool; break; } From 89211193c181edbec8ac7136e1482c319ae6a7bc Mon Sep 17 00:00:00 2001 From: Slavka Peleva Date: Tue, 9 Jan 2024 15:55:13 +0200 Subject: [PATCH 2/2] address changes Chech if the pool path contains the datastore path. There is no need to check for the datastore name because for VMware it get the datastore UUID which isn't relevant with the primary storage path in CS --- .../wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java | 2 ++ .../java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java | 2 +- 2 files changed, 3 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 a0a8b3787a71..9a4498b12fd1 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 @@ -200,6 +200,8 @@ private List getUnmanagedInstanceDisks(List= 0) { disk.setDatastorePath(diskDef.getSourcePath().substring(0, pathEnd)); + } else { + disk.setDatastorePath(diskDef.getSourcePath()); } disk.setDatastoreHost(diskDef.getSourceHost()); } diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index 5ce37d385ce1..559b6c7af06b 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -551,7 +551,7 @@ private StoragePool getStoragePool(final UnmanagedInstanceTO.Disk disk, final Da List pools = primaryDataStoreDao.listPoolsByCluster(cluster.getId()); pools.addAll(primaryDataStoreDao.listByDataCenterId(zone.getId())); for (StoragePool pool : pools) { - if (StringUtils.containsAny(pool.getPath(), dsName, dsPath)) { + if (StringUtils.contains(pool.getPath(), dsPath)) { storagePool = pool; break; }