CLOUDSTACK-3886: check in for review request https://reviews.apache.org/r/13008/

This commit is contained in:
Kelven Yang 2013-08-07 10:28:47 -07:00
parent 36d8a5631d
commit 9a2148ffc3
18 changed files with 354 additions and 178 deletions

View File

@ -884,6 +884,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
if (work == null || work.getStep() != Step.Prepare) {
throw new ConcurrentOperationException("Work steps have been changed: " + work);
}
_workDao.updateStep(work, Step.Starting);
_agentMgr.send(destHostId, cmds);

View File

@ -237,7 +237,6 @@ public class CloudOrchestrator implements OrchestrationService {
//load vm instance and offerings and call virtualMachineManagerImpl
VMInstanceVO vm = _vmDao.findByUuid(id);
Pair<DiskOffering, Long> rootDiskOffering = new Pair<DiskOffering, Long>(null, null);
ServiceOfferingVO offering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
rootDiskOffering.first(offering);

View File

@ -271,6 +271,7 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru {
// Determine the VM's OS description
GuestOSVO guestOS = _guestOsDao.findById(vm.getVirtualMachine().getGuestOSId());
to.setOs(guestOS.getDisplayName());
to.setHostName(vm.getHostName());
return to;
}

View File

@ -161,6 +161,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
int _portsPerDvPortGroup = 256;
boolean _nexusVSwitchActive;
boolean _fullCloneFlag;
boolean _instanceNameFlag;
String _serviceConsoleName;
String _managemetPortGroupName;
String _defaultSystemVmNicAdapterType = VirtualEthernetCardType.E1000.toString();
@ -231,6 +232,14 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
} else {
_fullCloneFlag = Boolean.parseBoolean(value);
}
value = _configDao.getValue(Config.SetVmInternalNameUsingDisplayName.key());
if (value == null) {
_instanceNameFlag = false;
} else {
_instanceNameFlag = Boolean.parseBoolean(value);
}
_portsPerDvPortGroup = NumbersUtil.parseInt(_configDao.getValue(Config.VmwarePortsPerDVPortGroup.key()), _portsPerDvPortGroup);
_serviceConsoleName = _configDao.getValue(Config.VmwareServiceConsole.key());
@ -505,6 +514,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
@Override
public void setupResourceStartupParams(Map<String, Object> params) {
params.put("vmware.create.full.clone", _fullCloneFlag);
params.put("vm.instancename.flag", _instanceNameFlag);
params.put("service.console.name", _serviceConsoleName);
params.put("management.portgroup.name", _managemetPortGroupName);
params.put("vmware.reserve.cpu", _reserveCpu);

View File

@ -314,47 +314,46 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
String prevBackupUuid = cmd.getPrevBackupUuid();
VirtualMachineMO workerVm=null;
String workerVMName = null;
String volumePath = cmd.getVolumePath();
ManagedObjectReference morDs = null;
DatastoreMO dsMo=null;
String volumePath = cmd.getVolumePath();
ManagedObjectReference morDs = null;
DatastoreMO dsMo=null;
// By default assume failure
String details = null;
boolean success = false;
String snapshotBackupUuid = null;
// By default assume failure
String details = null;
boolean success = false;
String snapshotBackupUuid = null;
VmwareContext context = hostService.getServiceContext(cmd);
VirtualMachineMO vmMo = null;
try {
VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, cmd);
morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getPool().getUuid());
VmwareContext context = hostService.getServiceContext(cmd);
VirtualMachineMO vmMo = null;
try {
VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, cmd);
morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getPool().getUuid());
try {
vmMo = hyperHost.findVmOnHyperHost(cmd.getVmName());
if (vmMo == null) {
if(s_logger.isDebugEnabled()) {
s_logger.debug("Unable to find owner VM for BackupSnapshotCommand on host " + hyperHost.getHyperHostName() + ", will try within datacenter");
}
try {
vmMo = hyperHost.findVmOnHyperHost(cmd.getVmName());
if (vmMo == null) {
if(s_logger.isDebugEnabled())
s_logger.debug("Unable to find owner VM for BackupSnapshotCommand on host " + hyperHost.getHyperHostName() + ", will try within datacenter");
vmMo = hyperHost.findVmOnPeerHyperHost(cmd.getVmName());
if(vmMo == null) {
dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
vmMo = hyperHost.findVmOnPeerHyperHost(cmd.getVmName());
if(vmMo == null) {
dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
workerVMName = hostService.getWorkerName(context, cmd, 0);
workerVMName = hostService.getWorkerName(context, cmd, 0);
// attach a volume to dummay wrapper VM for taking snapshot and exporting the VM for backup
if (!hyperHost.createBlankVm(workerVMName, 1, 512, 0, false, 4, 0, VirtualMachineGuestOsIdentifier.OTHER_GUEST.value(), morDs, false)) {
String msg = "Unable to create worker VM to execute BackupSnapshotCommand";
s_logger.error(msg);
throw new Exception(msg);
}
vmMo = hyperHost.findVmOnHyperHost(workerVMName);
if (vmMo == null) {
throw new Exception("Failed to find the newly create or relocated VM. vmName: " + workerVMName);
}
workerVm = vmMo;
// attach a volume to dummay wrapper VM for taking snapshot and exporting the VM for backup
if (!hyperHost.createBlankVm(workerVMName, null, 1, 512, 0, false, 4, 0, VirtualMachineGuestOsIdentifier.OTHER_GUEST.value(), morDs, false)) {
String msg = "Unable to create worker VM to execute BackupSnapshotCommand";
s_logger.error(msg);
throw new Exception(msg);
}
vmMo = hyperHost.findVmOnHyperHost(workerVMName);
if (vmMo == null) {
throw new Exception("Failed to find the newly create or relocated VM. vmName: " + workerVMName);
}
workerVm = vmMo;
// attach volume to worker VM
// attach volume to worker VM
String datastoreVolumePath = getVolumePathInDatastore(dsMo, volumePath + ".vmdk");
vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs);
}

View File

@ -365,6 +365,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
protected VmwareTrafficLabel _publicTrafficInfo = new VmwareTrafficLabel(TrafficType.Public);
protected int _portsPerDvPortGroup;
protected boolean _fullCloneFlag = false;
protected boolean _instanceNameFlag = false;
protected boolean _reserveCpu = false;
@ -2572,8 +2573,18 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
}
VirtualMachineTO vmSpec = cmd.getVirtualMachine();
String vmName = vmSpec.getName();
String vmInternalCSName = null;
String vmNameOnVcenter = null;
if (vmSpec.getHostName() != null) {
vmInternalCSName = vmSpec.getName();
if (_instanceNameFlag == true)
vmNameOnVcenter = vmSpec.getHostName();
else
vmNameOnVcenter = vmSpec.getName();
} else {
vmNameOnVcenter = vmInternalCSName = vmSpec.getName();
}
// Thus, vmInternalCSName always holds i-x-y, the cloudstack generated internal VM name.
State state = State.Stopped;
VmwareContext context = getServiceContext();
try {
@ -2581,12 +2592,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
// mark VM as starting state so that sync() can know not to report stopped too early
synchronized (_vms) {
_vms.put(vmName, State.Starting);
_vms.put(vmInternalCSName, State.Starting);
}
VirtualEthernetCardType nicDeviceType = VirtualEthernetCardType.valueOf(vmSpec.getDetails().get(VmDetailConstants.NIC_ADAPTER));
if(s_logger.isDebugEnabled())
s_logger.debug("VM " + vmName + " will be started with NIC device type: " + nicDeviceType);
s_logger.debug("VM " + vmInternalCSName + " will be started with NIC device type: " + nicDeviceType);
VmwareHypervisorHost hyperHost = getHyperHost(context);
DiskTO[] disks = validateDisks(vmSpec.getDisks());
@ -2600,9 +2611,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
throw new Exception(msg);
}
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName);
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
if (vmMo != null) {
s_logger.info("VM " + vmName + " already exists, tear down devices for reconfiguration");
s_logger.info("VM " + vmInternalCSName + " already exists, tear down devices for reconfiguration");
if (getVmState(vmMo) != State.Stopped)
vmMo.safePowerOff(_shutdown_waitMs);
vmMo.tearDownDevices(new Class<?>[] { VirtualDisk.class, VirtualEthernetCard.class });
@ -2611,13 +2622,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
ManagedObjectReference morDc = hyperHost.getHyperHostDatacenter();
assert (morDc != null);
vmMo = hyperHost.findVmOnPeerHyperHost(vmName);
vmMo = hyperHost.findVmOnPeerHyperHost(vmInternalCSName);
if (vmMo != null) {
if (s_logger.isInfoEnabled()) {
s_logger.info("Found vm " + vmName + " at other host, relocate to " + hyperHost.getHyperHostName());
s_logger.info("Found vm " + vmInternalCSName + " at other host, relocate to " + hyperHost.getHyperHostName());
}
takeVmFromOtherHyperHost(hyperHost, vmName);
takeVmFromOtherHyperHost(hyperHost, vmInternalCSName);
if (getVmState(vmMo) != State.Stopped)
vmMo.safePowerOff(_shutdown_waitMs);
@ -2634,16 +2645,16 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
}
assert (vmSpec.getMinSpeed() != null) && (rootDiskDataStoreDetails != null);
if (!hyperHost.createBlankVm(vmName, vmSpec.getCpus(), vmSpec.getMaxSpeed().intValue(),
if (!hyperHost.createBlankVm(vmNameOnVcenter, vmInternalCSName, vmSpec.getCpus(), vmSpec.getMaxSpeed().intValue(),
vmSpec.getMinSpeed(), vmSpec.getLimitCpuUse(),(int)(vmSpec.getMaxRam()/(1024*1024)), ramMb,
translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).value(), rootDiskDataStoreDetails.first(), false)) {
throw new Exception("Failed to create VM. vmName: " + vmName);
throw new Exception("Failed to create VM. vmName: " + vmInternalCSName);
}
}
vmMo = hyperHost.findVmOnHyperHost(vmName);
vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
if (vmMo == null) {
throw new Exception("Failed to find the newly create or relocated VM. vmName: " + vmName);
throw new Exception("Failed to find the newly create or relocated VM. vmName: " + vmInternalCSName);
}
}
@ -2931,10 +2942,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
String keyboardLayout = null;
if(vmSpec.getDetails() != null)
keyboardLayout = vmSpec.getDetails().get(VmDetailConstants.KEYBOARD);
vmConfigSpec.getExtraConfig().addAll(Arrays.asList(configureVnc(extraOptions.toArray(new OptionValue[0]), hyperHost, vmName, vmSpec.getVncPassword(), keyboardLayout)));
vmConfigSpec.getExtraConfig().addAll(Arrays.asList(configureVnc(extraOptions.toArray(new OptionValue[0]), hyperHost, vmInternalCSName, vmSpec.getVncPassword(), keyboardLayout)));
if (!vmMo.configureVm(vmConfigSpec)) {
throw new Exception("Failed to configure VM before start. vmName: " + vmName);
throw new Exception("Failed to configure VM before start. vmName: " + vmInternalCSName);
}
vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMask));
@ -3049,7 +3060,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
}
if (!vmMo.powerOn()) {
throw new Exception("Failed to start VM. vmName: " + vmName);
throw new Exception("Failed to start VM. vmName: " + vmInternalCSName + " with hostname " + vmNameOnVcenter);
}
state = State.Running;
@ -3066,9 +3077,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
} finally {
synchronized (_vms) {
if (state != State.Stopped) {
_vms.put(vmName, state);
_vms.put(vmInternalCSName, state);
} else {
_vms.remove(vmName);
_vms.remove(vmInternalCSName);
}
}
}
@ -3497,6 +3508,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
try {
HashMap<String, State> newStates = getVmStates();
// getVmNames should return all i-x-y values.
List<String> requestedVmNames = cmd.getVmNames();
List<String> vmNames = new ArrayList<String>();
@ -3558,6 +3570,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
s_logger.info("Executing resource StopCommand: " + _gson.toJson(cmd));
}
// In the stop command, we're passed in the name of the VM as seen by cloudstack,
// i.e., i-x-y. This is the internal VM name.
VmwareContext context = getServiceContext();
VmwareHypervisorHost hyperHost = getHyperHost(context);
try {
@ -5387,7 +5401,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
//createVMLinkedClone(vmTemplate, dcMo, dsMo, vmdkName, morDatastore, morPool);
if (!_fullCloneFlag) {
createVMLinkedClone(vmTemplate, dcMo, dsMo, vmdkName, morDatastore, morPool);
} else {
@ -5516,14 +5529,15 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
for(ObjectContent oc : ocs) {
List<DynamicProperty> props = oc.getPropSet();
if(props != null) {
String name = null;
String vmName = null;
String internalName = null;
boolean template = false;
VirtualMachinePowerState powerState = VirtualMachinePowerState.POWERED_OFF;
GregorianCalendar bootTime = null;
for(DynamicProperty prop : props) {
if(prop.getName().equals("name"))
name = prop.getVal().toString();
if (prop.getName().equals("name"))
vmName = prop.getVal().toString();
else if(prop.getName().equals("config.template"))
template = (Boolean)prop.getVal();
else if(prop.getName().equals("runtime.powerState"))
@ -5532,6 +5546,16 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
bootTime = (GregorianCalendar)prop.getVal();
}
VirtualMachineMO vmMo = new VirtualMachineMO(hyperHost.getContext(), oc.getObj());
// Check if vmMo has the custom property CLOUD_VM_INTERNAL_NAME set.
internalName = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_VM_INTERNAL_NAME);
String name = null;
if (internalName != null) {
name = internalName;
} else {
name = vmName;
}
if(!template && name.matches("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}")) {
boolean recycle = false;
@ -5544,7 +5568,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
if(recycle) {
s_logger.info("Recycle pending worker VM: " + name);
VirtualMachineMO vmMo = new VirtualMachineMO(hyperHost.getContext(), oc.getObj());
vmMo.powerOff();
vmMo.destroy();
}
@ -5963,6 +5986,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
private HashMap<String, State> getVmStates() throws Exception {
VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
// CLOUD_VM_INTERNAL_NAME stores the internal CS generated vm name. This was earlier stored in name. Now, name can be either the hostname or
// the internal CS name, but the custom field CLOUD_VM_INTERNAL_NAME always stores the internal CS name.
ObjectContent[] ocs = hyperHost.getVmPropertiesOnHyperHost(new String[] { "name", "runtime.powerState", "config.template" });
HashMap<String, State> newStates = new HashMap<String, State>();
@ -5973,20 +5998,26 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
boolean isTemplate = false;
String name = null;
String VMInternalCSName = null;
VirtualMachinePowerState powerState = VirtualMachinePowerState.POWERED_OFF;
for (DynamicProperty objProp : objProps) {
if (objProp.getName().equals("config.template")) {
if (objProp.getVal().toString().equalsIgnoreCase("true")) {
isTemplate = true;
}
} else if (objProp.getName().equals("name")) {
name = (String) objProp.getVal();
} else if (objProp.getName().equals("runtime.powerState")) {
powerState = (VirtualMachinePowerState) objProp.getVal();
} else if (objProp.getName().equals("name")) {
name = (String) objProp.getVal();
} else {
assert (false);
}
}
VirtualMachineMO vmMo = new VirtualMachineMO(hyperHost.getContext(), oc.getObj());
// Check if vmMo has the custom property CLOUD_VM_INTERNAL_NAME set.
VMInternalCSName = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_VM_INTERNAL_NAME);
if (VMInternalCSName != null)
name = VMInternalCSName;
if (!isTemplate) {
newStates.put(name, convertState(powerState));
@ -6025,16 +6056,26 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
String name = null;
String numberCPUs = null;
String maxCpuUsage = null;
String vmNameOnVcenter = null;
String vmInternalCSName = null;
for (DynamicProperty objProp : objProps) {
if (objProp.getName().equals("name")) {
name = objProp.getVal().toString();
vmNameOnVcenter = objProp.getVal().toString();
} else if (objProp.getName().equals("summary.config.numCpu")) {
numberCPUs = objProp.getVal().toString();
} else if (objProp.getName().equals("summary.quickStats.overallCpuUsage")) {
maxCpuUsage = objProp.getVal().toString();
}
}
VirtualMachineMO vmMo = new VirtualMachineMO(hyperHost.getContext(), oc.getObj());
// Check if vmMo has the custom property CLOUD_VM_INTERNAL_NAME set.
vmInternalCSName = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_VM_INTERNAL_NAME);
if (vmInternalCSName != null) {
name = vmInternalCSName;
} else {
name = vmNameOnVcenter;
}
if (!vmNames.contains(name)) {
continue;
@ -6343,6 +6384,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
} else {
_fullCloneFlag = false;
}
value = params.get("vm.instancename.flag").toString();
if (value != null && value.equalsIgnoreCase("true")) {
_instanceNameFlag = true;
} else {
_instanceNameFlag = false;
}
value = (String)params.get("scripts.timeout");
int timeout = NumbersUtil.parseInt(value, 1440) * 1000;
VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);

View File

@ -104,11 +104,11 @@ public class VmwareStorageProcessor implements StorageProcessor {
Integer shutdownWaitMs,
PremiumSecondaryStorageResource storageResource) {
this.hostService = hostService;
this._fullCloneFlag = fullCloneFlag;
_fullCloneFlag = fullCloneFlag;
this.mountService = mountService;
this._timeout = timeout;
_timeout = timeout;
this.resource = resource;
this._shutdown_waitMs = shutdownWaitMs;
_shutdown_waitMs = shutdownWaitMs;
_gson = GsonHelper.getGsonLogger();
}
@ -317,8 +317,8 @@ public class VmwareStorageProcessor implements StorageProcessor {
PrimaryDataStoreTO srcStore = (PrimaryDataStoreTO)template.getDataStore();
try {
VmwareContext context = this.hostService.getServiceContext(null);
VmwareHypervisorHost hyperHost = this.hostService.getHyperHost(context, null);
VmwareContext context = hostService.getServiceContext(null);
VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
VirtualMachineMO vmMo = null;
ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, primaryStore.getUuid());
@ -396,7 +396,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} catch (Throwable e) {
if (e instanceof RemoteException) {
s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
this.hostService.invalidateServiceContext(null);
hostService.invalidateServiceContext(null);
}
String msg = "clone volume from base image failed due to " + VmwareHelper.getExceptionMessage(e);
@ -1050,6 +1050,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
workerVMName = hostService.getWorkerName(context, cmd, 0);
vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName);
if (vmMo == null) {
throw new Exception("Failed to find the newly create or relocated VM. vmName: " + workerVMName);
}
@ -1069,7 +1070,6 @@ public class VmwareStorageProcessor implements StorageProcessor {
hostService.getWorkerName(context, cmd, 1));
success = (snapshotBackupUuid != null);
if (!success) {
details = "Failed to backUp the snapshot with uuid: " + snapshotUuid + " to secondary storage.";
return new CopyCmdAnswer(details);
@ -1132,7 +1132,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
VolumeObjectTO volumeTO = (VolumeObjectTO)disk.getData();
PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)volumeTO.getDataStore();
try {
VmwareHypervisorHost hyperHost = this.hostService.getHyperHost(this.hostService.getServiceContext(null), null);
VmwareHypervisorHost hyperHost = hostService.getHyperHost(hostService.getServiceContext(null), null);
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName);
if (vmMo == null) {
String msg = "Unable to find the VM to execute AttachVolumeCommand, vmName: " + vmName;
@ -1143,7 +1143,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
ManagedObjectReference morDs = null;
if (isAttach && isManaged) {
morDs = this.hostService.handleDatastoreAndVmdkAttach(cmd, iScsiName, storageHost, storagePort,
morDs = hostService.handleDatastoreAndVmdkAttach(cmd, iScsiName, storageHost, storagePort,
initiatorUsername, initiatorPassword, targetUsername, targetPassword);
}
else {
@ -1169,7 +1169,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
vmMo.detachDisk(datastoreVolumePath, false);
if (isManaged) {
this.hostService.handleDatastoreAndVmdkDetach(iScsiName, storageHost, storagePort);
hostService.handleDatastoreAndVmdkDetach(iScsiName, storageHost, storagePort);
}
}
@ -1177,7 +1177,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} catch (Throwable e) {
if (e instanceof RemoteException) {
s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
this.hostService.invalidateServiceContext(null);
hostService.invalidateServiceContext(null);
}
String msg = "AttachVolumeCommand failed due to " + VmwareHelper.getExceptionMessage(e);
@ -1194,7 +1194,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
String storeName = getSecondaryDatastoreUUID(storeUrl);
URI uri = new URI(storeUrl);
VmwareHypervisorHost hyperHost = this.hostService.getHyperHost(this.hostService.getServiceContext(null), null);
VmwareHypervisorHost hyperHost = hostService.getHyperHost(hostService.getServiceContext(null), null);
ManagedObjectReference morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), storeName.replace("-", ""));
if (morDatastore == null) {
@ -1206,7 +1206,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
private Answer attachIso(DiskTO disk, boolean isAttach, String vmName) {
try {
VmwareHypervisorHost hyperHost = this.hostService.getHyperHost(this.hostService.getServiceContext(null), null);
VmwareHypervisorHost hyperHost = hostService.getHyperHost(hostService.getServiceContext(null), null);
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName);
if (vmMo == null) {
String msg = "Unable to find VM in vSphere to execute AttachIsoCommand, vmName: " + vmName;
@ -1254,7 +1254,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
// TODO, check if iso is already attached, or if there is a previous
// attachment
DatastoreMO secondaryDsMo = new DatastoreMO(this.hostService.getServiceContext(null), morSecondaryDs);
DatastoreMO secondaryDsMo = new DatastoreMO(hostService.getServiceContext(null), morSecondaryDs);
String storeName = secondaryDsMo.getName();
String isoDatastorePath = String.format("[%s] %s/%s", storeName, isoStorePathFromRoot, isoFileName);
@ -1268,7 +1268,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} catch (Throwable e) {
if (e instanceof RemoteException) {
s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
this.hostService.invalidateServiceContext(null);
hostService.invalidateServiceContext(null);
}
if(isAttach) {
@ -1299,8 +1299,8 @@ public class VmwareStorageProcessor implements StorageProcessor {
PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)volume.getDataStore();
try {
VmwareContext context = this.hostService.getServiceContext(null);
VmwareHypervisorHost hyperHost = this.hostService.getHyperHost(context, null);
VmwareContext context = hostService.getServiceContext(null);
VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, primaryStore.getUuid());
@ -1312,8 +1312,8 @@ public class VmwareStorageProcessor implements StorageProcessor {
// create data volume
VirtualMachineMO vmMo = null;
String volumeUuid = UUID.randomUUID().toString().replace("-", "");
String volumeDatastorePath = dsMo.getDatastorePath(volumeUuid + ".vmdk");
String volumeDatastorePath = dsMo.getDatastorePath(volumeUuid + ".vmdk");
String dummyVmName = this.hostService.getWorkerName(context, cmd, 0);
try {
s_logger.info("Create worker VM " + dummyVmName);
@ -1344,7 +1344,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} catch (Throwable e) {
if (e instanceof RemoteException) {
s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
this.hostService.invalidateServiceContext(null);
hostService.invalidateServiceContext(null);
}
String msg = "create volume failed due to " + VmwareHelper.getExceptionMessage(e);
@ -1382,8 +1382,8 @@ public class VmwareStorageProcessor implements StorageProcessor {
*/
try {
VmwareContext context = this.hostService.getServiceContext(null);
VmwareHypervisorHost hyperHost = this.hostService.getHyperHost(context, null);
VmwareContext context = hostService.getServiceContext(null);
VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
VolumeObjectTO vol = (VolumeObjectTO)cmd.getData();
PrimaryDataStoreTO store = (PrimaryDataStoreTO)vol.getDataStore();
@ -1422,7 +1422,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
for (NetworkDetails netDetails : networks) {
if (netDetails.getGCTag() != null && netDetails.getGCTag().equalsIgnoreCase("true")) {
if (netDetails.getVMMorsOnNetwork() == null || netDetails.getVMMorsOnNetwork().length == 1) {
this.resource.cleanupNetwork(hostMo, netDetails);
resource.cleanupNetwork(hostMo, netDetails);
}
}
}
@ -1503,7 +1503,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} catch (Throwable e) {
if (e instanceof RemoteException) {
s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
this.hostService.invalidateServiceContext(null);
hostService.invalidateServiceContext(null);
}
String msg = "delete volume failed due to " + VmwareHelper.getExceptionMessage(e);

View File

@ -259,7 +259,8 @@ public enum Config {
EnableEC2API("Advanced", ManagementServer.class, Boolean.class, "enable.ec2.api", "false", "enable EC2 API on CloudStack", null),
EnableS3API("Advanced", ManagementServer.class, Boolean.class, "enable.s3.api", "false", "enable Amazon S3 API on CloudStack", null),
RecreateSystemVmEnabled("Advanced", ManagementServer.class, Boolean.class, "recreate.systemvm.enabled", "false", "If true, will recreate system vm root disk whenever starting system vm", "true,false"),
SetVmInternalNameUsingDisplayName("Advanced", ManagementServer.class, Boolean.class, "vm.instancename.flag", "false", "If true, will append guest VM's display Name (if set) to its internal instance name", "true,false"),
SetVmInternalNameUsingDisplayName("Advanced", ManagementServer.class, Boolean.class, "vm.instancename.flag", "false",
"If set to true, will set guest VM's name as it appears on the hypervisor, to its hostname", "true,false"),
IncorrectLoginAttemptsAllowed("Advanced", ManagementServer.class, Integer.class, "incorrect.login.attempts.allowed", "5", "Incorrect login attempts allowed before the user is disabled", null),
// Ovm
OvmPublicNetwork("Hidden", ManagementServer.class, String.class, "ovm.public.network.device", null, "Specify the public bridge on host for public network", null),

View File

@ -299,11 +299,6 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
return;
}
if(vm.getHypervisorType() == HypervisorType.VMware) {
s_logger.info("Skip HA for VMware VM " + vm.getInstanceName());
return;
}
if (!investigate) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("VM does not require investigation so I'm marking it as Stopped: " + vm.toString());
@ -342,6 +337,11 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
}
}
if(vm.getHypervisorType() == HypervisorType.VMware) {
s_logger.info("Skip HA for VMware VM " + vm.getInstanceName());
return;
}
List<HaWorkVO> items = _haDao.findPreviousHA(vm.getId());
int maxRetries = 0;
for (HaWorkVO item : items) {

View File

@ -1538,14 +1538,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
new UserVmStateListener(_usageEventDao, _networkDao, _nicDao));
value = _configDao.getValue(Config.SetVmInternalNameUsingDisplayName.key());
if(value == null) {
_instanceNameFlag = false;
}
else
{
_instanceNameFlag = Boolean.parseBoolean(value);
}
_instanceNameFlag = (value == null)?false:Boolean.parseBoolean(value);
_scaleRetry = NumbersUtil.parseInt(configs.get(Config.ScaleRetry.key()), 2);
@ -2716,58 +2709,59 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
long id = _vmDao.getNextInSequence(Long.class, "id");
String instanceName;
if (_instanceNameFlag && displayName != null) {
// Check if the displayName conforms to RFC standards.
checkNameForRFCCompliance(displayName);
instanceName = VirtualMachineName.getVmName(id, owner.getId(), displayName);
if (instanceName.length() > MAX_VM_NAME_LEN) {
throw new InvalidParameterValueException("Specified display name " + displayName + " causes VM name to exceed 80 characters in length");
}
// Search whether there is already an instance with the same instance name
// that is not in the destroyed or expunging state.
VMInstanceVO vm = _vmInstanceDao.findVMByInstanceName(instanceName);
if (vm != null && vm.getState() != VirtualMachine.State.Expunging) {
throw new InvalidParameterValueException("There already exists a VM by the display name supplied");
}
} else {
instanceName = VirtualMachineName.getVmName(id, owner.getId(), _instance);
if (hostName != null) {
// Check is hostName is RFC compliant
checkNameForRFCCompliance(hostName);
}
String instanceName = null;
String uuidName = UUID.randomUUID().toString();
// verify hostname information
if (hostName == null) {
hostName = uuidName;
} else {
//1) check is hostName is RFC compliant
checkNameForRFCCompliance(hostName);
// 2) hostName has to be unique in the network domain
Map<String, List<Long>> ntwkDomains = new HashMap<String, List<Long>>();
for (NetworkVO network : networkList) {
String ntwkDomain = network.getNetworkDomain();
if (!ntwkDomains.containsKey(ntwkDomain)) {
List<Long> ntwkIds = new ArrayList<Long>();
ntwkIds.add(network.getId());
ntwkDomains.put(ntwkDomain, ntwkIds);
if (_instanceNameFlag && hypervisor.equals(HypervisorType.VMware)) {
if (hostName == null) {
if (displayName != null) {
hostName = displayName;
} else {
List<Long> ntwkIds = ntwkDomains.get(ntwkDomain);
ntwkIds.add(network.getId());
ntwkDomains.put(ntwkDomain, ntwkIds);
hostName = uuidName;
}
}
} else {
if (hostName == null) {
hostName = uuidName;
}
}
for (String ntwkDomain : ntwkDomains.keySet()) {
for (Long ntwkId : ntwkDomains.get(ntwkDomain)) {
// * get all vms hostNames in the network
List<String> hostNames = _vmInstanceDao
.listDistinctHostNames(ntwkId);
// * verify that there are no duplicates
if (hostNames.contains(hostName)) {
throw new InvalidParameterValueException("The vm with hostName " + hostName
+ " already exists in the network domain: " + ntwkDomain + "; network="
+ _networkModel.getNetwork(ntwkId));
}
instanceName = VirtualMachineName.getVmName(id, owner.getId(), _instance);
// Check if VM with instanceName already exists.
VMInstanceVO vmObj = _vmInstanceDao.findVMByInstanceName(instanceName);
if (vmObj != null && vmObj.getState() != VirtualMachine.State.Expunging) {
throw new InvalidParameterValueException("There already exists a VM by the display name supplied");
}
// Check that hostName is unique in the network domain
Map<String, List<Long>> ntwkDomains = new HashMap<String, List<Long>>();
for (NetworkVO network : networkList) {
String ntwkDomain = network.getNetworkDomain();
if (!ntwkDomains.containsKey(ntwkDomain)) {
List<Long> ntwkIds = new ArrayList<Long>();
ntwkIds.add(network.getId());
ntwkDomains.put(ntwkDomain, ntwkIds);
} else {
List<Long> ntwkIds = ntwkDomains.get(ntwkDomain);
ntwkIds.add(network.getId());
ntwkDomains.put(ntwkDomain, ntwkIds);
}
}
for (String ntwkDomain : ntwkDomains.keySet()) {
for (Long ntwkId : ntwkDomains.get(ntwkDomain)) {
// * get all vms hostNames in the network
List<String> hostNames = _vmInstanceDao.listDistinctHostNames(ntwkId);
// * verify that there are no duplicates
if (hostNames.contains(hostName)) {
throw new InvalidParameterValueException("The vm with hostName " + hostName
+ " already exists in the network domain: " + ntwkDomain + "; network="
+ _networkModel.getNetwork(ntwkId));
}
}
}

View File

@ -285,7 +285,7 @@ CREATE TABLE `cloud`.`load_balancer_healthcheck_policies` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.instancename.flag', 'false', 'Append guest VM display Name (if set) to the internal name of the VM');
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.instancename.flag', 'false', 'If set to true, will set guest VM\'s name as it appears on the hypervisor, to its hostname');
UPDATE `cloud`.`guest_os` SET category_id=10 where id=59;
INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (165, UUID(), 6, 'Windows 8 (32-bit)');

View File

@ -270,7 +270,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
}
@Override
public boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB,
public boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB,
String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
if(s_logger.isTraceEnabled())
@ -278,7 +278,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
+ ", cpuSpeedMhz: " + cpuSpeedMHz + ", cpuReservedMHz: " + cpuReservedMHz + ", limitCpu: " + limitCpuUse + ", memoryMB: " + memoryMB
+ ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.getValue() + ", snapshotDirToParent: " + snapshotDirToParent);
boolean result = HypervisorHostHelper.createBlankVm(this, vmName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse,
boolean result = HypervisorHostHelper.createBlankVm(this, vmName, vmInternalCSName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse,
memoryMB, memoryReserveMB, guestOsIdentifier, morDs, snapshotDirToParent);
if(s_logger.isTraceEnabled())

View File

@ -22,4 +22,5 @@ public interface CustomFieldConstants {
public final static String CLOUD_GC_DVP = "cloud.gc.dvp";
public final static String CLOUD_NIC_MASK = "cloud.nic.mask";
public final static String CLOUD_ZONE = "cloud.zone";
public final static String CLOUD_VM_INTERNAL_NAME = "cloud.vm.internal.name";
}

View File

@ -17,15 +17,19 @@
package com.cloud.hypervisor.vmware.mo;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.apache.xerces.impl.xs.identity.Selector.Matcher;
import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.hypervisor.vmware.util.VmwareHelper;
import com.cloud.utils.Pair;
import com.cloud.utils.exception.CloudRuntimeException;
import com.google.gson.Gson;
import com.vmware.vim25.AboutInfo;
import com.vmware.vim25.AlreadyExistsFaultMsg;
@ -57,6 +61,7 @@ import com.vmware.vim25.PropertyFilterSpec;
import com.vmware.vim25.PropertySpec;
import com.vmware.vim25.TraversalSpec;
import com.vmware.vim25.VirtualMachineConfigSpec;
import com.vmware.vim25.VirtualMachinePowerState;
import com.vmware.vim25.VirtualNicManagerNetConfig;
import com.vmware.vim25.NasDatastoreInfo;
@ -65,6 +70,7 @@ import java.util.Arrays;
public class HostMO extends BaseMO implements VmwareHypervisorHost {
private static final Logger s_logger = Logger.getLogger(HostMO.class);
Map<String, VirtualMachineMO> _vmCache = new HashMap<String, VirtualMachineMO>();
//Map<String, String> _vmInternalNameMapCache = new HashMap<String, String>();
public HostMO (VmwareContext context, ManagedObjectReference morHost) {
super(context, morHost);
@ -465,19 +471,34 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
}
@Override
public synchronized VirtualMachineMO findVmOnHyperHost(String name) throws Exception {
public synchronized VirtualMachineMO findVmOnHyperHost(String vmName) throws Exception {
if(s_logger.isDebugEnabled())
s_logger.debug("find VM " + name + " on host");
s_logger.debug("find VM " + vmName + " on host");
VirtualMachineMO vmMo = _vmCache.get(name);
VirtualMachineMO vmMo = _vmCache.get(vmName);
if(vmMo != null) {
if(s_logger.isDebugEnabled())
s_logger.debug("VM " + name + " found in host cache");
s_logger.debug("VM " + vmName + " found in host cache");
return vmMo;
}
s_logger.info("VM " + vmName + " not found in host cache");
loadVmCache();
return _vmCache.get(name);
return _vmCache.get(vmName);
}
private boolean isUserVMInternalCSName(String vmInternalCSName) {
// CS generated internal names for user VMs are always of the format i-x-y.
String internalCSUserVMNamingPattern = "^[i][-][0-9]+[-][0-9]+[-]";
Pattern p = Pattern.compile(internalCSUserVMNamingPattern);
java.util.regex.Matcher m = p.matcher(vmInternalCSName);
if (m.find()) {
return true;
} else {
return false;
}
}
private void loadVmCache() throws Exception {
@ -486,15 +507,35 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
_vmCache.clear();
// name is the name of the VM as it appears in vCenter. The CLOUD_VM_INTERNAL_NAME custom
// field value contains the name of the VM as it is maintained internally by cloudstack (i-x-y).
ObjectContent[] ocs = getVmPropertiesOnHyperHost(new String[] { "name" });
if(ocs != null && ocs.length > 0) {
for(ObjectContent oc : ocs) {
String vmName = oc.getPropSet().get(0).getVal().toString();
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();
}
}
VirtualMachineMO vmMo = new VirtualMachineMO(_context, oc.getObj());
// Check if vmMo has the custom property CLOUD_VM_INTERNAL_NAME set.
vmInternalCSName = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_VM_INTERNAL_NAME);
String vmName = null;
if (vmInternalCSName != null && isUserVMInternalCSName(vmInternalCSName)) {
vmName = vmInternalCSName;
} else {
vmName = vmVcenterName;
}
if(s_logger.isTraceEnabled())
s_logger.trace("put " + vmName + " into host cache");
if(s_logger.isTraceEnabled())
s_logger.trace("put " + vmName + " into host cache");
_vmCache.put(vmName, new VirtualMachineMO(_context, oc.getObj()));
_vmCache.put(vmName, new VirtualMachineMO(_context, oc.getObj()));
}
}
}
}
@ -530,33 +571,38 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
} else {
s_logger.error("VMware createVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
}
return false;
}
public HashMap<String, Integer> getVmVncPortsOnHost() throws Exception {
ObjectContent[] ocs = getVmPropertiesOnHyperHost(
new String[] { "name", "config.extraConfig[\"RemoteDisplay.vnc.port\"]" }
);
new String[] { "name", "config.extraConfig[\"RemoteDisplay.vnc.port\"]" }
);
HashMap<String, Integer> portInfo = new HashMap<String, Integer>();
if(ocs != null && ocs.length > 0) {
for(ObjectContent oc : ocs) {
List<DynamicProperty> objProps = oc.getPropSet();
if(objProps != null) {
String name = null;
String vmName = null;
String value = null;
String vmInternalCSName = null;
for(DynamicProperty objProp : objProps) {
if(objProp.getName().equals("name")) {
name = (String)objProp.getVal();
} else {
OptionValue optValue = (OptionValue)objProp.getVal();
value = (String)optValue.getValue();
}
}
vmName = (String)objProp.getVal();
} else {
OptionValue optValue = (OptionValue)objProp.getVal();
value = (String)optValue.getValue();
}
}
VirtualMachineMO vmMo = new VirtualMachineMO(_context, oc.getObj());
// Check if vmMo has the custom property CLOUD_VM_INTERNAL_NAME set.
vmInternalCSName = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_VM_INTERNAL_NAME);
if (vmInternalCSName != null && isUserVMInternalCSName(vmInternalCSName))
vmName = vmInternalCSName;
if(name != null && value != null) {
portInfo.put(name, Integer.parseInt(value));
if(vmName != null && value != null) {
portInfo.put(vmName, Integer.parseInt(value));
}
}
}
@ -689,7 +735,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
}
@Override
public boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB,
public boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB,
String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
if(s_logger.isTraceEnabled())
@ -697,7 +743,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
+ ", cpuSpeedMhz: " + cpuSpeedMHz + ", cpuReservedMHz: " + cpuReservedMHz + ", limitCpu: " + limitCpuUse + ", memoryMB: " + memoryMB
+ ", guestOS: " + guestOsIdentifier + ", datastore: " + morDs.getValue() + ", snapshotDirToParent: " + snapshotDirToParent);
boolean result = HypervisorHostHelper.createBlankVm(this, vmName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse,
boolean result = HypervisorHostHelper.createBlankVm(this, vmName, vmInternalCSName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse,
memoryMB, memoryReserveMB, guestOsIdentifier, morDs, snapshotDirToParent);
if(s_logger.isTraceEnabled())

View File

@ -46,6 +46,7 @@ import com.vmware.vim25.HttpNfcLeaseState;
import com.vmware.vim25.LongPolicy;
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.ObjectContent;
import com.vmware.vim25.OptionValue;
import com.vmware.vim25.OvfCreateImportSpecParams;
import com.vmware.vim25.OvfCreateImportSpecResult;
import com.vmware.vim25.OvfFileItem;
@ -94,10 +95,27 @@ public class HypervisorHostHelper {
if(ocs != null && ocs.length > 0) {
for(ObjectContent oc : ocs) {
DynamicProperty prop = oc.getPropSet().get(0);
assert(prop != null);
if(prop.getVal().toString().equals(name))
return new VirtualMachineMO(context, oc.getObj());
String vmNameInvCenter = null;
String vmInternalCSName = null;
List<DynamicProperty> objProps = oc.getPropSet();
if(objProps != null) {
for(DynamicProperty objProp : objProps) {
if(objProp.getName().equals("name")) {
vmNameInvCenter = (String)objProp.getVal();
}
VirtualMachineMO vmMo = new VirtualMachineMO(context, oc.getObj());
// Check if vmMo has the custom property CLOUD_VM_INTERNAL_NAME set.
try {
vmInternalCSName = vmMo.getCustomFieldValue(CustomFieldConstants.CLOUD_VM_INTERNAL_NAME);
} catch (Exception e) {
s_logger.error("Unable to retrieve custom field value for internal VM name");
}
if ( (vmNameInvCenter != null && name.equalsIgnoreCase(vmNameInvCenter))
|| (vmInternalCSName != null && name.equalsIgnoreCase(vmInternalCSName)) ) {
return vmMo;
}
}
}
}
}
return null;
@ -1122,7 +1140,7 @@ public class HypervisorHostHelper {
return morNetwork;
}
public static boolean createBlankVm(VmwareHypervisorHost host, String vmName,
public static boolean createBlankVm(VmwareHypervisorHost host, String vmName, String vmInternalCSName,
int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB, String guestOsIdentifier,
ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
@ -1132,6 +1150,9 @@ public class HypervisorHostHelper {
// VM config basics
VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec();
vmConfig.setName(vmName);
if (vmInternalCSName == null)
vmInternalCSName = vmName;
VmwareHelper.setBasicVmConfig(vmConfig, cpuCount, cpuSpeedMHz, cpuReservedMHz, memoryMB, memoryReserveMB, guestOsIdentifier, limitCpuUse);
// Scsi controller
@ -1159,16 +1180,25 @@ public class HypervisorHostHelper {
vmConfig.getDeviceChange().add(scsiControllerSpec);
vmConfig.getDeviceChange().add(videoDeviceSpec);
if(host.createVm(vmConfig)) {
// Here, when attempting to find the VM, we need to use the name
// with which we created it. This is the only such place where
// we need to do this. At all other places, we always use the
// VM's internal cloudstack generated name. Here, we cannot use
// the internal name because we can set the internal name into the
// VM's custom field CLOUD_VM_INTERNAL_NAME only after we create
// the VM.
VirtualMachineMO vmMo = host.findVmOnHyperHost(vmName);
assert(vmMo != null);
vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_VM_INTERNAL_NAME, vmInternalCSName);
int ideControllerKey = -1;
while(ideControllerKey < 0) {
ideControllerKey = vmMo.tryGetIDEDeviceControllerKey();
if(ideControllerKey >= 0)
break;
s_logger.info("Waiting for IDE controller be ready in VM: " + vmName);
s_logger.info("Waiting for IDE controller be ready in VM: " + vmInternalCSName);
Thread.sleep(1000);
}

View File

@ -1566,7 +1566,7 @@ public class VirtualMachineMO extends BaseMO {
HostMO hostMo = getRunningHost();
VirtualMachineConfigInfo vmConfigInfo = getConfigInfo();
if(!hostMo.createBlankVm(clonedVmName, 1, cpuSpeedMHz, 0, false, memoryMb, 0, vmConfigInfo.getGuestId(), morDs, false))
if(!hostMo.createBlankVm(clonedVmName, null, 1, cpuSpeedMHz, 0, false, memoryMb, 0, vmConfigInfo.getGuestId(), morDs, false))
throw new Exception("Unable to create a blank VM");
VirtualMachineMO clonedVmMo = hostMo.findVmOnHyperHost(clonedVmName);

View File

@ -46,7 +46,7 @@ public interface VmwareHypervisorHost {
VirtualMachineMO findVmOnPeerHyperHost(String name) throws Exception;
boolean createVm(VirtualMachineConfigSpec vmSpec) throws Exception;
boolean createBlankVm(String vmName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB,
boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB, int memoryReserveMB,
String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception;
void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption) throws Exception;

View File

@ -0,0 +1,45 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.hypervisor.vmware.mo;
import com.cloud.hypervisor.vmware.util.VmwareContext;
public class VmwareMOTest {
public static void main(String args[]) {
try {
/*
VmwareContext context = TestVmwareContextFactory.create("10.223.80.29", "Administrator", "Suite219");
DatacenterMO dcMo = new DatacenterMO(context, "vsphere5");
HostMO hostMo = new HostMO(context, dcMo.findHost("10.223.80.27"));
DatastoreMO dsMo = new DatastoreMO(context, dcMo.findDatastore("Storage1"));
hostMo.importVmFromOVF("/tmp/ubuntu-12.04.1-desktop-i386-nest-13.02.04.ovf", "Test123", dsMo, "thin");
VirtualMachineMO vmMo = dcMo.findVm("i-2-3-VM");
Thread.sleep(10*60000);
vmMo.removeAllSnapshots();
*/
} catch (Exception e) {
e.printStackTrace();
}
}
}