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 c569fe91191 Fix KVM import and list unmanaged VMs (#8445)
c569fe91191 is described below

commit c569fe91191cc07d639bb89268b435a01ce4f065
Author: slavkap <[email protected]>
AuthorDate: Wed Jan 10 09:42:07 2024 +0200

    Fix KVM import and list unmanaged VMs (#8445)
    
    VM import fixes
    
    1 - Fix of VM insert for VMs with StorPool volumes
    2 - Fix of list/insert unmanaged VMs with RBD volumes
---
 ...LibvirtGetUnmanagedInstancesCommandWrapper.java | 31 +++++++++++-----------
 .../cloudstack/vm/UnmanagedVMsManagerImpl.java     |  2 +-
 2 files changed, 16 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 a2d84063d74..9a4498b12fd 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.resource.ResourceWrapper;
 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<GetUnmanagedInstancesCommand, GetUnmanagedInstancesAnswer, 
LibvirtComputingResource> {
@@ -132,7 +129,7 @@ public final class 
LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra
             
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 @@ public final class 
LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra
         return nics;
     }
 
-    private List<UnmanagedInstanceTO.Disk> 
getUnmanagedInstanceDisks(List<LibvirtVMDef.DiskDef> disksInfo, 
LibvirtComputingResource libvirtComputingResource){
+    private List<UnmanagedInstanceTO.Disk> 
getUnmanagedInstanceDisks(List<LibvirtVMDef.DiskDef> disksInfo, 
LibvirtComputingResource libvirtComputingResource, Connect conn, String 
domainName) {
         final ArrayList<UnmanagedInstanceTO.Disk> disks = new 
ArrayList<>(disksInfo.size());
         int counter = 0;
         for (LibvirtVMDef.DiskDef diskDef : disksInfo) {
@@ -180,14 +177,11 @@ public final class 
LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra
 
             final UnmanagedInstanceTO.Disk disk = new 
UnmanagedInstanceTO.Disk();
             Long size = null;
-            String imagePath = null;
             try {
-                QemuImgFile file = new QemuImgFile(diskDef.getSourcePath());
-                QemuImg qemu = new QemuImg(0);
-                Map<String, String> 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,19 @@ public final class 
LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra
                 disk.setDatastoreHost(sourceHostPath.first());
                 disk.setDatastorePath(sourceHostPath.second());
             } else {
-                disk.setDatastorePath(diskDef.getSourcePath());
+                int pathEnd = diskDef.getSourcePath().lastIndexOf("/");
+                if (pathEnd >= 0) {
+                    disk.setDatastorePath(diskDef.getSourcePath().substring(0, 
pathEnd));
+                } else {
+                    disk.setDatastorePath(diskDef.getSourcePath());
+                }
                 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 ebd11f11957..559b6c7af06 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 @@ public class UnmanagedVMsManagerImpl implements 
UnmanagedVMsManager {
             List<StoragePoolVO> pools = 
primaryDataStoreDao.listPoolsByCluster(cluster.getId());
             pools.addAll(primaryDataStoreDao.listByDataCenterId(zone.getId()));
             for (StoragePool pool : pools) {
-                if (pool.getPath().endsWith(dsName)) {
+                if (StringUtils.contains(pool.getPath(), dsPath)) {
                     storagePool = pool;
                     break;
                 }

Reply via email to