mirror of https://github.com/apache/cloudstack.git
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:
parent
871f1bb6d4
commit
443c175793
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
package com.cloud.hypervisor.vmware.mo;
|
||||
|
||||
public enum DiskControllerType {
|
||||
ide,
|
||||
scsi
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue