This is an automated email from the ASF dual-hosted git repository. dahn pushed a commit to branch 4.19 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.19 by this push: new 6c0492366c0 [VMware] Disconnect/Detach config drive ISO (if exists) on stop VM (#9468) 6c0492366c0 is described below commit 6c0492366c0212b68487c631c1a824b9b81a46af Author: Suresh Kumar Anaparti <sureshkumar.anapa...@gmail.com> AuthorDate: Tue Aug 27 14:41:01 2024 +0530 [VMware] Disconnect/Detach config drive ISO (if exists) on stop VM (#9468) --- .../hypervisor/vmware/resource/VmwareResource.java | 30 +++++++++++++++++++++- .../hypervisor/vmware/mo/VirtualMachineMO.java | 8 ++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 157ed75c9d0..732d40da307 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -55,6 +55,7 @@ import com.vmware.vim25.FileQueryFlags; import com.vmware.vim25.FolderFileInfo; import com.vmware.vim25.HostDatastoreBrowserSearchResults; import com.vmware.vim25.HostDatastoreBrowserSearchSpec; +import com.vmware.vim25.VirtualCdromIsoBackingInfo; import com.vmware.vim25.VirtualMachineConfigSummary; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.backup.PrepareForBackupRestorationCommand; @@ -2738,8 +2739,9 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes private DiskTO[] getDisks(DiskTO[] sortedDisks) { return Arrays.stream(sortedDisks).filter(vol -> ((vol.getPath() != null && - vol.getPath().contains("configdrive"))) || (vol.getType() != Volume.Type.ISO)).toArray(DiskTO[]::new); + vol.getPath().contains(ConfigDrive.CONFIGDRIVEDIR))) || (vol.getType() != Volume.Type.ISO)).toArray(DiskTO[]::new); } + private void configureIso(VmwareHypervisorHost hyperHost, VirtualMachineMO vmMo, DiskTO vol, VirtualDeviceConfigSpec[] deviceConfigSpecArray, int ideUnitNumber, int i) throws Exception { TemplateObjectTO iso = (TemplateObjectTO) vol.getData(); @@ -4448,6 +4450,8 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes msg = "Have problem in powering off VM " + cmd.getVmName() + ", let the process continue"; s_logger.warn(msg); } + + disconnectConfigDriveIsoIfExists(vmMo); return new StopAnswer(cmd, msg, true); } @@ -4466,6 +4470,30 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes } } + private void disconnectConfigDriveIsoIfExists(VirtualMachineMO vmMo) { + try { + List<VirtualDevice> isoDevices = vmMo.getIsoDevices(); + if (CollectionUtils.isEmpty(isoDevices)) { + return; + } + + for (VirtualDevice isoDevice : isoDevices) { + if (!(isoDevice.getBacking() instanceof VirtualCdromIsoBackingInfo)) { + continue; + } + String isoFilePath = ((VirtualCdromIsoBackingInfo)isoDevice.getBacking()).getFileName(); + if (!isoFilePath.contains(ConfigDrive.CONFIGDRIVEDIR)) { + continue; + } + s_logger.info(String.format("Disconnecting config drive at location: %s", isoFilePath)); + vmMo.detachIso(isoFilePath, true); + return; + } + } catch (Exception e) { + s_logger.warn(String.format("Couldn't check/disconnect config drive, error: %s", e.getMessage()), e); + } + } + protected Answer execute(RebootRouterCommand cmd) { RebootAnswer answer = (RebootAnswer) execute((RebootCommand) cmd); 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 d21d20b791c..742f33575f5 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 @@ -3203,6 +3203,14 @@ public class VirtualMachineMO extends BaseMO { return null; } + public List<VirtualDevice> getIsoDevices() throws Exception { + List<VirtualDevice> devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device"); + if (CollectionUtils.isEmpty(devices)) { + return new ArrayList<>(); + } + return devices.stream().filter(device -> device instanceof VirtualCdrom).collect(Collectors.toList()); + } + public VirtualDevice getIsoDevice(int key) throws Exception { List<VirtualDevice> devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device"); if (devices != null && devices.size() > 0) {