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(§ions);
+ 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(§ions, "hypervisor", NULL, &apis);
+ virXMLFormatElementEmpty(&xml, "libvirt-introspection", NULL, §ions);
+
+ 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