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 <[email protected]>
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 <[email protected]>
---
.../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";