diff options
author | terminaldweller <thabogre@gmail.com> | 2023-02-13 09:49:05 +0000 |
---|---|---|
committer | terminaldweller <thabogre@gmail.com> | 2023-02-13 09:49:05 +0000 |
commit | 3d864c067471c657b95979b30c2e5cdc603ad17b (patch) | |
tree | 81aec07b3c310a00b50634349838cef345a4a7bf /bin/virttop | |
parent | updates (diff) | |
download | scripts-3d864c067471c657b95979b30c2e5cdc603ad17b.tar.gz scripts-3d864c067471c657b95979b30c2e5cdc603ad17b.zip |
update
Diffstat (limited to 'bin/virttop')
-rwxr-xr-x | bin/virttop | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/bin/virttop b/bin/virttop index 24c4bb8..4d8943b 100755 --- a/bin/virttop +++ b/bin/virttop @@ -9,11 +9,14 @@ import argparse import csv import dataclasses import enum +import os import signal import sys import time import typing -from xml.dom.minidom import Document + +# we are only using this for type annotation +from xml.dom.minidom import Document # nosec from defusedxml import ElementTree # type:ignore from defusedxml import minidom @@ -90,6 +93,11 @@ class VirtData: disk_writes: typing.List[str] = dataclasses.field(default_factory=list) snapshot_counts: typing.List[str] = dataclasses.field(default_factory=list) uri: typing.List[str] = dataclasses.field(default_factory=list) + memory_pool: typing.List[str] = dataclasses.field(default_factory=list) + + pools: typing.List[libvirt.virStoragePool] = dataclasses.field( + default_factory=list + ) def get_network_info( @@ -249,7 +257,10 @@ def fill_virt_data_uri( virt_data.name.append(dom.name()) mem_stats = dom.memoryStats() - virt_data.mem_actual.append(size_abr(mem_stats["actual"], 1000)) + if "actual" in mem_stats: + virt_data.mem_actual.append(size_abr(mem_stats["actual"], 1000)) + else: + virt_data.mem_actual.append("n/a") # BSD guests dont support mem balloons? try: @@ -263,6 +274,18 @@ def fill_virt_data_uri( virt_data.write_bytes.append(size_abr(stats[4], 1)) virt_data.read_bytes.append(size_abr(stats[0], 1)) + found_the_pool: bool = False + disk = tree.find("devices/disk/source").get("file") + for pool in virt_data.pools: + if os.path.basename(disk) in pool.listVolumes(): + virt_data.memory_pool.append(pool.name()) + found_the_pool = True + # you could delete the pool but keep the volumes inside + # which results in a functional VM but it wont have a + # volume inside a pool that we can detect + if not found_the_pool: + virt_data.memory_pool.append("N/A") + disk_info = get_disk_info(xml_doc) image_name = disk_info["file"] _, rd_bytes, _, wr_bytes, _ = dom.blockStats(image_name) @@ -290,7 +313,9 @@ def main() -> None: conn = libvirt.openReadOnly(hv_host) active_hosts = conn.listDomainsID() if len(active_hosts) > 0: - # pools = conn.listAllStoragePools() + virt_data.pools = conn.listAllStoragePools() + # for pool in virt_data.pools: + # print(pool.listVolumes()) # networks = conn.listAllNetworks() # print([pool.name() for pool in conn.listAllStoragePools()]) # print([net.name() for net in conn.listAllNetworks()]) @@ -321,6 +346,7 @@ def main() -> None: "IO_WRITE_B", "SNAPSHOTS", "URI", + "STORAGE_POOL", ], False, virt_data.vm_id, @@ -336,6 +362,7 @@ def main() -> None: virt_data.disk_writes, virt_data.snapshot_counts, virt_data.uri, + virt_data.memory_pool, ) for line in lines: print(line) |