From: Peter Krempa <[email protected]>

Add general infrastructure for converting the generated introspection
into XML which can be returned via 'virConnectGetIntrospection' and
use it in the qemu driver. Example of the generated introspection XML:

 $ virsh introspection
 <libvirt-introspection>
   <hypervisor>
     <api name='virConnectBaselineCPU'>
       <flags dec='3' hex='0x3'/>
     </api>
     <api name='virConnectBaselineHypervisorCPU'>
       <flags dec='7' hex='0x7'/>
     </api>
     <api name='virConnectClose'/>
  [...]

The XML has the provisions to add introspection for sub-drivers as well
as can be extended in the future with other dynamic parameters such as
the names and types of virTypedParameter input fields.

Signed-off-by: Peter Krempa <[email protected]>
---
 src/libvirt_private.syms    |  5 +++++
 src/qemu/qemu_driver.c      | 17 +++++++++++++++++
 src/util/meson.build        |  1 +
 src/util/virintrospection.c | 37 +++++++++++++++++++++++++++++++++++++
 src/util/virintrospection.h | 17 +++++++++++++++++
 5 files changed, 77 insertions(+)
 create mode 100644 src/util/virintrospection.c
 create mode 100644 src/util/virintrospection.h

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 37c9c73d92..706079b87f 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2657,6 +2657,11 @@ virInhibitorRelease;
 virInitctlFifos;
 virInitctlSetRunLevel;

+
+# util/virintrospection.h
+virIntrospectionGetXML;
+
+
 # util/viriommufd.h
 virIOMMUFDOpenDevice;
 virIOMMUFDSupported;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c8975fbbf6..38f87a4bff 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -105,6 +105,7 @@
 #include "virdomaincheckpointobjlist.h"
 #include "virutil.h"
 #include "backup_conf.h"
+#include "virintrospection.h"

 #define VIR_FROM_THIS VIR_FROM_QEMU

@@ -20871,6 +20872,21 @@ qemuDomainDelThrottleGroup(virDomainPtr dom,
 }


+#include "qemu_introspection.inc.h"
+
+static char *
+qemuConnectGetIntrospection(virConnectPtr conn G_GNUC_UNUSED,
+                           unsigned int flags)
+{
+    virCheckFlags(0, NULL);
+
+    if (virConnectGetIntrospectionEnsureACL(conn) < 0)
+        return NULL;
+
+    return virIntrospectionGetXML(driver_api_introspection);
+}
+
+
 static virHypervisorDriver qemuHypervisorDriver = {
     .name = QEMU_DRIVER_NAME,
     .connectURIProbe = qemuConnectURIProbe,
@@ -21125,6 +21141,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
     .domainSetAutostartOnce = qemuDomainSetAutostartOnce, /* 11.2.0 */
     .domainSetThrottleGroup = qemuDomainSetThrottleGroup, /* 11.2.0 */
     .domainDelThrottleGroup = qemuDomainDelThrottleGroup, /* 11.2.0 */
+    .connectGetIntrospection = qemuConnectGetIntrospection, /* 12.4.0 */
 };


diff --git a/src/util/meson.build b/src/util/meson.build
index 9fb0aa0fe7..542f8a1b9b 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -46,6 +46,7 @@ util_sources = [
   'viridentity.c',
   'virinhibitor.c',
   'virinitctl.c',
+  'virintrospection.c',
   'viriommufd.c',
   'viriscsi.c',
   'virjson.c',
diff --git a/src/util/virintrospection.c b/src/util/virintrospection.c
new file mode 100644
index 0000000000..b9fb5beda8
--- /dev/null
+++ b/src/util/virintrospection.c
@@ -0,0 +1,37 @@
+/*
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include <config.h>
+
+#include "virintrospection.h"
+#include "virxml.h"
+#include "virbuffer.h"
+
+char *
+virIntrospectionGetXML(const virIntrospectionData *d)
+{
+    g_auto(virBuffer) xml = VIR_BUFFER_INITIALIZER;
+    g_auto(virBuffer) sections = VIR_BUFFER_INIT_CHILD(&xml);
+    g_auto(virBuffer) apis = VIR_BUFFER_INIT_CHILD(&sections);
+    size_t i;
+
+    for (i = 0; d[i].api != NULL; i++) {
+        g_auto(virBuffer) api_attr = VIR_BUFFER_INITIALIZER;
+        g_auto(virBuffer) api_elem = VIR_BUFFER_INIT_CHILD(&apis);
+
+        virBufferAsprintf(&api_attr, " name='%s'", d[i].api);
+
+        if (d[i].flags_arg) {
+            virBufferAsprintf(&api_elem, "<flags dec='%u' hex='0x%x'/>\n",
+                              d[i].flags, d[i].flags);
+        }
+
+        virXMLFormatElement(&apis, "api", &api_attr, &api_elem);
+    }
+
+    virXMLFormatElement(&sections, "hypervisor", NULL, &apis);
+    virXMLFormatElementEmpty(&xml, "libvirt-introspection", NULL, &sections);
+
+    return virBufferContentAndReset(&xml);
+}
diff --git a/src/util/virintrospection.h b/src/util/virintrospection.h
new file mode 100644
index 0000000000..f996ce0f07
--- /dev/null
+++ b/src/util/virintrospection.h
@@ -0,0 +1,17 @@
+/*
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#pragma once
+
+#include <stdbool.h>
+
+struct _virIntrospectionData {
+    const char *api;
+    bool flags_arg;
+    unsigned int flags;
+};
+typedef struct _virIntrospectionData virIntrospectionData;
+
+char *
+virIntrospectionGetXML(const virIntrospectionData *d);
-- 
2.54.0

Reply via email to