From 325506774381cc8edadee9b2f43fd6733d4f9edb Mon Sep 17 00:00:00 2001 From: Georg Date: Fri, 21 Feb 2025 12:40:45 +0000 Subject: [PATCH] Repair virt_query outputter (#655) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Repair virt_query outputter Existing code was not functional. Only return if a dictionary is passed and reference the correct data. Signed-off-by: Georg Pfuetzenreuter (cherry picked from commit e3c365ad8f385121aa878950e13892d986d79656) * Facilitate block devices in virt_query outputter Disk data in Libvirt VMs does not contain a disk size if the disk references a block device. Skip the field for such disks instead of failing with a key error. Signed-off-by: Georg Pfuetzenreuter (cherry picked from commit ed73abd44117ad745e9c91f2b33caf04402b117c) * Add unit tests for virt_query outputter --------- Co-authored-by: Pablo Suárez Hernández --- changelog/65841.fixed.md | 1 + salt/output/virt_query.py | 64 +++---- tests/pytests/unit/output/test_virt_query.py | 176 +++++++++++++++++++ 3 files changed, 210 insertions(+), 31 deletions(-) create mode 100644 changelog/65841.fixed.md create mode 100644 tests/pytests/unit/output/test_virt_query.py diff --git a/changelog/65841.fixed.md b/changelog/65841.fixed.md new file mode 100644 index 0000000000..7fb6336ea1 --- /dev/null +++ b/changelog/65841.fixed.md @@ -0,0 +1 @@ +Restore functionality of virt_query outputter and add support for block devices. diff --git a/salt/output/virt_query.py b/salt/output/virt_query.py index d20e6357e6..0f989fedfa 100644 --- a/salt/output/virt_query.py +++ b/salt/output/virt_query.py @@ -12,35 +12,37 @@ def output(data, **kwargs): # pylint: disable=unused-argument Display output for the salt-run virt.query function """ out = "" - for id_ in data["data"]: - out += "{}\n".format(id_) - for vm_ in data["data"][id_]["vm_info"]: - out += " {}\n".format(vm_) - vm_data = data[id_]["vm_info"][vm_] - if "cpu" in vm_data: - out += " CPU: {}\n".format(vm_data["cpu"]) - if "mem" in vm_data: - out += " Memory: {}\n".format(vm_data["mem"]) - if "state" in vm_data: - out += " State: {}\n".format(vm_data["state"]) - if "graphics" in vm_data: - if vm_data["graphics"].get("type", "") == "vnc": - out += " Graphics: vnc - {}:{}\n".format( - id_, vm_data["graphics"]["port"] - ) - if "disks" in vm_data: - for disk, d_data in vm_data["disks"].items(): - out += " Disk - {}:\n".format(disk) - out += " Size: {}\n".format(d_data["disk size"]) - out += " File: {}\n".format(d_data["file"]) - out += " File Format: {}\n".format(d_data["file format"]) - if "nics" in vm_data: - for mac in vm_data["nics"]: - out += " Nic - {}:\n".format(mac) - out += " Source: {}\n".format( - vm_data["nics"][mac]["source"][ - next(iter(vm_data["nics"][mac]["source"].keys())) - ] - ) - out += " Type: {}\n".format(vm_data["nics"][mac]["type"]) + if isinstance(data, dict) and "event" in data: + for id_ in data["event"]["data"]: + out += "{}\n".format(id_) + for vm_ in data["event"]["data"][id_]["vm_info"]: + out += " {}\n".format(vm_) + vm_data = data["event"]["data"][id_]["vm_info"][vm_] + if "cpu" in vm_data: + out += " CPU: {}\n".format(vm_data["cpu"]) + if "mem" in vm_data: + out += " Memory: {}\n".format(vm_data["mem"]) + if "state" in vm_data: + out += " State: {}\n".format(vm_data["state"]) + if "graphics" in vm_data: + if vm_data["graphics"].get("type", "") == "vnc": + out += " Graphics: vnc - {}:{}\n".format( + id_, vm_data["graphics"]["port"] + ) + if "disks" in vm_data: + for disk, d_data in vm_data["disks"].items(): + out += " Disk - {}:\n".format(disk) + if "disk size" in d_data: + out += " Size: {}\n".format(d_data["disk size"]) + out += " File: {}\n".format(d_data["file"]) + out += " File Format: {}\n".format(d_data["file format"]) + if "nics" in vm_data: + for mac in vm_data["nics"]: + out += " NIC - {}:\n".format(mac) + out += " Source: {}\n".format( + vm_data["nics"][mac]["source"][ + next(iter(vm_data["nics"][mac]["source"].keys())) + ] + ) + out += " Type: {}\n".format(vm_data["nics"][mac]["type"]) return out diff --git a/tests/pytests/unit/output/test_virt_query.py b/tests/pytests/unit/output/test_virt_query.py new file mode 100644 index 0000000000..3f8814ee26 --- /dev/null +++ b/tests/pytests/unit/output/test_virt_query.py @@ -0,0 +1,176 @@ +""" +unittests for virt_query outputter +""" + +import pytest + +import salt.output.virt_query as virt_query +from tests.support.mock import patch + + +@pytest.fixture +def configure_loader_modules(): + return {virt_query: {}} + + +@pytest.fixture +def data(): + return { + "suffix": "progress", + "event": { + "data": { + "mysystem": { + "freecpu": 14, + "freemem": 29566.0, + "node_info": { + "cpucores": 8, + "cpumhz": 1089, + "cpumodel": "x86_64", + "cpus": 16, + "cputhreads": 2, + "numanodes": 1, + "phymemory": 30846, + "sockets": 1, + }, + "vm_info": { + "vm1": { + "cpu": 2, + "cputime": 1214270000000, + "disks": { + "vda": { + "file": "default/vm1-main-disk", + "type": "disk", + "file format": "qcow2", + "virtual size": 214748364800, + "disk size": 1831731200, + "backing file": { + "file": "/var/lib/libvirt/images/sles15sp4o", + "file format": "qcow2", + }, + }, + "hdd": { + "file": "default/vm1-cloudinit-disk", + "type": "cdrom", + "file format": "raw", + "virtual size": 374784, + "disk size": 376832, + }, + }, + "graphics": { + "autoport": "yes", + "keymap": "None", + "listen": "0.0.0.0", + "port": "5900", + "type": "spice", + }, + "nics": { + "aa:bb:cc:dd:ee:ff": { + "type": "network", + "mac": "aa:bb:cc:dd:ee:ff", + "source": {"network": "default"}, + "model": "virtio", + "address": { + "type": "pci", + "domain": "0x0000", + "bus": "0x00", + "slot": "0x03", + "function": "0x0", + }, + } + }, + "uuid": "yyyyyy", + "loader": {"path": "None"}, + "on_crash": "destroy", + "on_reboot": "restart", + "on_poweroff": "destroy", + "maxMem": 1048576, + "mem": 1048576, + "state": "running", + }, + "uyuni-proxy": { + "cpu": 2, + "cputime": 0, + "disks": { + "vda": { + "file": "default/uyuni-proxy-main-disk", + "type": "disk", + "file format": "qcow2", + "virtual size": 214748364800, + "disk size": 4491255808, + "backing file": { + "file": "/var/lib/libvirt/images/leapmicro55o", + "file format": "qcow2", + }, + } + }, + "graphics": { + "autoport": "yes", + "keymap": "None", + "listen": "0.0.0.0", + "port": "None", + "type": "spice", + }, + "nics": { + "aa:bb:cc:dd:ee:aa": { + "type": "network", + "mac": "aa:bb:cc:dd:ee:aa", + "source": {"network": "default"}, + "model": "virtio", + "address": { + "type": "pci", + "domain": "0x0000", + "bus": "0x00", + "slot": "0x03", + "function": "0x0", + }, + } + }, + "uuid": "xxxxx", + "loader": {"path": "None"}, + "on_crash": "destroy", + "on_reboot": "restart", + "on_poweroff": "destroy", + "maxMem": 2097152, + "mem": 2097152, + "state": "shutdown", + }, + }, + } + }, + "outputter": "virt_query", + "_stamp": "2025-02-21T11:28:04.406561", + }, + } + + +def test_default_output(data): + ret = virt_query.output(data) + expected = """mysystem + vm1 + CPU: 2 + Memory: 1048576 + State: running + Disk - vda: + Size: 1831731200 + File: default/vm1-main-disk + File Format: qcow2 + Disk - hdd: + Size: 376832 + File: default/vm1-cloudinit-disk + File Format: raw + NIC - aa:bb:cc:dd:ee:ff: + Source: default + Type: network + uyuni-proxy + CPU: 2 + Memory: 2097152 + State: shutdown + Disk - vda: + Size: 4491255808 + File: default/uyuni-proxy-main-disk + File Format: qcow2 + NIC - aa:bb:cc:dd:ee:aa: + Source: default + Type: network +""" + assert expected == ret -- 2.48.1