This commit is contained in:
Abhishek Kumar 2026-01-22 15:20:27 +01:00 committed by GitHub
commit d4c0ee4c7a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 82 additions and 59 deletions

View File

@ -4371,12 +4371,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
String dataDiskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER); String dataDiskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER);
if (StringUtils.isNotBlank(dataDiskController)) { if (StringUtils.isNotBlank(dataDiskController)) {
LOGGER.debug("Passed custom disk controller for DATA disk " + dataDiskController); LOGGER.debug("Passed custom disk controller for DATA disk {}", dataDiskController);
for (DiskDef.DiskBus bus : DiskDef.DiskBus.values()) { DiskDef.DiskBus bus = DiskDef.DiskBus.fromValue(dataDiskController);
if (bus.toString().equalsIgnoreCase(dataDiskController)) { if (bus != null) {
LOGGER.debug("Found matching enum for disk controller for DATA disk " + dataDiskController); LOGGER.debug("Found matching enum for disk controller for DATA disk {}", dataDiskController);
return bus; return bus;
}
} }
} }
return null; return null;

View File

@ -686,6 +686,15 @@ public class LibvirtVMDef {
_bus = bus; _bus = bus;
} }
public static DiskBus fromValue(String bus) {
for (DiskBus b : DiskBus.values()) {
if (b.toString().equalsIgnoreCase(bus)) {
return b;
}
}
return null;
}
@Override @Override
public String toString() { public String toString() {
return _bus; return _bus;

View File

@ -1320,26 +1320,27 @@ public class KVMStorageProcessor implements StorageProcessor {
/** /**
* Attaches or detaches a disk to an instance. * Attaches or detaches a disk to an instance.
* @param conn libvirt connection * @param conn libvirt connection
* @param attach boolean that determines whether the device will be attached or detached * @param attach boolean that determines whether the device will be attached or detached
* @param vmName instance name * @param vmName instance name
* @param attachingDisk kvm physical disk * @param attachingDisk kvm physical disk
* @param devId device id in instance * @param devId device id in instance
* @param serial * @param serial
* @param bytesReadRate bytes read rate * @param bytesReadRate bytes read rate
* @param bytesReadRateMax bytes read rate max * @param bytesReadRateMax bytes read rate max
* @param bytesReadRateMaxLength bytes read rate max length * @param bytesReadRateMaxLength bytes read rate max length
* @param bytesWriteRate bytes write rate * @param bytesWriteRate bytes write rate
* @param bytesWriteRateMax bytes write rate amx * @param bytesWriteRateMax bytes write rate amx
* @param bytesWriteRateMaxLength bytes write rate max length * @param bytesWriteRateMaxLength bytes write rate max length
* @param iopsReadRate iops read rate * @param iopsReadRate iops read rate
* @param iopsReadRateMax iops read rate max * @param iopsReadRateMax iops read rate max
* @param iopsReadRateMaxLength iops read rate max length * @param iopsReadRateMaxLength iops read rate max length
* @param iopsWriteRate iops write rate * @param iopsWriteRate iops write rate
* @param iopsWriteRateMax iops write rate max * @param iopsWriteRateMax iops write rate max
* @param iopsWriteRateMaxLength iops write rate max length * @param iopsWriteRateMaxLength iops write rate max length
* @param cacheMode cache mode * @param cacheMode cache mode
* @param encryptDetails encrypt details * @param encryptDetails encrypt details
* @param controllerInfo
* @throws LibvirtException * @throws LibvirtException
* @throws InternalErrorException * @throws InternalErrorException
*/ */
@ -1347,37 +1348,38 @@ public class KVMStorageProcessor implements StorageProcessor {
final String serial, final Long bytesReadRate, final Long bytesReadRateMax, final Long bytesReadRateMaxLength, final String serial, final Long bytesReadRate, final Long bytesReadRateMax, final Long bytesReadRateMaxLength,
final Long bytesWriteRate, final Long bytesWriteRateMax, final Long bytesWriteRateMaxLength, final Long iopsReadRate, final Long bytesWriteRate, final Long bytesWriteRateMax, final Long bytesWriteRateMaxLength, final Long iopsReadRate,
final Long iopsReadRateMax, final Long iopsReadRateMaxLength, final Long iopsWriteRate, final Long iopsWriteRateMax, final Long iopsReadRateMax, final Long iopsReadRateMaxLength, final Long iopsWriteRate, final Long iopsWriteRateMax,
final Long iopsWriteRateMaxLength, final String cacheMode, final DiskDef.LibvirtDiskEncryptDetails encryptDetails, Map<String, String> details) final Long iopsWriteRateMaxLength, final String cacheMode, final DiskDef.LibvirtDiskEncryptDetails encryptDetails, Map<String, String> details, Map<String, String> controllerInfo)
throws LibvirtException, InternalErrorException { throws LibvirtException, InternalErrorException {
attachOrDetachDisk(conn, attach, vmName, attachingDisk, devId, serial, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, attachOrDetachDisk(conn, attach, vmName, attachingDisk, devId, serial, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength,
bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength, iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength, iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate,
iopsWriteRateMax, iopsWriteRateMaxLength, cacheMode, encryptDetails, 0l, details); iopsWriteRateMax, iopsWriteRateMaxLength, cacheMode, encryptDetails, 0l, details, controllerInfo);
} }
/** /**
* *
* Attaches or detaches a disk to an instance. * Attaches or detaches a disk to an instance.
* @param conn libvirt connection * @param conn libvirt connection
* @param attach boolean that determines whether the device will be attached or detached * @param attach boolean that determines whether the device will be attached or detached
* @param vmName instance name * @param vmName instance name
* @param attachingDisk kvm physical disk * @param attachingDisk kvm physical disk
* @param devId device id in instance * @param devId device id in instance
* @param serial * @param serial
* @param bytesReadRate bytes read rate * @param bytesReadRate bytes read rate
* @param bytesReadRateMax bytes read rate max * @param bytesReadRateMax bytes read rate max
* @param bytesReadRateMaxLength bytes read rate max length * @param bytesReadRateMaxLength bytes read rate max length
* @param bytesWriteRate bytes write rate * @param bytesWriteRate bytes write rate
* @param bytesWriteRateMax bytes write rate amx * @param bytesWriteRateMax bytes write rate amx
* @param bytesWriteRateMaxLength bytes write rate max length * @param bytesWriteRateMaxLength bytes write rate max length
* @param iopsReadRate iops read rate * @param iopsReadRate iops read rate
* @param iopsReadRateMax iops read rate max * @param iopsReadRateMax iops read rate max
* @param iopsReadRateMaxLength iops read rate max length * @param iopsReadRateMaxLength iops read rate max length
* @param iopsWriteRate iops write rate * @param iopsWriteRate iops write rate
* @param iopsWriteRateMax iops write rate max * @param iopsWriteRateMax iops write rate max
* @param iopsWriteRateMaxLength iops write rate max length * @param iopsWriteRateMaxLength iops write rate max length
* @param cacheMode cache mode * @param cacheMode cache mode
* @param encryptDetails encrypt details * @param encryptDetails encrypt details
* @param waitDetachDevice value set in milliseconds to wait before assuming device removal failed * @param waitDetachDevice value set in milliseconds to wait before assuming device removal failed
* @param controllerInfo
* @throws LibvirtException * @throws LibvirtException
* @throws InternalErrorException * @throws InternalErrorException
*/ */
@ -1386,7 +1388,7 @@ public class KVMStorageProcessor implements StorageProcessor {
final Long bytesWriteRate, final Long bytesWriteRateMax, final Long bytesWriteRateMaxLength, final Long iopsReadRate, final Long bytesWriteRate, final Long bytesWriteRateMax, final Long bytesWriteRateMaxLength, final Long iopsReadRate,
final Long iopsReadRateMax, final Long iopsReadRateMaxLength, final Long iopsWriteRate, final Long iopsWriteRateMax, final Long iopsReadRateMax, final Long iopsReadRateMaxLength, final Long iopsWriteRate, final Long iopsWriteRateMax,
final Long iopsWriteRateMaxLength, final String cacheMode, final DiskDef.LibvirtDiskEncryptDetails encryptDetails, final Long iopsWriteRateMaxLength, final String cacheMode, final DiskDef.LibvirtDiskEncryptDetails encryptDetails,
long waitDetachDevice, Map<String, String> details) long waitDetachDevice, Map<String, String> details, Map<String, String> controllerInfo)
throws LibvirtException, InternalErrorException { throws LibvirtException, InternalErrorException {
List<DiskDef> disks = null; List<DiskDef> disks = null;
@ -1423,17 +1425,7 @@ public class KVMStorageProcessor implements StorageProcessor {
return; return;
} }
} else { } else {
DiskDef.DiskBus busT = DiskDef.DiskBus.VIRTIO; DiskDef.DiskBus busT = getAttachDiskBusType(devId, disks, controllerInfo);
for (final DiskDef disk : disks) {
if (disk.getDeviceType() == DeviceType.DISK) {
if (disk.getBusType() == DiskDef.DiskBus.SCSI) {
busT = DiskDef.DiskBus.SCSI;
} else if (disk.getBusType() == DiskDef.DiskBus.VIRTIOBLK) {
busT = DiskDef.DiskBus.VIRTIOBLK;
}
break;
}
}
diskdef = new DiskDef(); diskdef = new DiskDef();
if (busT == DiskDef.DiskBus.SCSI || busT == DiskDef.DiskBus.VIRTIOBLK) { if (busT == DiskDef.DiskBus.SCSI || busT == DiskDef.DiskBus.VIRTIOBLK) {
diskdef.setQemuDriver(true); diskdef.setQemuDriver(true);
@ -1538,6 +1530,28 @@ public class KVMStorageProcessor implements StorageProcessor {
} }
} }
protected DiskDef.DiskBus getAttachDiskBusType(int deviceId, List<DiskDef> disks, Map<String, String> controllerInfo) {
String controllerKey = deviceId == 0 ? VmDetailConstants.ROOT_DISK_CONTROLLER : VmDetailConstants.DATA_DISK_CONTROLLER;
String diskController = MapUtils.getString(controllerInfo, controllerKey);
DiskDef.DiskBus busType = DiskDef.DiskBus.fromValue(diskController);
if (diskController != null) {
logger.debug("Using controller '{}' from command specified as {} while attaching disk (deviceId={})",
diskController, controllerKey, deviceId);
return busType;
}
for (final DiskDef disk : disks) {
if (disk.getDeviceType() != DeviceType.DISK) {
continue;
}
if (disk.getBusType() == DiskDef.DiskBus.SCSI) {
return DiskDef.DiskBus.SCSI;
} else if (disk.getBusType() == DiskDef.DiskBus.VIRTIOBLK) {
return DiskDef.DiskBus.VIRTIOBLK;
}
}
return DiskDef.DiskBus.VIRTIO;
}
@Override @Override
public Answer attachVolume(final AttachCommand cmd) { public Answer attachVolume(final AttachCommand cmd) {
final DiskTO disk = cmd.getDisk(); final DiskTO disk = cmd.getDisk();
@ -1565,7 +1579,8 @@ public class KVMStorageProcessor implements StorageProcessor {
vol.getBytesReadRate(), vol.getBytesReadRateMax(), vol.getBytesReadRateMaxLength(), vol.getBytesReadRate(), vol.getBytesReadRateMax(), vol.getBytesReadRateMaxLength(),
vol.getBytesWriteRate(), vol.getBytesWriteRateMax(), vol.getBytesWriteRateMaxLength(), vol.getBytesWriteRate(), vol.getBytesWriteRateMax(), vol.getBytesWriteRateMaxLength(),
vol.getIopsReadRate(), vol.getIopsReadRateMax(), vol.getIopsReadRateMaxLength(), vol.getIopsReadRate(), vol.getIopsReadRateMax(), vol.getIopsReadRateMaxLength(),
vol.getIopsWriteRate(), vol.getIopsWriteRateMax(), vol.getIopsWriteRateMaxLength(), volCacheMode, encryptDetails, disk.getDetails()); vol.getIopsWriteRate(), vol.getIopsWriteRateMax(), vol.getIopsWriteRateMaxLength(), volCacheMode,
encryptDetails, disk.getDetails(), cmd.getControllerInfo());
return new AttachAnswer(disk); return new AttachAnswer(disk);
} catch (final LibvirtException e) { } catch (final LibvirtException e) {
@ -1602,7 +1617,7 @@ public class KVMStorageProcessor implements StorageProcessor {
vol.getBytesReadRate(), vol.getBytesReadRateMax(), vol.getBytesReadRateMaxLength(), vol.getBytesReadRate(), vol.getBytesReadRateMax(), vol.getBytesReadRateMaxLength(),
vol.getBytesWriteRate(), vol.getBytesWriteRateMax(), vol.getBytesWriteRateMaxLength(), vol.getBytesWriteRate(), vol.getBytesWriteRateMax(), vol.getBytesWriteRateMaxLength(),
vol.getIopsReadRate(), vol.getIopsReadRateMax(), vol.getIopsReadRateMaxLength(), vol.getIopsReadRate(), vol.getIopsReadRateMax(), vol.getIopsReadRateMaxLength(),
vol.getIopsWriteRate(), vol.getIopsWriteRateMax(), vol.getIopsWriteRateMaxLength(), volCacheMode, null, waitDetachDevice, null); vol.getIopsWriteRate(), vol.getIopsWriteRateMax(), vol.getIopsWriteRateMaxLength(), volCacheMode, null, waitDetachDevice, null, null);
storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath()); storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), vol.getPath());