You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2023/01/16 13:19:25 UTC

[cloudstack] branch main updated: kvm: get vm disk stats for ceph disks (#7045)

This is an automated email from the ASF dual-hosted git repository.

dahn 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 743ebe7278b kvm: get vm disk stats for ceph disks (#7045)
743ebe7278b is described below

commit 743ebe7278b1f14b6499e00bf98aa5260477edec
Author: Wei Zhou <we...@apache.org>
AuthorDate: Mon Jan 16 14:19:14 2023 +0100

    kvm: get vm disk stats for ceph disks (#7045)
---
 .../kvm/resource/LibvirtComputingResource.java     | 30 ++++++++++++++------
 .../hypervisor/kvm/resource/LibvirtVMDef.java      |  4 +++
 .../kvm/resource/LibvirtComputingResourceTest.java | 33 ++++++++++++++++++++++
 3 files changed, 58 insertions(+), 9 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 04e981a7873..414e0e870d6 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
@@ -4016,15 +4016,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
                     break;
                 }
                 final DomainBlockStats blockStats = dm.blockStats(disk.getDiskLabel());
-                final String path = disk.getDiskPath(); // for example, path = /mnt/pool_uuid/disk_path/
-                String diskPath = null;
-                if (path != null) {
-                    final String[] token = path.split("/");
-                    if (token.length > 3) {
-                        diskPath = token[3];
-                        final VmDiskStatsEntry stat = new VmDiskStatsEntry(vmName, diskPath, blockStats.wr_req, blockStats.rd_req, blockStats.wr_bytes, blockStats.rd_bytes);
-                        stats.add(stat);
-                    }
+                String diskPath = getDiskPathFromDiskDef(disk);
+                if (diskPath != null) {
+                    final VmDiskStatsEntry stat = new VmDiskStatsEntry(vmName, diskPath, blockStats.wr_req, blockStats.rd_req, blockStats.wr_bytes, blockStats.rd_bytes);
+                    stats.add(stat);
                 }
             }
 
@@ -4036,6 +4031,23 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
         }
     }
 
+    protected String getDiskPathFromDiskDef(DiskDef disk) {
+        final String path = disk.getDiskPath();
+        if (path != null) {
+            final String[] token = path.split("/");
+            if (DiskProtocol.RBD.equals(disk.getDiskProtocol())) {
+                // for example, path = <RBD pool>/<disk path>
+                if (token.length > 1) {
+                    return token[1];
+                }
+            } else if (token.length > 3) {
+                // for example, path = /mnt/pool_uuid/disk_path/
+                return token[3];
+            }
+        }
+        return null;
+    }
+
     private class VmStats {
         long _usedTime;
         long _tx;
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 17767506445..24e576278dd 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
@@ -990,6 +990,10 @@ public class LibvirtVMDef {
             _sourcePath = volPath;
         }
 
+        public DiskProtocol getDiskProtocol() {
+            return _diskProtocol;
+        }
+
         public DiskBus getBusType() {
             return _bus;
         }
diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
index 7d2a9ea6b84..7bb8b453fc0 100644
--- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
+++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
@@ -6053,6 +6053,39 @@ public class LibvirtComputingResourceTest {
         verify(scriptMock).add(String.valueOf(port));
     }
 
+   @Test
+    public void testGetDiskPathFromDiskDefForRBD() {
+        DiskDef diskDef = new DiskDef();
+        diskDef.defNetworkBasedDisk("cloudstack/diskpath", "1.1.1.1", 3300, "username", "uuid", 0,
+                DiskDef.DiskBus.VIRTIO, DiskDef.DiskProtocol.RBD, DiskDef.DiskFmtType.RAW);
+        String diskPath = libvirtComputingResourceSpy.getDiskPathFromDiskDef(diskDef);
+        Assert.assertEquals("diskpath", diskPath);
+    }
+
+    @Test
+    public void testGetDiskPathFromDiskDefForNFS() {
+        DiskDef diskDef = new DiskDef();
+        diskDef.defFileBasedDisk("/mnt/pool/filepath", 0, DiskDef.DiskBus.VIRTIO, DiskDef.DiskFmtType.QCOW2);
+        String diskPath = libvirtComputingResourceSpy.getDiskPathFromDiskDef(diskDef);
+        Assert.assertEquals("filepath", diskPath);
+    }
+
+    @Test
+    public void testGetDiskPathFromDiskDefForNFSWithNullPath() {
+        DiskDef diskDef = new DiskDef();
+        diskDef.defFileBasedDisk(null, 0, DiskDef.DiskBus.VIRTIO, DiskDef.DiskFmtType.QCOW2);
+        String diskPath = libvirtComputingResourceSpy.getDiskPathFromDiskDef(diskDef);
+        Assert.assertNull(diskPath);
+    }
+
+    @Test
+    public void testGetDiskPathFromDiskDefForNFSWithUnsupportedPath() {
+        DiskDef diskDef = new DiskDef();
+        diskDef.defFileBasedDisk("/mnt/unsupported-path", 0, DiskDef.DiskBus.VIRTIO, DiskDef.DiskFmtType.QCOW2);
+        String diskPath = libvirtComputingResourceSpy.getDiskPathFromDiskDef(diskDef);
+        Assert.assertNull(diskPath);
+    }
+
     @Test
     @PrepareForTest(value = {LibvirtComputingResource.class})
     public void testNetworkUsageMethod1() throws Exception {