CLOUDSTACK-8112. CS allows creation of VM's with the same Display name when 
vm.instancename.flag is set to true.
Before registering a VM check if a different CS VM with same name exists in 
vCenter.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/33179cce
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/33179cce
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/33179cce

Branch: refs/heads/reporter
Commit: 33179cce56b15f0632e38afa260cb829bb2a2273
Parents: 6475323
Author: Likitha Shetty <[email protected]>
Authored: Mon Nov 10 10:58:11 2014 +0530
Committer: Likitha Shetty <[email protected]>
Committed: Tue Dec 23 13:48:01 2014 +0530

----------------------------------------------------------------------
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  3 ++
 .../vmware/resource/VmwareResource.java         | 19 ++++++++++--
 .../hypervisor/vmware/mo/DatacenterMO.java      | 32 ++++++++++++++++++++
 3 files changed, 52 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/33179cce/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java 
b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index caf374e..07b2277 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1074,6 +1074,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());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/33179cce/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
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 2e7553a..c2cf9e9 100644
--- 
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<String, String> 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 {
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/33179cce/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
----------------------------------------------------------------------
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 39a30be..38b1565 100644
--- 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<ObjectContent> ocs = getVmPropertiesOnDatacenterVmFolder(new 
String[] {"name", String.format("value[%d]", key)});
+        if (ocs != null && ocs.size() > 0) {
+            for (ObjectContent oc : ocs) {
+                List<DynamicProperty> 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<Pair<ManagedObjectReference, String>> getAllVmsOnDatacenter() 
throws Exception {
         List<Pair<ManagedObjectReference, String>> vms = new 
ArrayList<Pair<ManagedObjectReference, String>>();
 

Reply via email to