This is an automated email from the ASF dual-hosted git repository. rohit pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push: new dfd5158d678 Allow kvm storage plugin to customize diskdef, add geometry (#8839) dfd5158d678 is described below commit dfd5158d678e127c08c204ccc4f947d9125f8ae0 Author: Suresh Kumar Anaparti <suresh.anapa...@shapeblue.com> AuthorDate: Thu Apr 18 18:21:17 2024 +0530 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 <m...@apple.com> --- .../kvm/resource/LibvirtComputingResource.java | 3 +- .../hypervisor/kvm/resource/LibvirtVMDef.java | 36 ++++++++++++++++++++-- .../hypervisor/kvm/storage/KVMStoragePool.java | 3 ++ .../kvm/storage/KVMStorageProcessor.java | 1 + .../hypervisor/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("<geometry cyls='%d' heads='%d' secs='%d'/>\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("<blockio "); if (logicalBlockIOSize != null) { diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java index 43547e7c7d1..96a4da09686 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java @@ -108,4 +108,7 @@ public interface KVMStoragePool { default LibvirtVMDef.DiskDef.BlockIOSize getSupportedPhysicalBlockSize() { return null; } + + default void customizeLibvirtDiskDef(LibvirtVMDef.DiskDef disk) { + } } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java index 0a9cc80a339..008768f25e9 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java @@ -1484,6 +1484,7 @@ public class KVMStorageProcessor implements StorageProcessor { } diskdef.setPhysicalBlockIOSize(attachingPool.getSupportedPhysicalBlockSize()); diskdef.setLogicalBlockIOSize(attachingPool.getSupportedLogicalBlockSize()); + attachingPool.customizeLibvirtDiskDef(diskdef); } attachOrDetachDevice(conn, attach, vmName, diskdef, waitDetachDevice); diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java index 3e1df81713c..70bde8f7840 100644 --- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java +++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java @@ -317,6 +317,20 @@ public class LibvirtVMDefTest extends TestCase { assertEquals(expectedXml, disk.toString()); } + @Test + public void testDiskDefWithGeometry() { + DiskDef disk = new DiskDef(); + disk.defBlockBasedDisk("disk1", 1, DiskDef.DiskBus.VIRTIO); + disk.setGeometry(new DiskDef.DiskGeometry(16383, 16, 63)); + String expectedXML = "<disk device='disk' type='block'>\n" + + "<driver name='qemu' type='raw' cache='none' />\n" + + "<source dev='disk1'/>\n" + + "<target dev='vdb' bus='virtio'/>\n" + + "<geometry cyls='16383' heads='16' secs='63'/>\n" + + "</disk>\n"; + assertEquals(expectedXML, disk.toString()); + } + @Test public void testDiskDefWithMultipleHosts() { String path = "/mnt/primary1";