From a3bb84b49593863447082e88789276abda96e73c Mon Sep 17 00:00:00 2001 From: Nicolas Vazquez Date: Thu, 10 Feb 2022 10:36:34 -0300 Subject: [PATCH] [VMware] Update SCSI controllers for VMs (#5910) --- .../vmware/resource/VmwareResource.java | 8 +++++ .../vmware/mo/VirtualMachineMO.java | 35 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index d2051f68916..3732804f9a8 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -1813,6 +1813,14 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa int requiredNumScsiControllers = VmwareHelper.MAX_SCSI_CONTROLLER_COUNT - scsiControllerInfo.first(); int availableBusNum = scsiControllerInfo.second() + 1; // method returned current max. bus number + if (DiskControllerType.getType(scsiDiskController) != scsiControllerInfo.third()) { + s_logger.debug(String.format("Change controller type from: %s to: %s", scsiControllerInfo.third().toString(), + scsiDiskController)); + vmMo.tearDownDevices(new Class[]{VirtualSCSIController.class}); + vmMo.addScsiDeviceControllers(DiskControllerType.getType(scsiDiskController)); + return; + } + if (requiredNumScsiControllers == 0) { return; } diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index c27470e3ad6..80efcbc132f 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -2293,6 +2293,41 @@ public class VirtualMachineMO extends BaseMO { throw new Exception("VMware Paravirtual SCSI Controller Not Found"); } + protected VirtualSCSIController getScsiController(DiskControllerType type) { + switch (type) { + case pvscsi: + return new ParaVirtualSCSIController(); + case lsisas1068: + return new VirtualLsiLogicSASController(); + case buslogic: + return new VirtualBusLogicController(); + default: + return new VirtualLsiLogicController(); + } + } + + public void addScsiDeviceControllers(DiskControllerType type) throws Exception { + VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec(); + int busNum = 0; + while (busNum < VmwareHelper.MAX_SCSI_CONTROLLER_COUNT) { + VirtualSCSIController scsiController = getScsiController(type); + scsiController.setSharedBus(VirtualSCSISharing.NO_SHARING); + scsiController.setBusNumber(busNum); + scsiController.setKey(busNum - VmwareHelper.MAX_SCSI_CONTROLLER_COUNT); + VirtualDeviceConfigSpec scsiControllerSpec = new VirtualDeviceConfigSpec(); + scsiControllerSpec.setDevice(scsiController); + scsiControllerSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); + vmConfig.getDeviceChange().add(scsiControllerSpec); + busNum++; + } + + if (configureVm(vmConfig)) { + s_logger.info("Successfully added SCSI controllers."); + } else { + throw new Exception("Unable to add Scsi controllers to the VM " + getName()); + } + } + public void ensurePvScsiDeviceController(int requiredNumScsiControllers, int availableBusNum) throws Exception { VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec();