From: Michal Privoznik <[email protected]>

Use freshly introduced qemuAgentGetGuestDeviceInfo() to implement
support of VIR_DOMAIN_GUEST_INFO_DEVICES type of
virDomainGetGuestInfo() API in the QEMU driver.

Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <[email protected]>
---
 src/qemu/qemu_driver.c | 58 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 57 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 44b41726fb..c568a418d5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19987,7 +19987,8 @@ static const unsigned int 
qemuDomainGetGuestInfoSupportedTypes =
     VIR_DOMAIN_GUEST_INFO_FILESYSTEM |
     VIR_DOMAIN_GUEST_INFO_DISKS |
     VIR_DOMAIN_GUEST_INFO_INTERFACES |
-    VIR_DOMAIN_GUEST_INFO_LOAD;
+    VIR_DOMAIN_GUEST_INFO_LOAD |
+    VIR_DOMAIN_GUEST_INFO_DEVICES;
 
 static int
 qemuDomainGetGuestInfoCheckSupport(unsigned int types,
@@ -20171,6 +20172,43 @@ virDomainInterfaceFormatParams(virDomainInterfacePtr 
*ifaces,
     }
 }
 
+
+static void
+qemuAgentGuestDeviceInfoFormatParams(qemuAgentGuestDeviceInfo **devices,
+                                     size_t ndevices,
+                                     virTypedParamList *list)
+{
+    size_t i;
+
+    virTypedParamListAddUInt(list, ndevices, 
VIR_DOMAIN_GUEST_INFO_DEVICE_COUNT);
+
+    for (i = 0; i < ndevices; i++) {
+        virTypedParamListAddString(list, devices[i]->driverName,
+                                   VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" 
VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME, i);
+
+        if (devices[i]->driverDate != -1) {
+            /* Guest agent reports this in nanoseconds, our API in seconds. */
+            virTypedParamListAddLLong(list, devices[i]->driverDate / 1000000,
+                                      VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX 
"%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_DATE, i);
+        }
+
+        if (devices[i]->driverVersion) {
+            virTypedParamListAddString(list, devices[i]->driverVersion,
+                                       VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX 
"%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_VERSION, i);
+        }
+
+        if (devices[i]->pci) {
+            virTypedParamListAddString(list, "pci",
+                                       VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX 
"%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE, i);
+            virTypedParamListAddUInt(list, devices[i]->pci->vendorID,
+                                     VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" 
VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_VENDOR, i);
+            virTypedParamListAddUInt(list, devices[i]->pci->deviceID,
+                                     VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" 
VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_DEVICE, i);
+        }
+    }
+}
+
+
 static int
 qemuDomainGetGuestInfo(virDomainPtr dom,
                        unsigned int types,
@@ -20195,6 +20233,8 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
     double load5m = 0;
     double load15m = 0;
     bool format_load = false;
+    qemuAgentGuestDeviceInfo **devices = NULL;
+    size_t ndevices = 0;
     size_t i;
     g_autoptr(virTypedParamList) list = virTypedParamListNew();
 
@@ -20274,6 +20314,14 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
             format_load = true;
     }
 
+    if (supportedTypes & VIR_DOMAIN_GUEST_INFO_DEVICES) {
+        rc = qemuAgentGetGuestDeviceInfo(agent, &devices, report_unsupported);
+        if (rc == -1)
+            goto exitagent;
+        if (rc >= 0)
+            ndevices = rc;
+    }
+
     qemuDomainObjExitAgent(vm, agent);
     virDomainObjEndAgentJob(vm);
 
@@ -20306,6 +20354,8 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
         virTypedParamListAddDouble(list, load15m, 
VIR_DOMAIN_GUEST_INFO_LOAD_15M);
     }
 
+    qemuAgentGuestDeviceInfoFormatParams(devices, ndevices, list);
+
     if (virTypedParamListSteal(list, params, nparams) < 0)
         goto cleanup;
 
@@ -20323,6 +20373,12 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
             virDomainInterfaceFree(ifaces[i]);
     }
     g_free(ifaces);
+    if (devices && ndevices > 0) {
+        for (i = 0; i < ndevices; i++) {
+            qemuAgentGuestDeviceInfoFree(devices[i]);
+        }
+        g_free(devices);
+    }
 
     virDomainObjEndAPI(&vm);
     return ret;
-- 
2.54.0

Reply via email to