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";

Reply via email to