[libvirt] [dbus PATCH 0/8] Last APIs for Connect Interface

Notes: - I am not confident about the dummy test on StoragePoolSources. - In GetAllDomainStats I was not able to find a way to create output (aa{sv}) as we need. So I created simple (av), hiding the inner array type. Katerina Koukiou (8): Implement BaselineCPU method for Connect Interface Implement CompareCPU method for Connect Interface Implement FindStoragePoolSources for Domain Interface Move definition for g_autoptr virDomainStatsRecordPtr to util.h Implement GetAllDomainStats method for Connect Interface Introduce virtDBusUtilStringListFree Implement GetCPUModelNames method for Connect Interface Implement GetDomainCapabilties method for Connect Interface data/org.libvirt.Connect.xml | 47 ++++++++++ src/connect.c | 219 +++++++++++++++++++++++++++++++++++++++++++ src/domain.c | 2 - src/util.c | 9 ++ src/util.h | 9 ++ tests/test_connect.py | 9 ++ 6 files changed, 293 insertions(+), 2 deletions(-) -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index d84fc29..92f74c5 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -25,6 +25,13 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetVersion"/> </property> + <method name="BaselineCPU"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectBaselineCPU"/> + <arg name="xmlCPUs" type="as" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="cpu" type="s" direction="out"/> + </method> <method name="DomainCreateXML"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateXML"/> diff --git a/src/connect.c b/src/connect.c index 3a563bb..bd959c7 100644 --- a/src/connect.c +++ b/src/connect.c @@ -206,6 +206,43 @@ virtDBusConnectGetCapabilities(GVariant *inArgs G_GNUC_UNUSED, *outArgs = g_variant_new("(s)", capabilities); } +static void +virtDBusConnectBaselineCPU(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autofree const gchar **xmlCPUs = NULL; + g_autoptr(GVariantIter) iter = NULL; + const gchar **tmp; + gsize ncpus; + g_autofree gchar *cpu = NULL; + guint flags; + + g_variant_get(inArgs, "(asu)", &iter, &flags); + + ncpus = g_variant_iter_n_children(iter); + if (ncpus > 0) { + xmlCPUs = g_new0(const gchar*, ncpus); + tmp = xmlCPUs; + while (g_variant_iter_next(iter, "&s", tmp)) + tmp++; + } + + if (!virtDBusConnectOpen(connect, error)) + return; + + cpu = virConnectBaselineCPU(connect->connection, xmlCPUs, ncpus, flags); + if (!cpu) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(s)", cpu); +} + static void virtDBusConnectDomainCreateXML(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -623,6 +660,7 @@ static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { }; static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { + { "BaselineCPU", virtDBusConnectBaselineCPU }, { "DomainCreateXML", virtDBusConnectDomainCreateXML }, { "DomainDefineXML", virtDBusConnectDomainDefineXML }, { "DomainLookupByID", virtDBusConnectDomainLookupByID }, -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:00PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Thu, Apr 19, 2018 at 03:58:00PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 92f74c5..0fc34e3 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -32,6 +32,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="cpu" type="s" direction="out"/> </method> + <method name="CompareCPU"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectCompareCPU"/> + <arg name="xmlDesc" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="compareResult" type="s" direction="out"/> + </method> <method name="DomainCreateXML"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateXML"/> diff --git a/src/connect.c b/src/connect.c index bd959c7..86fea4f 100644 --- a/src/connect.c +++ b/src/connect.c @@ -6,6 +6,13 @@ #include <glib/gprintf.h> +VIRT_DBUS_ENUM_DECL(virtDBusConnectCPUCompareResult) +VIRT_DBUS_ENUM_IMPL(virtDBusConnectCPUCompareResult, + VIR_CPU_COMPARE_LAST, + "incompatible", + "identical", + "superset") + static gint virtDBusConnectCredType[] = { VIR_CRED_AUTHNAME, VIR_CRED_ECHOPROMPT, @@ -243,6 +250,41 @@ virtDBusConnectBaselineCPU(GVariant *inArgs, *outArgs = g_variant_new("(s)", cpu); } +static void +virtDBusConnectCompareCPU(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *xmlDesc; + guint flags; + gint compareResult; + g_autofree const gchar* compareResultStr = NULL; + + g_variant_get(inArgs, "(&su)", &xmlDesc, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + compareResult = virConnectCompareCPU(connect->connection, xmlDesc, flags); + if (compareResult < 0) + return virtDBusUtilSetLastVirtError(error); + + compareResultStr = virtDBusConnectCPUCompareResultTypeToString(compareResult); + if (!compareResultStr) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't format virCPUCompareResult '%d' to string.", + compareResult); + return; + } + + *outArgs = g_variant_new("(s)", compareResultStr); +} + static void virtDBusConnectDomainCreateXML(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -661,6 +703,7 @@ static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "BaselineCPU", virtDBusConnectBaselineCPU }, + { "CompareCPU", virtDBusConnectCompareCPU }, { "DomainCreateXML", virtDBusConnectDomainCreateXML }, { "DomainDefineXML", virtDBusConnectDomainDefineXML }, { "DomainLookupByID", virtDBusConnectDomainLookupByID }, -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:01PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 92f74c5..0fc34e3 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -32,6 +32,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="cpu" type="s" direction="out"/> </method> + <method name="CompareCPU"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectCompareCPU"/> + <arg name="xmlDesc" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="compareResult" type="s" direction="out"/> + </method> <method name="DomainCreateXML"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateXML"/> diff --git a/src/connect.c b/src/connect.c index bd959c7..86fea4f 100644 --- a/src/connect.c +++ b/src/connect.c @@ -6,6 +6,13 @@
#include <glib/gprintf.h>
+VIRT_DBUS_ENUM_DECL(virtDBusConnectCPUCompareResult) +VIRT_DBUS_ENUM_IMPL(virtDBusConnectCPUCompareResult, + VIR_CPU_COMPARE_LAST, + "incompatible", + "identical", + "superset") + static gint virtDBusConnectCredType[] = { VIR_CRED_AUTHNAME, VIR_CRED_ECHOPROMPT, @@ -243,6 +250,41 @@ virtDBusConnectBaselineCPU(GVariant *inArgs, *outArgs = g_variant_new("(s)", cpu); }
+static void +virtDBusConnectCompareCPU(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *xmlDesc; + guint flags; + gint compareResult; + g_autofree const gchar* compareResultStr = NULL;
s/g_autofree // Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 9 +++++++++ src/connect.c | 30 ++++++++++++++++++++++++++++++ tests/test_connect.py | 5 +++++ 3 files changed, 44 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 0fc34e3..e5504f7 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -85,6 +85,15 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="FindStoragePoolSources"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-storage.html#virConnectFindStorageP... + Empty string can be used to pass a NULL as @srcSpec argument."/> + <arg name="type" type="s" direction="in"/> + <arg name="srcSpec" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="storagePoolSources" type="s" direction="out"/> + </method> <method name="GetCapabilities"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/> diff --git a/src/connect.c b/src/connect.c index 86fea4f..4e64238 100644 --- a/src/connect.c +++ b/src/connect.c @@ -474,6 +474,35 @@ virtDBusConnectDomainSaveImageDefineXML(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusConnectFindStoragePoolSources(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *type; + const gchar *srcSpec; + guint flags; + g_autofree gchar *ret = NULL; + + g_variant_get(inArgs, "(&s&su)", &type, &srcSpec, &flags); + if (g_str_equal(srcSpec, "")) + srcSpec = NULL; + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virConnectFindStoragePoolSources(connect->connection, type, srcSpec, flags); + if (!ret) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(s)", ret); +} + static void virtDBusConnectGetSysinfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -711,6 +740,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "DomainLookupByUUID", virtDBusConnectDomainLookupByUUID }, { "DomainRestore", virtDBusConnectDomainRestoreFlags }, { "DomainSaveImageDefineXML", virtDBusConnectDomainSaveImageDefineXML }, + { "FindStoragePoolSources", virtDBusConnectFindStoragePoolSources }, { "GetCapabilities", virtDBusConnectGetCapabilities }, { "GetSysinfo", virtDBusConnectGetSysinfo }, { "ListDomains", virtDBusConnectListDomains }, diff --git a/tests/test_connect.py b/tests/test_connect.py index a7b7ad6..d7ec704 100755 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -68,6 +68,11 @@ class TestConnect(libvirttest.BaseTestClass): path = getattr(self.connect, lookup_method_name)(props[lookup_item]) assert original_path == path + def test_connect_find_storage_pool_sources(self): + storageType = "logical" + sources = self.connect.FindStoragePoolSources(storageType, "", 0) + assert isinstance(sources, dbus.String) + def test_connect_list_domains(self): domains = self.connect.ListDomains(0) assert isinstance(domains, dbus.Array) -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:02PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 9 +++++++++ src/connect.c | 30 ++++++++++++++++++++++++++++++ tests/test_connect.py | 5 +++++ 3 files changed, 44 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Thu, Apr 19, 2018 at 03:58:02PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 9 +++++++++ src/connect.c | 30 ++++++++++++++++++++++++++++++ tests/test_connect.py | 5 +++++ 3 files changed, 44 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

We be reused in connect.c Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- src/domain.c | 2 -- src/util.h | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/domain.c b/src/domain.c index 6c44377..010758b 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1017,8 +1017,6 @@ virtDBusDomainGetSchedulerParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainStatsRecordPtr, virDomainStatsRecordListFree); - static void virtDBusDomainGetStats(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, diff --git a/src/util.h b/src/util.h index 7bb4ad6..5141172 100644 --- a/src/util.h +++ b/src/util.h @@ -38,6 +38,8 @@ virtDBusUtilVirDomainListFree(virDomainPtr *domains); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomain, virDomainFree); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainPtr, virtDBusUtilVirDomainListFree); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainStatsRecordPtr, virDomainStatsRecordListFree); + gint virtDBusUtilEnumFromString(const gchar *const *types, guint ntypes, -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:03PM +0200, Katerina Koukiou wrote:
We be reused in connect.c
s/We/Will/
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- src/domain.c | 2 -- src/util.h | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Thu, Apr 19, 2018 at 04:47:51PM +0200, Pavel Hrdina wrote:
On Thu, Apr 19, 2018 at 03:58:03PM +0200, Katerina Koukiou wrote:
We be reused in connect.c
s/We/We'll/
Ehm, ignore this, it supposed to be s/We/Will/. Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index e5504f7..3ef965d 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -94,6 +94,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="storagePoolSources" type="s" direction="out"/> </method> + <method name="GetAllDomainStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetAllDomainStats"/> + <arg name="stats" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="records" type="av" direction="out"/> + </method> <method name="GetCapabilities"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/> diff --git a/src/connect.c b/src/connect.c index 4e64238..e774fa4 100644 --- a/src/connect.c +++ b/src/connect.c @@ -503,6 +503,45 @@ virtDBusConnectFindStoragePoolSources(GVariant *inArgs, *outArgs = g_variant_new("(s)", ret); } +static void +virtDBusConnectGetAllDomainStats(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomainStatsRecordPtr) records = NULL; + guint stats; + gint nstats; + guint flags; + GVariant *grecords; + GVariant *gret; + GVariantBuilder builder; + + g_variant_get(inArgs, "(uu)", &stats, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + nstats = virConnectGetAllDomainStats(connect->connection, + stats, &records, flags); + if (nstats < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("av")); + for (gint i = 0; i < nstats; i++) { + grecords = virtDBusUtilTypedParamsToGVariant(records[i]->params, + records[i]->nparams); + g_variant_builder_add(&builder, "v", grecords); + } + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusConnectGetSysinfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -741,6 +780,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "DomainRestore", virtDBusConnectDomainRestoreFlags }, { "DomainSaveImageDefineXML", virtDBusConnectDomainSaveImageDefineXML }, { "FindStoragePoolSources", virtDBusConnectFindStoragePoolSources }, + { "GetAllDomainStats", virtDBusConnectGetAllDomainStats }, { "GetCapabilities", virtDBusConnectGetCapabilities }, { "GetSysinfo", virtDBusConnectGetSysinfo }, { "ListDomains", virtDBusConnectListDomains }, -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:04PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index e5504f7..3ef965d 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -94,6 +94,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="storagePoolSources" type="s" direction="out"/> </method> + <method name="GetAllDomainStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetAllDomainStats"/>
This one is documented in https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectGetAllDomainS... Given that our API names are set in stone but our website URLs are not, maybe we need some stable link that would redirect to the correct doc page when given an API name. Jano
+ <arg name="stats" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="records" type="av" direction="out"/> + </method> <method name="GetCapabilities"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/>

On Thu, 2018-04-19 at 16:45 +0200, Ján Tomko wrote:
On Thu, Apr 19, 2018 at 03:58:04PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index e5504f7..3ef965d 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -94,6 +94,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="storagePoolSources" type="s" direction="out"/> </method> + <method name="GetAllDomainStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.h tml#virConnectGetAllDomainStats"/>;
This one is documented in https://libvirt.org/html/libvirt-libvirt-do main.html#virConnectGetAllDomainStats
Given that our API names are set in stone but our website URLs are not, maybe we need some stable link that would redirect to the correct doc page when given an API name.
Yes, good point. The docs need to be enhanced in general anyway.
Jano
+ <arg name="stats" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="records" type="av" direction="out"/> + </method> <method name="GetCapabilities"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.ht ml#virConnectGetCapabilities"/>;

On Thu, Apr 19, 2018 at 03:58:04PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index e5504f7..3ef965d 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -94,6 +94,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="storagePoolSources" type="s" direction="out"/> </method> + <method name="GetAllDomainStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetAllDomainStats"/> + <arg name="stats" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="records" type="av" direction="out"/>
The return type should be "a(sa{sv})" because it returns stats for multiple domains. For example: [ ( "centos6", { "state.state": 1, "state.reason": 1 } ), ( "centos7", { "state.state": 5, "state.reason": 1 } ) ] and the code needs to be updated accordingly. Pavel

virtDBusUtilStringListFree is an autoptr cleanup function for gchar ** type. Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- src/util.c | 9 +++++++++ src/util.h | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/util.c b/src/util.c index b21f2c5..75f77e3 100644 --- a/src/util.c +++ b/src/util.c @@ -184,3 +184,12 @@ virtDBusUtilVirNetworkListFree(virNetworkPtr *networks) g_free(networks); } + +void +virtDBusUtilStringListFree(GCharArray *item) +{ + for (gint i = 0; item[i] != NULL; i += 1) + g_free(item[i]); + + g_free(item); +} diff --git a/src/util.h b/src/util.h index 5141172..7ae4705 100644 --- a/src/util.h +++ b/src/util.h @@ -82,3 +82,10 @@ virtDBusUtilVirNetworkListFree(virNetworkPtr *networks); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetwork, virNetworkFree); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetworkPtr, virtDBusUtilVirNetworkListFree); + +typedef gchar *GCharArray; + +void +virtDBusUtilStringListFree(GCharArray *item); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GCharArray, virtDBusUtilStringListFree); -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:05PM +0200, Katerina Koukiou wrote:
virtDBusUtilStringListFree is an autoptr cleanup function for gchar ** type.
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- src/util.c | 9 +++++++++ src/util.h | 7 +++++++ 2 files changed, 16 insertions(+)
diff --git a/src/util.c b/src/util.c index b21f2c5..75f77e3 100644 --- a/src/util.c +++ b/src/util.c @@ -184,3 +184,12 @@ virtDBusUtilVirNetworkListFree(virNetworkPtr *networks)
g_free(networks); } + +void +virtDBusUtilStringListFree(GCharArray *item) +{ + for (gint i = 0; item[i] != NULL; i += 1)
i++, please
+ g_free(item[i]); + + g_free(item); +} diff --git a/src/util.h b/src/util.h index 5141172..7ae4705 100644 --- a/src/util.h +++ b/src/util.h @@ -82,3 +82,10 @@ virtDBusUtilVirNetworkListFree(virNetworkPtr *networks);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetwork, virNetworkFree); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetworkPtr, virtDBusUtilVirNetworkListFree); + +typedef gchar *GCharArray; +
This is the naming convention used by glib, custom types should use the virtDBus prefix. Jano
+void +virtDBusUtilStringListFree(GCharArray *item); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GCharArray, virtDBusUtilStringListFree); -- 2.15.0
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 35 +++++++++++++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 46 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 3ef965d..43a6241 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -106,6 +106,13 @@ value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/> <arg name="capabilities" type="s" direction="out"/> </method> + <method name="GetCPUModelNames"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCPUModelNames"/> + <arg name="arch" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="models" type="as" direction="out"/> + </method> <method name="GetSysinfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetSysinfo"/> diff --git a/src/connect.c b/src/connect.c index e774fa4..169a070 100644 --- a/src/connect.c +++ b/src/connect.c @@ -542,6 +542,40 @@ virtDBusConnectGetAllDomainStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gret, 1); } +static void +virtDBusConnectGetCPUModelNames(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *arch; + guint flags; + g_autoptr(GCharArray) models = NULL; + gint nmodels; + GVariant *gret; + GVariantBuilder builder; + + g_variant_get(inArgs, "(&su)", &arch, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + nmodels = virConnectGetCPUModelNames(connect->connection, arch, &models, flags); + if (nmodels < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("as")); + for (gint i = 0; i < nmodels; i++) + g_variant_builder_add(&builder, "s", models[i]); + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusConnectGetSysinfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -782,6 +816,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "FindStoragePoolSources", virtDBusConnectFindStoragePoolSources }, { "GetAllDomainStats", virtDBusConnectGetAllDomainStats }, { "GetCapabilities", virtDBusConnectGetCapabilities }, + { "GetCPUModelNames", virtDBusConnectGetCPUModelNames }, { "GetSysinfo", virtDBusConnectGetSysinfo }, { "ListDomains", virtDBusConnectListDomains }, { "ListNetworks", virtDBusConnectListNetworks }, diff --git a/tests/test_connect.py b/tests/test_connect.py index d7ec704..57f0658 100755 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -116,6 +116,10 @@ class TestConnect(libvirttest.BaseTestClass): def test_connect_get_capabilities(self): assert isinstance(self.connect.GetCapabilities(), dbus.String) + def test_connect_get_cpu_model_names(self): + arch = "x86_64" + assert isinstance(self.connect.GetCPUModelNames(arch, 0), dbus.Array) + def test_connect_network_create_xml(self): def network_started(path, _event): assert isinstance(path, dbus.ObjectPath) -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:06PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 35 +++++++++++++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 46 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 3ef965d..43a6241 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -106,6 +106,13 @@ value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCapabilities"/> <arg name="capabilities" type="s" direction="out"/> </method> + <method name="GetCPUModelNames"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetCPUModelNames"/> + <arg name="arch" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="models" type="as" direction="out"/> + </method> <method name="GetSysinfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetSysinfo"/> diff --git a/src/connect.c b/src/connect.c index e774fa4..169a070 100644 --- a/src/connect.c +++ b/src/connect.c @@ -542,6 +542,40 @@ virtDBusConnectGetAllDomainStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gret, 1); }
+static void +virtDBusConnectGetCPUModelNames(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *arch; + guint flags; + g_autoptr(GCharArray) models = NULL;
This will need to be changed.
+ gint nmodels; + GVariant *gret; + GVariantBuilder builder; + + g_variant_get(inArgs, "(&su)", &arch, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + nmodels = virConnectGetCPUModelNames(connect->connection, arch, &models, flags);
The API documentation also states: Pass NULL if only the list length is needed. But that does not seem like useful functionality.
+ if (nmodels < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("as")); + for (gint i = 0; i < nmodels; i++) + g_variant_builder_add(&builder, "s", models[i]); + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} +
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Fri, 2018-04-20 at 13:39 +0200, Ján Tomko wrote:
On Thu, Apr 19, 2018 at 03:58:06PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 35 +++++++++++++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 46 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 3ef965d..43a6241 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -106,6 +106,13 @@ value="See https://libvirt.org/html/libvirt-libvirt-host.ht ml#virConnectGetCapabilities"/>; <arg name="capabilities" type="s" direction="out"/> </method> + <method name="GetCPUModelNames"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.h tml#virConnectGetCPUModelNames"/>; + <arg name="arch" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="models" type="as" direction="out"/> + </method> <method name="GetSysinfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.ht ml#virConnectGetSysinfo"/>; diff --git a/src/connect.c b/src/connect.c index e774fa4..169a070 100644 --- a/src/connect.c +++ b/src/connect.c @@ -542,6 +542,40 @@ virtDBusConnectGetAllDomainStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gret, 1); }
+static void +virtDBusConnectGetCPUModelNames(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *arch; + guint flags; + g_autoptr(GCharArray) models = NULL;
This will need to be changed.
+ gint nmodels; + GVariant *gret; + GVariantBuilder builder; + + g_variant_get(inArgs, "(&su)", &arch, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + nmodels = virConnectGetCPUModelNames(connect->connection, arch, &models, flags);
The API documentation also states: Pass NULL if only the list length is needed. But that does not seem like useful functionality.
Anyway, we can't support it, since @models is output and not input variable, so we can't pass NULL there somehow. Katerina
+ if (nmodels < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("as")); + for (gint i = 0; i < nmodels; i++) + g_variant_builder_add(&builder, "s", models[i]); + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} +
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 10 ++++++++++ src/connect.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 43a6241..6f90822 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -113,6 +113,16 @@ <arg name="flags" type="u" direction="in"/> <arg name="models" type="as" direction="out"/> </method> + <method name="GetDomainCapabilities"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectGetDomainCapabilities"/> + <arg name="emulatorbin" type="s" direction="in"/> + <arg name="arch" type="s" direction="in"/> + <arg name="machine" type="s" direction="in"/> + <arg name="virttype" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="domCapabilities" type="s" direction="out"/> + </method> <method name="GetSysinfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virConnectGetSysinfo"/> diff --git a/src/connect.c b/src/connect.c index 169a070..1ce6b86 100644 --- a/src/connect.c +++ b/src/connect.c @@ -576,6 +576,39 @@ virtDBusConnectGetCPUModelNames(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gret, 1); } +static void +virtDBusConnectGetDomainCapabilities(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *emulatorbin; + const gchar *arch; + const gchar *machine; + const gchar *virttype; + guint flags; + g_autofree gchar* domCapabilities = NULL; + + g_variant_get(inArgs, "(&s&s&s&su)", &emulatorbin, &arch, &machine, + &virttype, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + domCapabilities = virConnectGetDomainCapabilities(connect->connection, + emulatorbin, arch, + machine, virttype, + flags); + if (!domCapabilities) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(s)", domCapabilities); +} + static void virtDBusConnectGetSysinfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -817,6 +850,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "GetAllDomainStats", virtDBusConnectGetAllDomainStats }, { "GetCapabilities", virtDBusConnectGetCapabilities }, { "GetCPUModelNames", virtDBusConnectGetCPUModelNames }, + { "GetDomainCapabilities", virtDBusConnectGetDomainCapabilities }, { "GetSysinfo", virtDBusConnectGetSysinfo }, { "ListDomains", virtDBusConnectListDomains }, { "ListNetworks", virtDBusConnectListNetworks }, -- 2.15.0

On Thu, Apr 19, 2018 at 03:58:07PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 10 ++++++++++ src/connect.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Thu, Apr 19, 2018 at 03:58:07PM +0200, Katerina Koukiou wrote: s/GetDomainCapabilties/GetDomainCapabilities/ in $subject
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 10 ++++++++++ src/connect.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 43a6241..6f90822 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -113,6 +113,16 @@ <arg name="flags" type="u" direction="in"/> <arg name="models" type="as" direction="out"/> </method> + <method name="GetDomainCapabilities"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectGetDomainCapabilities"/> + <arg name="emulatorbin" type="s" direction="in"/> + <arg name="arch" type="s" direction="in"/> + <arg name="machine" type="s" direction="in"/> + <arg name="virttype" type="s" direction="in"/>
It's not documented but all of the for strings can be NULL/empty. Pavel
participants (3)
-
Ján Tomko
-
Katerina Koukiou
-
Pavel Hrdina