diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java index bd0d613ad97..d2c40ab56c6 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -1244,9 +1244,6 @@ public class VmwareStorageProcessor implements StorageProcessor { VirtualDisk requiredDisk = volumeDeviceInfo.first(); vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, requiredDisk); clonedVm = dcMo.findVm(templateUniqueName); - - checkIfVMHasOnlyRequiredDisk(clonedVm, requiredDisk); - clonedVm.tagAsWorkerVM(); clonedVm.exportVm(secondaryMountPoint + "/" + installPath, templateUniqueName, false, false); @@ -1839,7 +1836,6 @@ public class VmwareStorageProcessor implements StorageProcessor { s_logger.error(msg); throw new Exception(msg); } - checkIfVMHasOnlyRequiredDisk(clonedVm, requiredDisk); clonedVm.tagAsWorkerVM(); vmMo = clonedVm; } @@ -1854,19 +1850,6 @@ public class VmwareStorageProcessor implements StorageProcessor { } } - private void checkIfVMHasOnlyRequiredDisk(VirtualMachineMO clonedVm, VirtualDisk requiredDisk) throws Exception { - - s_logger.info(String.format("Checking if Cloned VM %s is created only with required Disk, if not detach the remaining disks", clonedVm.getName())); - VirtualDisk[] vmDisks = clonedVm.getAllDiskDevice(); - if (vmDisks.length != 1) { - String baseName = VmwareHelper.getDiskDeviceFileName(requiredDisk); - 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())); - clonedVm.detachAllDisksExcept(VmwareHelper.getDiskDeviceFileName(requiredDisk), null); - } else { - s_logger.info(String.format("Cloned VM %s is created only with required Disk", clonedVm.getName())); - } - } - // Ternary private Ternary backupSnapshotToSecondaryStorage(VmwareContext context, VirtualMachineMO vmMo, VmwareHypervisorHost hypervisorHost, String installPath, String volumePath, String snapshotUuid, String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName, diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index 93df0dcce37..3a605c9b418 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -784,12 +784,41 @@ public class VirtualMachineMO extends BaseMO { if (result) { _context.waitForTaskProgressDone(morTask); s_logger.debug(String.format("Cloned VM: %s as %s", getName(), cloneName)); + makeSureVMHasOnlyRequiredDisk(cloneName, requiredDisk); return true; } else { s_logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask)); + makeSureVMHasOnlyRequiredDisk(cloneName, requiredDisk); + return false; } + } - return false; + private void makeSureVMHasOnlyRequiredDisk(String vmName, VirtualDisk requiredDisk) throws Exception { + VirtualMachineRuntimeInfo runtimeInfo = getRuntimeInfo(); + HostMO hostMo = new HostMO(_context, runtimeInfo.getHost()); + DatacenterMO dcMo = new DatacenterMO(_context, hostMo.getHyperHostDatacenter()); + + VirtualMachineMO clonedVm = dcMo.findVm(vmName); + VirtualDisk[] vmDisks = clonedVm.getAllDiskDevice(); + s_logger.debug(String.format("Checking if VM %s is created only with required Disk, if not detach the remaining disks", vmName)); + if (vmDisks.length != 1) { + VirtualDisk requiredCloneDisk = null; + for (VirtualDisk vmDisk: vmDisks) { + if (vmDisk.getKey() == requiredDisk.getKey()) { + requiredCloneDisk = vmDisk; + break; + } + } + if (requiredCloneDisk != null) { + String baseName = VmwareHelper.getDiskDeviceFileName(requiredCloneDisk); + s_logger.debug(String.format("Detaching all disks for the VM: %s except disk with base name: %s, key=%d", vmName, baseName, requiredCloneDisk.getKey())); + clonedVm.detachAllDisksExcept(baseName, null); + } else { + s_logger.error(String.format("Failed to identify required disk in VM %s", vmName)); + } + } else { + s_logger.debug(String.format("VM %s is created only with required Disk", vmName)); + } } public boolean createFullClone(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs, Storage.ProvisioningType diskProvisioningType)