File repair-virt_query-outputter-655.patch of Package venv-salt-minion

From 325506774381cc8edadee9b2f43fd6733d4f9edb Mon Sep 17 00:00:00 2001
From: Georg <georg@lysergic.dev>
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 <mail@georg-pfuetzenreuter.net>
(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 <mail@georg-pfuetzenreuter.net>
(cherry picked from commit ed73abd44117ad745e9c91f2b33caf04402b117c)

* Add unit tests for virt_query outputter

---------

Co-authored-by: Pablo Suárez Hernández <psuarezhernandez@suse.com>
---
 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

openSUSE Build Service is sponsored by