From 2297c73c92a46cc9eb544d79123487b21c8064d1 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Fri, 3 Sep 2021 00:38:44 +0530 Subject: [PATCH] vmware: delete snapshot disk after backup to secondary storage (#5333) * vmware: delete snapshot disk after backup to secondary storage WIP - This ensures that worker VM is destroyed along with any of its own disks that are backed up to secondary storage. Signed-off-by: Rohit Yadav * fix Signed-off-by: Abhishek Kumar * fix for volume backup and confuding vm var name Signed-off-by: Abhishek Kumar * change Signed-off-by: Abhishek Kumar * tag as worker vm Signed-off-by: Abhishek Kumar Co-authored-by: Abhishek Kumar --- .../resource/VmwareStorageProcessor.java | 21 +++++++++++-------- .../vmware/mo/VirtualMachineMO.java | 13 ++++++------ 2 files changed, 19 insertions(+), 15 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 6536bb7f466..db2460338b4 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 @@ -1264,7 +1264,8 @@ public class VmwareStorageProcessor implements StorageProcessor { } finally { if (clonedVm != null) { - clonedVm.detachAllDisksAndDestroy(); + s_logger.debug(String.format("Destroying cloned VM: %s with its disks", clonedVm.getName())); + clonedVm.destroy(); } } } @@ -1832,7 +1833,8 @@ public class VmwareStorageProcessor implements StorageProcessor { return new Pair<>(diskDevice, disks); } finally { if (clonedVm != null) { - clonedVm.detachAllDisksAndDestroy(); + s_logger.debug(String.format("Destroying cloned VM: %s with its disks", clonedVm.getName())); + clonedVm.destroy(); } } } @@ -3738,23 +3740,24 @@ public class VmwareStorageProcessor implements StorageProcessor { throw new Exception(msg); } - VirtualMachineMO clonedVm = null; + VirtualMachineMO workerVm = null; try { hyperHost.importVmFromOVF(srcOVFFileName, newVolumeName, primaryDsMo, "thin", null); - clonedVm = hyperHost.findVmOnHyperHost(newVolumeName); - if (clonedVm == null) { + workerVm = hyperHost.findVmOnHyperHost(newVolumeName); + if (workerVm == null) { throw new Exception("Unable to create container VM for volume creation"); } + workerVm.tagAsWorkerVM(); if(!primaryDsMo.getDatastoreType().equalsIgnoreCase("VVOL")) { HypervisorHostHelper.createBaseFolderInDatastore(primaryDsMo, primaryDsMo.getDataCenterMor()); - clonedVm.moveAllVmDiskFiles(primaryDsMo, HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, false); + workerVm.moveAllVmDiskFiles(primaryDsMo, HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, false); } - clonedVm.detachAllDisks(); + workerVm.detachAllDisks(); return _storage.getSize(srcOVFFileName); } finally { - if (clonedVm != null) { - clonedVm.detachAllDisksAndDestroy(); + if (workerVm != null) { + workerVm.detachAllDisksAndDestroy(); } } } 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 30396f62fd5..be999b45ce5 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 @@ -36,12 +36,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import com.cloud.utils.exception.CloudRuntimeException; -import com.vmware.vim25.InvalidStateFaultMsg; -import com.vmware.vim25.RuntimeFaultFaultMsg; -import com.vmware.vim25.TaskInfo; -import com.vmware.vim25.TaskInfoState; -import com.vmware.vim25.VirtualMachineTicket; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -53,6 +47,7 @@ import com.cloud.utils.ActionDelegate; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.script.Script; import com.google.gson.Gson; import com.vmware.vim25.ArrayOfManagedObjectReference; @@ -66,6 +61,7 @@ import com.vmware.vim25.GuestOsDescriptor; import com.vmware.vim25.HttpNfcLeaseDeviceUrl; import com.vmware.vim25.HttpNfcLeaseInfo; import com.vmware.vim25.HttpNfcLeaseState; +import com.vmware.vim25.InvalidStateFaultMsg; import com.vmware.vim25.ManagedObjectReference; import com.vmware.vim25.ObjectContent; import com.vmware.vim25.ObjectSpec; @@ -76,6 +72,9 @@ import com.vmware.vim25.OvfFile; import com.vmware.vim25.ParaVirtualSCSIController; import com.vmware.vim25.PropertyFilterSpec; import com.vmware.vim25.PropertySpec; +import com.vmware.vim25.RuntimeFaultFaultMsg; +import com.vmware.vim25.TaskInfo; +import com.vmware.vim25.TaskInfoState; import com.vmware.vim25.TraversalSpec; import com.vmware.vim25.VirtualBusLogicController; import com.vmware.vim25.VirtualCdrom; @@ -120,6 +119,7 @@ import com.vmware.vim25.VirtualMachineRelocateSpecDiskLocator; import com.vmware.vim25.VirtualMachineRuntimeInfo; import com.vmware.vim25.VirtualMachineSnapshotInfo; import com.vmware.vim25.VirtualMachineSnapshotTree; +import com.vmware.vim25.VirtualMachineTicket; import com.vmware.vim25.VirtualSCSIController; import com.vmware.vim25.VirtualSCSISharing; @@ -771,6 +771,7 @@ public class VirtualMachineMO extends BaseMO { boolean result = _context.getVimClient().waitForTask(morTask); if (result) { _context.waitForTaskProgressDone(morTask); + s_logger.debug(String.format("Cloned VM: %s as %s", getName(), cloneName)); return true; } else { s_logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));