Skip to content

Commit 309c09b

Browse files
committed
VM insert fixes
1 - Fix of VM insert for VMs with StorPool volumes 2 - Fix of list/insert unmanaged VMs with RBD volumes
1 parent 746bae7 commit 309c09b

File tree

2 files changed

+14
-17
lines changed

2 files changed

+14
-17
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,17 @@
2727
import com.cloud.utils.Pair;
2828
import com.cloud.utils.exception.CloudRuntimeException;
2929
import com.cloud.vm.VirtualMachine;
30-
import org.apache.cloudstack.utils.qemu.QemuImg;
31-
import org.apache.cloudstack.utils.qemu.QemuImgException;
32-
import org.apache.cloudstack.utils.qemu.QemuImgFile;
3330
import org.apache.cloudstack.vm.UnmanagedInstanceTO;
3431
import org.apache.commons.lang3.StringUtils;
3532
import org.apache.log4j.Logger;
3633
import org.libvirt.Connect;
3734
import org.libvirt.Domain;
35+
import org.libvirt.DomainBlockInfo;
3836
import org.libvirt.LibvirtException;
3937

4038
import java.util.ArrayList;
4139
import java.util.HashMap;
4240
import java.util.List;
43-
import java.util.Map;
4441

4542
@ResourceWrapper(handles=GetUnmanagedInstancesCommand.class)
4643
public final class LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWrapper<GetUnmanagedInstancesCommand, GetUnmanagedInstancesAnswer, LibvirtComputingResource> {
@@ -132,7 +129,7 @@ private UnmanagedInstanceTO getUnmanagedInstance(LibvirtComputingResource libvir
132129
instance.setPowerState(getPowerState(libvirtComputingResource.getVmState(conn,domain.getName())));
133130
instance.setMemory((int) LibvirtComputingResource.getDomainMemory(domain) / 1024);
134131
instance.setNics(getUnmanagedInstanceNics(parser.getInterfaces()));
135-
instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource));
132+
instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource, conn, domain.getName()));
136133
instance.setVncPassword(parser.getVncPasswd() + "aaaaaaaaaaaaaa"); // Suffix back extra characters for DB compatibility
137134

138135
return instance;
@@ -170,7 +167,7 @@ private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(List<LibvirtVMDef
170167
return nics;
171168
}
172169

173-
private List<UnmanagedInstanceTO.Disk> getUnmanagedInstanceDisks(List<LibvirtVMDef.DiskDef> disksInfo, LibvirtComputingResource libvirtComputingResource){
170+
private List<UnmanagedInstanceTO.Disk> getUnmanagedInstanceDisks(List<LibvirtVMDef.DiskDef> disksInfo, LibvirtComputingResource libvirtComputingResource, Connect conn, String domainName) {
174171
final ArrayList<UnmanagedInstanceTO.Disk> disks = new ArrayList<>(disksInfo.size());
175172
int counter = 0;
176173
for (LibvirtVMDef.DiskDef diskDef : disksInfo) {
@@ -180,14 +177,11 @@ private List<UnmanagedInstanceTO.Disk> getUnmanagedInstanceDisks(List<LibvirtVMD
180177

181178
final UnmanagedInstanceTO.Disk disk = new UnmanagedInstanceTO.Disk();
182179
Long size = null;
183-
String imagePath = null;
184180
try {
185-
QemuImgFile file = new QemuImgFile(diskDef.getSourcePath());
186-
QemuImg qemu = new QemuImg(0);
187-
Map<String, String> info = qemu.info(file);
188-
size = Long.parseLong(info.getOrDefault("virtual_size", "0"));
189-
imagePath = info.getOrDefault("image", null);
190-
} catch (QemuImgException | LibvirtException e) {
181+
Domain dm = conn.domainLookupByName(domainName);
182+
DomainBlockInfo blockInfo = dm.blockInfo(diskDef.getDiskLabel());
183+
size = blockInfo.getCapacity();
184+
} catch (LibvirtException e) {
191185
throw new RuntimeException(e);
192186
}
193187

@@ -203,14 +197,17 @@ private List<UnmanagedInstanceTO.Disk> getUnmanagedInstanceDisks(List<LibvirtVMD
203197
disk.setDatastoreHost(sourceHostPath.first());
204198
disk.setDatastorePath(sourceHostPath.second());
205199
} else {
206-
disk.setDatastorePath(diskDef.getSourcePath());
200+
int pathEnd = diskDef.getSourcePath().lastIndexOf("/");
201+
if (pathEnd >= 0) {
202+
disk.setDatastorePath(diskDef.getSourcePath().substring(0, pathEnd));
203+
}
207204
disk.setDatastoreHost(diskDef.getSourceHost());
208205
}
209206

210207
disk.setDatastoreType(diskDef.getDiskType().toString());
211208
disk.setDatastorePort(diskDef.getSourceHostPort());
212-
disk.setImagePath(imagePath);
213-
disk.setDatastoreName(imagePath.substring(imagePath.lastIndexOf("/")));
209+
disk.setImagePath(diskDef.getSourcePath());
210+
disk.setDatastoreName(disk.getDatastorePath());
214211
disks.add(disk);
215212
}
216213
return disks;

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ private StoragePool getStoragePool(final UnmanagedInstanceTO.Disk disk, final Da
551551
List<StoragePoolVO> pools = primaryDataStoreDao.listPoolsByCluster(cluster.getId());
552552
pools.addAll(primaryDataStoreDao.listByDataCenterId(zone.getId()));
553553
for (StoragePool pool : pools) {
554-
if (pool.getPath().endsWith(dsName)) {
554+
if (StringUtils.containsAny(pool.getPath(), dsName, dsPath)) {
555555
storagePool = pool;
556556
break;
557557
}

0 commit comments

Comments
 (0)