mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	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. (cherry picked from commit 33179cce56b15f0632e38afa260cb829bb2a2273) Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
		
							parent
							
								
									b2fa91629e
								
							
						
					
					
						commit
						45d32234a6
					
				| @ -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()); | ||||
|  | ||||
| @ -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 { | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -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>>(); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user