Skip to content

Commit 874b5a3

Browse files
Move clone operation into virtual machine mo
1 parent e4727f7 commit 874b5a3

File tree

2 files changed

+30
-18
lines changed

2 files changed

+30
-18
lines changed

plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,9 +1244,6 @@ private Ternary<String, Long, Long> createTemplateFromVolume(VmwareContext conte
12441244
VirtualDisk requiredDisk = volumeDeviceInfo.first();
12451245
vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, requiredDisk);
12461246
clonedVm = dcMo.findVm(templateUniqueName);
1247-
1248-
checkIfVMHasOnlyRequiredDisk(clonedVm, requiredDisk);
1249-
12501247
clonedVm.tagAsWorkerVM();
12511248
clonedVm.exportVm(secondaryMountPoint + "/" + installPath, templateUniqueName, false, false);
12521249

@@ -1839,7 +1836,6 @@ private Pair<String, String[]> exportVolumeToSecondaryStorage(VmwareContext cont
18391836
s_logger.error(msg);
18401837
throw new Exception(msg);
18411838
}
1842-
checkIfVMHasOnlyRequiredDisk(clonedVm, requiredDisk);
18431839
clonedVm.tagAsWorkerVM();
18441840
vmMo = clonedVm;
18451841
}
@@ -1854,19 +1850,6 @@ private Pair<String, String[]> exportVolumeToSecondaryStorage(VmwareContext cont
18541850
}
18551851
}
18561852

1857-
private void checkIfVMHasOnlyRequiredDisk(VirtualMachineMO clonedVm, VirtualDisk requiredDisk) throws Exception {
1858-
1859-
s_logger.info(String.format("Checking if Cloned VM %s is created only with required Disk, if not detach the remaining disks", clonedVm.getName()));
1860-
VirtualDisk[] vmDisks = clonedVm.getAllDiskDevice();
1861-
if (vmDisks.length != 1) {
1862-
String baseName = VmwareHelper.getDiskDeviceFileName(requiredDisk);
1863-
s_logger.info(String.format("Detaching all disks for the cloned VM: %s except disk with base name: %s, key=%d", clonedVm.getName(), baseName, requiredDisk.getKey()));
1864-
clonedVm.detachAllDisksExcept(VmwareHelper.getDiskDeviceFileName(requiredDisk), null);
1865-
} else {
1866-
s_logger.info(String.format("Cloned VM %s is created only with required Disk", clonedVm.getName()));
1867-
}
1868-
}
1869-
18701853
// Ternary<String(backup uuid in secondary storage), String(device bus name), String[](original disk chain in the snapshot)>
18711854
private Ternary<String, String, String[]> backupSnapshotToSecondaryStorage(VmwareContext context, VirtualMachineMO vmMo, VmwareHypervisorHost hypervisorHost, String installPath, String volumePath, String snapshotUuid,
18721855
String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName,

vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,12 +784,41 @@ public boolean createFullCloneWithSpecificDisk(String cloneName, ManagedObjectRe
784784
if (result) {
785785
_context.waitForTaskProgressDone(morTask);
786786
s_logger.debug(String.format("Cloned VM: %s as %s", getName(), cloneName));
787+
makeSureVMHasOnlyRequiredDisk(cloneName, requiredDisk);
787788
return true;
788789
} else {
789790
s_logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
791+
makeSureVMHasOnlyRequiredDisk(cloneName, requiredDisk);
792+
return false;
790793
}
794+
}
791795

792-
return false;
796+
private void makeSureVMHasOnlyRequiredDisk(String vmName, VirtualDisk requiredDisk) throws Exception {
797+
VirtualMachineRuntimeInfo runtimeInfo = getRuntimeInfo();
798+
HostMO hostMo = new HostMO(_context, runtimeInfo.getHost());
799+
DatacenterMO dcMo = new DatacenterMO(_context, hostMo.getHyperHostDatacenter());
800+
801+
VirtualMachineMO clonedVm = dcMo.findVm(vmName);
802+
VirtualDisk[] vmDisks = clonedVm.getAllDiskDevice();
803+
s_logger.debug(String.format("Checking if VM %s is created only with required Disk, if not detach the remaining disks", vmName));
804+
if (vmDisks.length != 1) {
805+
VirtualDisk requiredCloneDisk = null;
806+
for (VirtualDisk vmDisk: vmDisks) {
807+
if (vmDisk.getKey() == requiredDisk.getKey()) {
808+
requiredCloneDisk = vmDisk;
809+
break;
810+
}
811+
}
812+
if (requiredCloneDisk != null) {
813+
String baseName = VmwareHelper.getDiskDeviceFileName(requiredCloneDisk);
814+
s_logger.debug(String.format("Detaching all disks for the VM: %s except disk with base name: %s, key=%d", vmName, baseName, requiredCloneDisk.getKey()));
815+
clonedVm.detachAllDisksExcept(baseName, null);
816+
} else {
817+
s_logger.error(String.format("Failed to identify required disk in VM %s", vmName));
818+
}
819+
} else {
820+
s_logger.debug(String.format("VM %s is created only with required Disk", vmName));
821+
}
793822
}
794823

795824
public boolean createFullClone(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs, Storage.ProvisioningType diskProvisioningType)

0 commit comments

Comments
 (0)