From dfd5158d678e127c08c204ccc4f947d9125f8ae0 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Thu, 18 Apr 2024 18:21:17 +0530 Subject: [PATCH] Allow kvm storage plugin to customize diskdef, add geometry (#8839) * Allow kvm storage plugin to customize diskdef, add geometry * formatting update --------- Co-authored-by: Marcus Sorensen --- .../resource/LibvirtComputingResource.java | 3 +- .../hypervisor/kvm/resource/LibvirtVMDef.java | 36 +++++++++++++++++-- .../kvm/storage/KVMStoragePool.java | 3 ++ .../kvm/storage/KVMStorageProcessor.java | 1 + .../kvm/resource/LibvirtVMDefTest.java | 14 ++++++++ 5 files changed, 54 insertions(+), 3 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 b30f2b6a6f0..11cf6328666 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 @@ -3137,7 +3137,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } - + pool.customizeLibvirtDiskDef(disk); } if (data instanceof VolumeObjectTO) { @@ -3512,6 +3512,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv diskdef.setPhysicalBlockIOSize(attachingPool.getSupportedPhysicalBlockSize()); diskdef.setLogicalBlockIOSize(attachingPool.getSupportedLogicalBlockSize()); + attachingPool.customizeLibvirtDiskDef(diskdef); } final String xml = diskdef.toString(); diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index 5e0c9044228..88f618351bb 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -596,6 +596,22 @@ public class LibvirtVMDef { public QemuObject.EncryptFormat getEncryptFormat() { return this.encryptFormat; } } + public static class DiskGeometry { + int cylinders; + int heads; + int sectors; + + public DiskGeometry(int cylinders, int heads, int sectors) { + this.cylinders = cylinders; + this.heads = heads; + this.sectors = sectors; + } + + public String toXml() { + return String.format("\n", this.cylinders, this.heads, this.sectors); + } + } + public enum DeviceType { FLOPPY("floppy"), DISK("disk"), CDROM("cdrom"), LUN("lun"); String _type; @@ -747,6 +763,7 @@ public class LibvirtVMDef { private boolean isIothreadsEnabled; private BlockIOSize logicalBlockIOSize = null; private BlockIOSize physicalBlockIOSize = null; + private DiskGeometry geometry = null; public DiscardType getDiscard() { return _discard; @@ -1087,9 +1104,20 @@ public class LibvirtVMDef { this._serial = serial; } - public void setLibvirtDiskEncryptDetails(LibvirtDiskEncryptDetails details) { this.encryptDetails = details; } + public void setLibvirtDiskEncryptDetails(LibvirtDiskEncryptDetails details) + { + this.encryptDetails = details; + } - public LibvirtDiskEncryptDetails getLibvirtDiskEncryptDetails() { return this.encryptDetails; } + public LibvirtDiskEncryptDetails getLibvirtDiskEncryptDetails() + { + return this.encryptDetails; + } + + public void setGeometry(DiskGeometry geometry) + { + this.geometry = geometry; + } public String getSourceHost() { return _sourceHost; @@ -1174,6 +1202,10 @@ public class LibvirtVMDef { } diskBuilder.append("/>\n"); + if (geometry != null) { + diskBuilder.append(geometry.toXml()); + } + if (logicalBlockIOSize != null || physicalBlockIOSize != null) { diskBuilder.append("\n" + + "\n" + + "\n" + + "\n" + + "\n"; + assertEquals(expectedXML, disk.toString()); + } + @Test public void testDiskDefWithMultipleHosts() { String path = "/mnt/primary1";