From d4697d1a4d1de9f11f1a9b3e167d88a3fa5f10e3 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Wed, 29 Sep 2021 12:57:55 +0530 Subject: [PATCH] Delete dettached disks from cloned VM and added few logs --- .../resource/VmwareStorageProcessor.java | 15 +++----- .../vmware/mo/VirtualMachineMO.java | 38 ++++++++++++------- 2 files changed, 30 insertions(+), 23 deletions(-) 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 d2c40ab56c6..b3ab3fe8389 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 @@ -1242,9 +1242,10 @@ public class VmwareStorageProcessor implements StorageProcessor { DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter()); ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool(); VirtualDisk requiredDisk = volumeDeviceInfo.first(); - vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, requiredDisk); - clonedVm = dcMo.findVm(templateUniqueName); - clonedVm.tagAsWorkerVM(); + clonedVm = vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, requiredDisk); + if (clonedVm == null) { + throw new Exception(String.format("Failed to clone VM with name %s during create template from volume operation", templateUniqueName)); + } clonedVm.exportVm(secondaryMountPoint + "/" + installPath, templateUniqueName, false, false); // Get VMDK filename @@ -1829,14 +1830,10 @@ public class VmwareStorageProcessor implements StorageProcessor { DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter()); ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool(); VirtualDisk requiredDisk = volumeDeviceInfo.first(); - vmMo.createFullCloneWithSpecificDisk(exportName, dcMo.getVmFolder(), morPool, requiredDisk); - clonedVm = dcMo.findVm(exportName); + clonedVm = vmMo.createFullCloneWithSpecificDisk(exportName, dcMo.getVmFolder(), morPool, requiredDisk); if (clonedVm == null) { - String msg = "Failed to clone VM. volume path: " + volumePath; - s_logger.error(msg); - throw new Exception(msg); + throw new Exception(String.format("Failed to clone VM with name %s during export volume operation", exportName)); } - clonedVm.tagAsWorkerVM(); vmMo = clonedVm; } vmMo.exportVm(exportPath, exportName, false, false); 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 54ea919571b..c27470e3ad6 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 @@ -751,17 +751,23 @@ public class VirtualMachineMO extends BaseMO { return false; } - public boolean createFullCloneWithSpecificDisk(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, VirtualDisk requiredDisk) + public VirtualMachineMO createFullCloneWithSpecificDisk(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, VirtualDisk requiredDisk) throws Exception { assert (morFolder != null); assert (morResourcePool != null); + VirtualMachineRuntimeInfo runtimeInfo = getRuntimeInfo(); + HostMO hostMo = new HostMO(_context, runtimeInfo.getHost()); + DatacenterMO dcMo = new DatacenterMO(_context, hostMo.getHyperHostDatacenter()); + DatastoreMO dsMo = new DatastoreMO(_context, morResourcePool); VirtualMachineRelocateSpec rSpec = new VirtualMachineRelocateSpec(); VirtualDisk[] vmDisks = getAllDiskDevice(); VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); + s_logger.debug(String.format("Removing the disks other than the required disk with key %s to the cloned VM", requiredDisk.getKey())); for (VirtualDisk disk : vmDisks) { + s_logger.debug(String.format("Original disk with key %s found in the VM %s", disk.getKey(), getName())); if (requiredDisk.getKey() != disk.getKey()) { VirtualDeviceConfigSpec virtualDeviceConfigSpec = new VirtualDeviceConfigSpec(); virtualDeviceConfigSpec.setDevice(disk); @@ -783,25 +789,27 @@ public class VirtualMachineMO extends BaseMO { boolean result = _context.getVimClient().waitForTask(morTask); if (result) { _context.waitForTaskProgressDone(morTask); + VirtualMachineMO clonedVm = dcMo.findVm(cloneName); + if (clonedVm == null) { + s_logger.error(String.format("Failed to clone VM %s", cloneName)); + return null; + } s_logger.debug(String.format("Cloned VM: %s as %s", getName(), cloneName)); - makeSureVMHasOnlyRequiredDisk(cloneName, requiredDisk); - return true; + clonedVm.tagAsWorkerVM(); + makeSureVMHasOnlyRequiredDisk(clonedVm, requiredDisk, dsMo, dcMo); + return clonedVm; } else { s_logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask)); - makeSureVMHasOnlyRequiredDisk(cloneName, requiredDisk); - return false; + return null; } } - 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()); + private void makeSureVMHasOnlyRequiredDisk(VirtualMachineMO clonedVm, VirtualDisk requiredDisk, DatastoreMO dsMo, DatacenterMO dcMo) throws Exception { - VirtualMachineMO clonedVm = dcMo.findVm(vmName); + String vmName = clonedVm.getName(); 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 && vmDisks[0].getKey() == requiredDisk.getKey()) { + if (vmDisks.length == 1) { s_logger.debug(String.format("VM %s is created only with required Disk", vmName)); return; } @@ -815,13 +823,15 @@ public class VirtualMachineMO extends BaseMO { } if (requiredCloneDisk == null) { s_logger.error(String.format("Failed to identify required disk in VM %s", vmName)); - return; + throw new CloudRuntimeException(String.format("VM %s is not created with required disk", vmName)); } 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); - + List detachedDisks = clonedVm.detachAllDisksExcept(baseName, null); + for (String diskPath : detachedDisks) { + dsMo.deleteFile(diskPath, dcMo.getMor(), true, null); + } } public boolean createFullClone(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs, Storage.ProvisioningType diskProvisioningType)