From: Peter Krempa <pkrempa@redhat.com> 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 <pkrempa@redhat.com> --- 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