From 631b0960f3f46ea705aa6c1fb5b09dfee564132e Mon Sep 17 00:00:00 2001 From: Marcus Sorensen Date: Mon, 8 Apr 2024 08:28:59 -0700 Subject: [PATCH] Allow kvm storage plugin to customize diskdef, add geometry (#402) * Allow kvm storage plugin to customize diskdef, add geometry * formatting update --------- Co-authored-by: Marcus Sorensen Co-authored-by: Suresh Kumar Anaparti --- .../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 05167f06bf0..a6ed9f6e8fd 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 @@ -3081,7 +3081,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } - + pool.customizeLibvirtDiskDef(disk); } if (data instanceof VolumeObjectTO) { @@ -3452,6 +3452,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 cbef2612919..26ef52eae2f 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 @@ -595,6 +595,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; @@ -746,6 +762,7 @@ public class LibvirtVMDef { private boolean isIothreadsEnabled; private BlockIOSize logicalBlockIOSize = null; private BlockIOSize physicalBlockIOSize = null; + private DiskGeometry geometry = null; public DiscardType getDiscard() { return _discard; @@ -1086,9 +1103,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; + } @Override public String toString() { @@ -1161,6 +1189,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";