From db99146187802ad84ed5e483ea69bffccaf86786 Mon Sep 17 00:00:00 2001 From: Sateesh Chodapuneedi Date: Sat, 28 Dec 2013 02:36:53 +0530 Subject: [PATCH] CLOUDSTACK-5661 [VMware] DetachIsoCmd succeeds even though cdrom is locked by VM as cdrom is mounted DetachISO is succeeding even though detach opeartion is failing as cdrom is locked by VM as it was mounted inside VM. Detect if cdrom is locked or not. If locked fail detach operation and warn user to unmount before detaching the iso/cdrom device. Signed-off-by: Sateesh Chodapuneedi Conflicts: plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java --- .../hypervisor/vmware/resource/VmwareResource.java | 9 ++++++--- .../storage/resource/VmwareStorageProcessor.java | 8 +++++--- .../cloud/hypervisor/vmware/mo/VirtualMachineMO.java | 12 +++++++++++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index ade46d2876a..37ed0559a69 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -4945,9 +4945,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (cmd.isAttach()) { vmMo.mountToolsInstaller(); } else { - try { - vmMo.unmountToolsInstaller(); - } catch (Throwable e) { + try{ + if (!vmMo.unmountToolsInstaller()) { + return new Answer(cmd, false, + "Failed to unmount vmware-tools installer ISO as the corresponding CDROM device is locked by VM. Please unmount the CDROM device inside the VM and ret-try."); + } + }catch(Throwable e){ vmMo.detachIso(null); } } diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index abb673328d3..e13362d1331 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -1263,9 +1263,11 @@ public class VmwareStorageProcessor implements StorageProcessor { if (isAttach) { vmMo.mountToolsInstaller(); } else { - try { - vmMo.unmountToolsInstaller(); - } catch (Throwable e) { + try{ + if (!vmMo.unmountToolsInstaller()) { + return new AttachAnswer("Failed to unmount vmware-tools installer ISO as the corresponding CDROM device is locked by VM. Please unmount the CDROM device inside the VM and ret-try."); + } + } catch(Throwable e){ vmMo.detachIso(null); } } diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index b23b0ff6d07..8c5f0a6d255 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -2345,11 +2345,13 @@ public class VirtualMachineMO extends BaseMO { _context.getService().mountToolsInstaller(_mor); } - public void unmountToolsInstaller() throws Exception { + public boolean unmountToolsInstaller() throws Exception { int i = 1; // Monitor VM questions final Boolean[] flags = {false}; final VirtualMachineMO vmMo = this; + final boolean[] encounterQuestion = new boolean[1]; + encounterQuestion[0] = false; Future future = MonitorServiceExecutor.submit(new Runnable() { @Override public void run() { @@ -2360,6 +2362,7 @@ public class VirtualMachineMO extends BaseMO { VirtualMachineRuntimeInfo runtimeInfo = vmMo.getRuntimeInfo(); VirtualMachineQuestionInfo question = runtimeInfo.getQuestion(); if (question != null) { + encounterQuestion[0] = true; if (s_logger.isTraceEnabled()) { s_logger.trace("Question id: " + question.getId()); s_logger.trace("Question text: " + question.getText()); @@ -2425,6 +2428,13 @@ public class VirtualMachineMO extends BaseMO { flags[0] = true; future.cancel(true); } + if (encounterQuestion[0]) { + s_logger.warn("cdrom is locked by VM. Failed to detach the ISO."); + return false; + } else { + s_logger.info("Successfully unmounted tools installer from VM."); + return true; + } } public void redoRegistration(ManagedObjectReference morHost) throws Exception {