bug 9614: enable SCSI device controller for root disk.(default root disk controller type can be conifgured through global configuration)

This commit is contained in:
Kelven Yang 2011-10-21 18:44:14 -07:00
parent 871f1bb6d4
commit 443c175793
6 changed files with 77 additions and 30 deletions

View File

@ -145,6 +145,7 @@ import com.cloud.hypervisor.vmware.mo.CustomFieldConstants;
import com.cloud.hypervisor.vmware.mo.CustomFieldsManagerMO;
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
import com.cloud.hypervisor.vmware.mo.DatastoreMO;
import com.cloud.hypervisor.vmware.mo.DiskControllerType;
import com.cloud.hypervisor.vmware.mo.HostFirewallSystemMO;
import com.cloud.hypervisor.vmware.mo.HostMO;
import com.cloud.hypervisor.vmware.mo.HostVirtualNicType;
@ -254,6 +255,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
protected float _memOverprovisioningFactor = 1;
protected boolean _reserveMem = false;
protected DiskControllerType _rootDiskController = DiskControllerType.scsi;
protected ManagedObjectReference _morHyperHost;
protected VmwareContext _serviceContext;
@ -764,8 +766,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
nicMasks &= ~(1 << publicNicInfo.first().intValue());
vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, String.valueOf(nicMasks));
// vmMo.tearDownDevice(publicNicInfo.second());
HostMO hostMo = vmMo.getRunningHost();
List<NetworkDetails> networks = vmMo.getNetworksWithDetails();
for (NetworkDetails netDetails : networks) {
@ -819,13 +819,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
throw e;
}
/*
// Note: public NIC is plugged inside system VM
VirtualDevice nic = VmwareHelper.prepareNicDevice(vmMo, networkInfo.first(), VirtualEthernetCardType.Vmxnet3,
networkInfo.second(), vifMacAddress, -1, 1, true, true);
vmMo.plugDevice(nic);
*/
}
private int allocPublicNicIndex(VirtualMachineMO vmMo) throws Exception {
@ -1367,12 +1360,15 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
for (VolumeTO vol : disks) {
deviceConfigSpecArray[i] = new VirtualDeviceConfigSpec();
if (vol.getType() == Volume.Type.ROOT || vol.getType() == Volume.Type.ISO) {
controllerKey = ideControllerKey;
} else {
controllerKey = scsiControllerKey;
}
if (vol.getType() == Volume.Type.ISO) {
controllerKey = ideControllerKey;
} else {
if(_rootDiskController == DiskControllerType.scsi)
controllerKey = scsiControllerKey;
else
controllerKey = ideControllerKey;
}
if (vol.getType() != Volume.Type.ISO) {
Pair<ManagedObjectReference, DatastoreMO> volumeDsDetails = dataStoresDetails.get(vol.getPoolUuid());
@ -1433,20 +1429,30 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
vmConfigSpec.setDeviceChange(deviceConfigSpecArray);
// pass boot arguments through machine.id
OptionValue[] machineIdOptions = new OptionValue[2];
machineIdOptions[0] = new OptionValue();
machineIdOptions[0].setKey("machine.id");
machineIdOptions[0].setValue(vmSpec.getBootArgs());
// pass boot arguments through machine.id & perform customized options to VMX
Map<String, String> vmDetailOptions = validateVmDetails(vmSpec.getDetails());
OptionValue[] extraOptions = new OptionValue[2 + vmDetailOptions.size()];
extraOptions[0] = new OptionValue();
extraOptions[0].setKey("machine.id");
extraOptions[0].setValue(vmSpec.getBootArgs());
machineIdOptions[1] = new OptionValue();
machineIdOptions[1].setKey("devices.hotplug");
machineIdOptions[1].setValue("true");
extraOptions[1] = new OptionValue();
extraOptions[1].setKey("devices.hotplug");
extraOptions[1].setValue("true");
int j = 2;
for(Map.Entry<String, String> entry : vmDetailOptions.entrySet()) {
extraOptions[j] = new OptionValue();
extraOptions[j].setKey(entry.getKey());
extraOptions[j].setValue(entry.getValue());
j++;
}
String keyboardLayout = null;
if(vmSpec.getDetails() != null)
keyboardLayout = vmSpec.getDetails().get(VmDetailConstants.KEYBOARD);
vmConfigSpec.setExtraConfig(configureVnc(machineIdOptions, hyperHost, vmName, vmSpec.getVncPassword(), keyboardLayout));
vmConfigSpec.setExtraConfig(configureVnc(extraOptions, hyperHost, vmName, vmSpec.getVncPassword(), keyboardLayout));
if (!vmMo.configureVm(vmConfigSpec)) {
throw new Exception("Failed to configure VM before start. vmName: " + vmName);
@ -1478,6 +1484,30 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
}
}
}
}
private Map<String, String> validateVmDetails(Map<String, String> vmDetails) {
Map<String, String> validatedDetails = new HashMap<String, String>();
if(vmDetails != null && vmDetails.size() > 0) {
for(Map.Entry<String, String> entry : vmDetails.entrySet()) {
if("machine.id".equalsIgnoreCase(entry.getKey()))
continue;
else if("devices.hotplug".equalsIgnoreCase(entry.getKey()))
continue;
else if("RemoteDisplay.vnc.enabled".equalsIgnoreCase(entry.getKey()))
continue;
else if("RemoteDisplay.vnc.password".equalsIgnoreCase(entry.getKey()))
continue;
else if("RemoteDisplay.vnc.port".equalsIgnoreCase(entry.getKey()))
continue;
else if("RemoteDisplay.vnc.keymap".equalsIgnoreCase(entry.getKey()))
continue;
else
validatedDetails.put(entry.getKey(), entry.getValue());
}
}
return validatedDetails;
}
private int getReserveCpuMHz(int cpuMHz) {
@ -3857,6 +3887,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
_privateNetworkVSwitchName = (String) params.get("private.network.vswitch.name");
_publicNetworkVSwitchName = (String) params.get("public.network.vswitch.name");
_guestNetworkVSwitchName = (String) params.get("guest.network.vswitch.name");
value = (String)params.get("vmware.root.disk.controller");
if(value != null && value.equalsIgnoreCase("scsi"))
_rootDiskController = DiskControllerType.scsi;
else
_rootDiskController = DiskControllerType.ide;
s_logger.info("VmwareResource network configuration info. private vSwitch: " + _privateNetworkVSwitchName + ", public vSwitch: " + _publicNetworkVSwitchName + ", guest network: "
+ _guestNetworkVSwitchName);

View File

@ -237,6 +237,7 @@ public enum Config {
VmwarePerClusterHostMax("Advanced", ManagementServer.class, Integer.class, "vmware.percluster.host.max", "8", "maxmium hosts per vCenter cluster(do not let it grow over 8)", "1-8"),
VmwareReserveCpu("Advanced", ManagementServer.class, Boolean.class, "vmware.reserve.cpu", "false", "Specify whether or not to reserve CPU based on CPU overprovisioning factor", null),
VmwareReserveMem("Advanced", ManagementServer.class, Boolean.class, "vmware.reserve.mem", "false", "Specify whether or not to reserve memory based on memory overprovisioning factor", null),
VmwareRootDiskControllerType("Advanced", ManagementServer.class, String.class, "vmware.root.disk.controller", "scsi", "Specify the default disk controller for root volumes, valid values are scsi, ide", null),
// KVM
KvmPublicNetwork("Advanced", ManagementServer.class, String.class, "kvm.public.network.device", null, "Specify the public bridge on host for public network", null),

View File

@ -48,6 +48,7 @@ import com.cloud.hypervisor.vmware.manager.VmwareManager;
import com.cloud.hypervisor.vmware.manager.VmwareStorageManager;
import com.cloud.hypervisor.vmware.manager.VmwareStorageManagerImpl;
import com.cloud.hypervisor.vmware.manager.VmwareStorageMount;
import com.cloud.hypervisor.vmware.mo.DiskControllerType;
import com.cloud.hypervisor.vmware.mo.HostFirewallSystemMO;
import com.cloud.hypervisor.vmware.mo.HostMO;
import com.cloud.hypervisor.vmware.mo.HostVirtualNicType;
@ -121,6 +122,8 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis
String _memOverprovisioningFactor = "1";
String _reserveMem = "false";
String _rootDiskController = DiskControllerType.scsi.toString();
Map<String, String> _storageMounts = new HashMap<String, String>();
Random _rand = new Random(System.currentTimeMillis());
@ -244,7 +247,9 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis
if(_reserveMem == null || _reserveMem.isEmpty())
_reserveMem = "false";
_rootDiskController = configDao.getValue(Config.VmwareRootDiskControllerType.key());
if(_rootDiskController == null || _rootDiskController.isEmpty())
_rootDiskController = DiskControllerType.scsi.toString();
s_logger.info("Additional VNC port allocation range is settled at " + _additionalPortRangeStart + " to " + (_additionalPortRangeStart + _additionalPortRangeSize));
@ -464,6 +469,7 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis
params.put("vmware.reserve.cpu", _reserveCpu);
params.put("mem.overprovisioning.factor", _memOverprovisioningFactor);
params.put("vmware.reserve.mem", _reserveMem);
params.put("vmware.root.disk.controller", _rootDiskController);
}
@Override

View File

@ -50,3 +50,6 @@ UPDATE guest_os_hypervisor SET guest_os_name='Red Hat Enterprise Linux 4.5(32-bi
UPDATE guest_os_hypervisor SET guest_os_name='Red Hat Enterprise Linux 4.6(32-bit)' WHERE hypervisor_type='VmWare' AND guest_os_id=27;
UPDATE guest_os_hypervisor SET guest_os_name='Red Hat Enterprise Linux 4.7(32-bit)' WHERE hypervisor_type='VmWare' AND guest_os_id=28;
UPDATE guest_os_hypervisor SET guest_os_name='Red Hat Enterprise Linux 4.8(32-bit)' WHERE hypervisor_type='VmWare' AND guest_os_id=29;
INSERT IGNORE INTO configuration VALUES ('Advanced', 'DEFAULT', 'management-server', 'vmware.root.disk.controller', 'scsi', 'Specify the default disk controller for root volumes, valid values are scsi, ide');

View File

@ -0,0 +1,6 @@
package com.cloud.hypervisor.vmware.mo;
public enum DiskControllerType {
ide,
scsi
}

View File

@ -94,11 +94,6 @@ public class VmwareHelper {
nic.setConnectable(connectInfo);
nic.setMacAddress(macAddress);
/*
nic.setControllerKey(vmMo.getPCIDeviceControllerKey());
if(deviceNumber < 0)
deviceNumber = vmMo.getNextPCIDeviceNumber();
*/
nic.setUnitNumber(deviceNumber);
nic.setKey(-contextNumber);
return nic;