From 6bf87be9bd8d4669c9047ac44d767c768be96b10 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Mon, 29 Jul 2024 18:37:39 +0530 Subject: [PATCH 1/2] [VMware] Disconnect/Detach config drive ISO (if exists) on stop VM --- .../vmware/resource/VmwareResource.java | 28 ++++++++++++++++++- .../vmware/mo/VirtualMachineMO.java | 13 +++++++++ 2 files changed, 40 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 157ed75c9d08..d92f77686226 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.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 @@ private boolean multipleIsosAtached(DiskTO[] sortedDisks) { 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 @@ protected Answer execute(StopCommand cmd) { 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,28 @@ protected Answer execute(StopCommand cmd) { } } + private void disconnectConfigDriveIsoIfExists(VirtualMachineMO vmMo) { + try { + List isoDevices = vmMo.getIsoDevices(); + if (CollectionUtils.isEmpty(isoDevices)) { + return; + } + + for (VirtualDevice isoDevice : isoDevices) { + if(isoDevice.getBacking() instanceof VirtualCdromIsoBackingInfo) { + String isoFilePath = ((VirtualCdromIsoBackingInfo)isoDevice.getBacking()).getFileName(); + if (isoFilePath.contains(ConfigDrive.CONFIGDRIVEDIR)) { + 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 d21d20b791ce..5e7b6e8d06fc 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,19 @@ public VirtualDevice getIsoDevice() throws Exception { return null; } + public List getIsoDevices() throws Exception { + List isoDevices = new ArrayList<>(); + List devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device"); + if (devices != null && devices.size() > 0) { + for (VirtualDevice device : devices) { + if (device instanceof VirtualCdrom) { + isoDevices.add(device); + } + } + } + return isoDevices; + } + public VirtualDevice getIsoDevice(int key) throws Exception { List devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device"); if (devices != null && devices.size() > 0) { From ea6fcd14198af7c06073946196db77e64f7051b1 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Mon, 26 Aug 2024 11:28:43 +0530 Subject: [PATCH 2/2] addressed review comments --- .../vmware/resource/VmwareResource.java | 16 +++++++++------- .../hypervisor/vmware/mo/VirtualMachineMO.java | 11 +++-------- 2 files changed, 12 insertions(+), 15 deletions(-) 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 d92f77686226..732d40da3073 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 @@ -4478,14 +4478,16 @@ private void disconnectConfigDriveIsoIfExists(VirtualMachineMO vmMo) { } for (VirtualDevice isoDevice : isoDevices) { - if(isoDevice.getBacking() instanceof VirtualCdromIsoBackingInfo) { - String isoFilePath = ((VirtualCdromIsoBackingInfo)isoDevice.getBacking()).getFileName(); - if (isoFilePath.contains(ConfigDrive.CONFIGDRIVEDIR)) { - s_logger.info(String.format("Disconnecting config drive at location: %s", isoFilePath)); - vmMo.detachIso(isoFilePath, true); - return; - } + 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); 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 5e7b6e8d06fc..742f33575f50 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 @@ -3204,16 +3204,11 @@ public VirtualDevice getIsoDevice() throws Exception { } public List getIsoDevices() throws Exception { - List isoDevices = new ArrayList<>(); List devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device"); - if (devices != null && devices.size() > 0) { - for (VirtualDevice device : devices) { - if (device instanceof VirtualCdrom) { - isoDevices.add(device); - } - } + if (CollectionUtils.isEmpty(devices)) { + return new ArrayList<>(); } - return isoDevices; + return devices.stream().filter(device -> device instanceof VirtualCdrom).collect(Collectors.toList()); } public VirtualDevice getIsoDevice(int key) throws Exception {