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;
}