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()));
|
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) {
|
} catch (OperationTimedoutException e) {
|
||||||
s_logger.debug("Unable to send the start command to host " + dest.getHost());
|
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();
|
VirtualMachineTO vmSpec = cmd.getVirtualMachine();
|
||||||
|
boolean vmAlreadyExistsInVcenter = false;
|
||||||
|
|
||||||
Pair<String, String> names = composeVmNames(vmSpec);
|
Pair<String, String> names = composeVmNames(vmSpec);
|
||||||
String vmInternalCSName = names.first();
|
String vmInternalCSName = names.first();
|
||||||
@ -1335,6 +1336,17 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||||||
VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
|
VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
|
||||||
|
|
||||||
VmwareHypervisorHost hyperHost = getHyperHost(context);
|
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());
|
DiskTO[] disks = validateDisks(vmSpec.getDisks());
|
||||||
assert (disks.length > 0);
|
assert (disks.length > 0);
|
||||||
NicTO[] nics = vmSpec.getNics();
|
NicTO[] nics = vmSpec.getNics();
|
||||||
@ -1353,7 +1365,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||||||
throw new Exception(msg);
|
throw new Exception(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
DatacenterMO dcMo = new DatacenterMO(hyperHost.getContext(), hyperHost.getHyperHostDatacenter());
|
|
||||||
VirtualMachineDiskInfoBuilder diskInfoBuilder = null;
|
VirtualMachineDiskInfoBuilder diskInfoBuilder = null;
|
||||||
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
|
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
|
||||||
boolean hasSnapshot = false;
|
boolean hasSnapshot = false;
|
||||||
@ -1738,7 +1749,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||||||
|
|
||||||
String msg = "StartCommand failed due to " + VmwareHelper.getExceptionMessage(e);
|
String msg = "StartCommand failed due to " + VmwareHelper.getExceptionMessage(e);
|
||||||
s_logger.warn(msg, 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 {
|
} finally {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -125,6 +125,38 @@ public class DatacenterMO extends BaseMO {
|
|||||||
return list;
|
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 {
|
public List<Pair<ManagedObjectReference, String>> getAllVmsOnDatacenter() throws Exception {
|
||||||
List<Pair<ManagedObjectReference, String>> vms = new ArrayList<Pair<ManagedObjectReference, String>>();
|
List<Pair<ManagedObjectReference, String>> vms = new ArrayList<Pair<ManagedObjectReference, String>>();
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user