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 {