From 309da6a57f202322b71dca98b5695dfb278447a8 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Tue, 15 Sep 2015 15:35:38 +0530 Subject: [PATCH] CLOUDSTACK-8854: Apple Mac OS/X VM get created without USB controller in ESXi hypervisors --- .../vmware/resource/VmwareResource.java | 24 +++++++++++++++++++ .../vmware/mo/HypervisorHostHelper.java | 13 ++++++++++ .../hypervisor/vmware/util/VmwareHelper.java | 10 ++++++++ 3 files changed, 47 insertions(+) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 1ec859bff3d..2c4b605354b 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -80,6 +80,7 @@ import com.vmware.vim25.VirtualDevice; import com.vmware.vim25.VirtualDeviceBackingInfo; import com.vmware.vim25.VirtualDeviceConfigSpec; import com.vmware.vim25.VirtualDeviceConfigSpecOperation; +import com.vmware.vim25.VirtualUSBController; import com.vmware.vim25.VirtualDisk; import com.vmware.vim25.VirtualDiskFlatVer2BackingInfo; import com.vmware.vim25.VirtualEthernetCard; @@ -1872,6 +1873,29 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } } + // + // Setup USB devices + // + if (guestOsId.startsWith("darwin")) { //Mac OS + VirtualDevice[] devices = vmMo.getMatchedDevices(new Class[] {VirtualUSBController.class}); + if (devices.length == 0) { + s_logger.debug("No USB Controller device on VM Start. Add USB Controller device for Mac OS VM " + vmInternalCSName); + + //For Mac OS X systems, the EHCI+UHCI controller is enabled by default and is required for USB mouse and keyboard access. + VirtualDevice usbControllerDevice = VmwareHelper.prepareUSBControllerDevice(); + deviceConfigSpecArray[i] = new VirtualDeviceConfigSpec(); + deviceConfigSpecArray[i].setDevice(usbControllerDevice); + deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.ADD); + + if (s_logger.isDebugEnabled()) + s_logger.debug("Prepare USB controller at new device " + _gson.toJson(deviceConfigSpecArray[i])); + + i++; + } else { + s_logger.debug("USB Controller device exists on VM Start for Mac OS VM " + vmInternalCSName); + } + } + // // Setup NIC devices // diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java index fc27d1f8e43..fb63b1218b4 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java @@ -77,6 +77,7 @@ import com.vmware.vim25.VMwareDVSPvlanConfigSpec; import com.vmware.vim25.VMwareDVSPvlanMapEntry; import com.vmware.vim25.VirtualBusLogicController; import com.vmware.vim25.VirtualController; +import com.vmware.vim25.VirtualDevice; import com.vmware.vim25.VirtualDeviceConfigSpec; import com.vmware.vim25.VirtualDeviceConfigSpecOperation; import com.vmware.vim25.VirtualIDEController; @@ -1291,6 +1292,18 @@ public class HypervisorHostHelper { } } + if (guestOsIdentifier.startsWith("darwin")) { //Mac OS + s_logger.debug("Add USB Controller device for blank Mac OS VM " + vmName); + + //For Mac OS X systems, the EHCI+UHCI controller is enabled by default and is required for USB mouse and keyboard access. + VirtualDevice usbControllerDevice = VmwareHelper.prepareUSBControllerDevice(); + VirtualDeviceConfigSpec usbControllerSpec = new VirtualDeviceConfigSpec(); + usbControllerSpec.setDevice(usbControllerDevice); + usbControllerSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); + + vmConfig.getDeviceChange().add(usbControllerSpec); + } + VirtualMachineFileInfo fileInfo = new VirtualMachineFileInfo(); DatastoreMO dsMo = new DatastoreMO(host.getContext(), morDs); fileInfo.setVmPathName(String.format("[%s]", dsMo.getName())); 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 84e9dad0538..65dfe7bd713 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -46,6 +46,7 @@ import com.vmware.vim25.VirtualCdromRemotePassthroughBackingInfo; import com.vmware.vim25.VirtualDevice; import com.vmware.vim25.VirtualDeviceBackingInfo; import com.vmware.vim25.VirtualDeviceConnectInfo; +import com.vmware.vim25.VirtualUSBController; import com.vmware.vim25.VirtualDisk; import com.vmware.vim25.VirtualDiskFlatVer1BackingInfo; import com.vmware.vim25.VirtualDiskFlatVer2BackingInfo; @@ -651,6 +652,15 @@ public class VmwareHelper { vmConfig.setGuestId(guestOsIdentifier); } + public static VirtualDevice prepareUSBControllerDevice() { + s_logger.debug("Preparing USB controller(EHCI+UHCI) device"); + VirtualUSBController usbController = new VirtualUSBController(); //EHCI+UHCI + usbController.setEhciEnabled(true); + usbController.setAutoConnectDevices(true); + + return usbController; + } + public static ManagedObjectReference getDiskDeviceDatastore(VirtualDisk diskDevice) throws Exception { VirtualDeviceBackingInfo backingInfo = diskDevice.getBacking(); assert (backingInfo instanceof VirtualDiskFlatVer2BackingInfo);