From 3a4a82df69224f805e2dc69c72fe271bfec41d94 Mon Sep 17 00:00:00 2001 From: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com> Date: Thu, 28 Jan 2021 07:28:06 -0300 Subject: [PATCH] kvm: Replicate `rootDiskController` behavior to `dataDiskController`. (#4569) The bus type to `data disk` volumes is hardcoded to `virtio` or `scsi`, when using virtio-scsi (or, based on the template type). Therefore, there is no way to specify the bus type to data disk volumes (as we have for root disks). This PR intends to replicate the `rootDiskController` behavior to `dataDiskController`, allowing the definition of the controller. Co-authored-by: Daniel Augusto Veronezi Salvador --- .../resource/LibvirtComputingResource.java | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index b4872231d36..309e1ad057a 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -2545,9 +2545,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv diskBusType = getGuestDiskModel(vmSpec.getPlatformEmulator()); } - // I'm not sure why previously certain DATADISKs were hard-coded VIRTIO and others not, however this - // maintains existing functionality with the exception that SCSI will override VIRTIO. - DiskDef.DiskBus diskBusTypeData = (diskBusType == DiskDef.DiskBus.SCSI) ? diskBusType : DiskDef.DiskBus.VIRTIO; + DiskDef.DiskBus diskBusTypeData = getDataDiskModelFromVMDetail(vmSpec); + if (diskBusTypeData == null) { + diskBusTypeData = (diskBusType == DiskDef.DiskBus.SCSI) ? diskBusType : DiskDef.DiskBus.VIRTIO; + } final DiskDef disk = new DiskDef(); int devId = volume.getDiskSeq().intValue(); @@ -3420,12 +3421,31 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return DiskDef.DiskBus.SCSI; } - final String rootDiskController = details.get(VmDetailConstants.ROOT_DISK_CONTROLLER); + String rootDiskController = details.get(VmDetailConstants.ROOT_DISK_CONTROLLER); if (StringUtils.isNotBlank(rootDiskController)) { - s_logger.debug("Passed custom disk bus " + rootDiskController); - for (final DiskDef.DiskBus bus : DiskDef.DiskBus.values()) { + s_logger.debug("Passed custom disk controller for ROOT disk " + rootDiskController); + for (DiskDef.DiskBus bus : DiskDef.DiskBus.values()) { if (bus.toString().equalsIgnoreCase(rootDiskController)) { - s_logger.debug("Found matching enum for disk bus " + rootDiskController); + s_logger.debug("Found matching enum for disk controller for ROOT disk " + rootDiskController); + return bus; + } + } + } + return null; + } + + public DiskDef.DiskBus getDataDiskModelFromVMDetail(final VirtualMachineTO vmTO) { + Map details = vmTO.getDetails(); + if (details == null) { + return null; + } + + String dataDiskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER); + if (StringUtils.isNotBlank(dataDiskController)) { + s_logger.debug("Passed custom disk controller for DATA disk " + dataDiskController); + for (DiskDef.DiskBus bus : DiskDef.DiskBus.values()) { + if (bus.toString().equalsIgnoreCase(dataDiskController)) { + s_logger.debug("Found matching enum for disk controller for DATA disk " + dataDiskController); return bus; } }