diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 0051cff843f..8c7388d342a 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1067,6 +1067,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } } s_logger.info("Unable to start VM on " + dest.getHost() + " due to " + (startAnswer == null ? " no start answer" : startAnswer.getDetails())); + if (startAnswer.getContextParam("stopRetry") != null) { + break; + } } catch (OperationTimedoutException e) { s_logger.debug("Unable to send the start command to host " + dest.getHost()); 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 4e71090e4db..9ad3a5f3067 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 @@ -1324,6 +1324,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } VirtualMachineTO vmSpec = cmd.getVirtualMachine(); + boolean vmAlreadyExistsInVcenter = false; Pair names = composeVmNames(vmSpec); String vmInternalCSName = names.first(); @@ -1335,6 +1336,17 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME); VmwareHypervisorHost hyperHost = getHyperHost(context); + DatacenterMO dcMo = new DatacenterMO(hyperHost.getContext(), hyperHost.getHyperHostDatacenter()); + + // Validate VM name is unique in Datacenter + VirtualMachineMO vmInVcenter = dcMo.checkIfVmAlreadyExistsInVcenter(vmNameOnVcenter, vmInternalCSName); + if(vmInVcenter != null) { + vmAlreadyExistsInVcenter = true; + String msg = "VM with name: " + vmNameOnVcenter +" already exists in vCenter."; + s_logger.error(msg); + throw new Exception(msg); + } + DiskTO[] disks = validateDisks(vmSpec.getDisks()); assert (disks.length > 0); NicTO[] nics = vmSpec.getNics(); @@ -1353,7 +1365,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa throw new Exception(msg); } - DatacenterMO dcMo = new DatacenterMO(hyperHost.getContext(), hyperHost.getHyperHostDatacenter()); VirtualMachineDiskInfoBuilder diskInfoBuilder = null; VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName); boolean hasSnapshot = false; @@ -1738,7 +1749,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa String msg = "StartCommand failed due to " + VmwareHelper.getExceptionMessage(e); s_logger.warn(msg, e); - return new StartAnswer(cmd, msg); + StartAnswer startAnswer = new StartAnswer(cmd, msg); + if(vmAlreadyExistsInVcenter) { + startAnswer.setContextParam("stopRetry", "true"); + } + return startAnswer; } finally { } } diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java index 39a30beadfb..38b1565ca20 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java @@ -125,6 +125,38 @@ public class DatacenterMO extends BaseMO { return list; } + public VirtualMachineMO checkIfVmAlreadyExistsInVcenter(String vmNameOnVcenter, String vmNameInCS) throws Exception { + int key = getCustomFieldKey("VirtualMachine", CustomFieldConstants.CLOUD_VM_INTERNAL_NAME); + if (key == 0) { + s_logger.warn("Custom field " + CustomFieldConstants.CLOUD_VM_INTERNAL_NAME + " is not registered ?!"); + } + + List ocs = getVmPropertiesOnDatacenterVmFolder(new String[] {"name", String.format("value[%d]", key)}); + if (ocs != null && ocs.size() > 0) { + for (ObjectContent oc : ocs) { + List props = oc.getPropSet(); + if (props != null) { + String vmVcenterName = null; + String vmInternalCSName = null; + for (DynamicProperty prop : props) { + if (prop.getName().equals("name")) { + vmVcenterName = prop.getVal().toString(); + } + if (prop.getName().startsWith("value[") && prop.getVal() != null) { + vmInternalCSName = ((CustomFieldStringValue)prop.getVal()).getValue(); + } + } + if (vmNameOnVcenter.equals(vmVcenterName)) { + if (vmInternalCSName != null && !vmInternalCSName.isEmpty() && !vmNameInCS.equals(vmInternalCSName)) { + return (new VirtualMachineMO(_context, oc.getObj())); + } + } + } + } + } + return null; + } + public List> getAllVmsOnDatacenter() throws Exception { List> vms = new ArrayList>();