From 443c17579386b57a3b64ceb2c1a3e35c6d23c680 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 21 Oct 2011 18:44:14 -0700 Subject: [PATCH] bug 9614: enable SCSI device controller for root disk.(default root disk controller type can be conifgured through global configuration) --- .../vmware/resource/VmwareResource.java | 84 +++++++++++++------ .../src/com/cloud/configuration/Config.java | 1 + .../hypervisor/vmware/VmwareManagerImpl.java | 8 +- setup/db/db/schema-2212to2213.sql | 3 + .../vmware/mo/DiskControllerType.java | 6 ++ .../hypervisor/vmware/util/VmwareHelper.java | 5 -- 6 files changed, 77 insertions(+), 30 deletions(-) create mode 100644 vmware-base/src/com/cloud/hypervisor/vmware/mo/DiskControllerType.java diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 8feefbc082d..2b98db8e9d7 100755 --- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -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 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 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 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 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 validateVmDetails(Map vmDetails) { + Map validatedDetails = new HashMap(); + + if(vmDetails != null && vmDetails.size() > 0) { + for(Map.Entry 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); diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 57d88d1cf3e..1b5d052be12 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -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), diff --git a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java index 12cf8860406..886caaee46d 100755 --- a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java +++ b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java @@ -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 _storageMounts = new HashMap(); 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 diff --git a/setup/db/db/schema-2212to2213.sql b/setup/db/db/schema-2212to2213.sql index 8b97c9abfd7..713b32b31e3 100644 --- a/setup/db/db/schema-2212to2213.sql +++ b/setup/db/db/schema-2212to2213.sql @@ -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'); + diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/DiskControllerType.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DiskControllerType.java new file mode 100644 index 00000000000..d3ad30f8dd3 --- /dev/null +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/DiskControllerType.java @@ -0,0 +1,6 @@ +package com.cloud.hypervisor.vmware.mo; + +public enum DiskControllerType { + ide, + scsi +} diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java index da78ef5ef4c..f6dbf904cf8 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -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;