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 {