[libvirt] [dbus PATCH 00/15] Some more get APIs for Domain Interface

Katerina Koukiou (15): Implement GetTime method for Domain Interface Implement MigrateGetCompressionCache method for Domain Interface Implement GetBlockIoTune method for Domain Interface Implement GetBlockJobInfo method for Domain Interface Implement GetDiskErrors method for Domain Interface Impement GetFSInfo method for Domain Interface Implement GetGuestVcpus method for Domain interface Implement GetHostname method for Domain Interface Implement GetInterfaceParameters method for Domain Interface Implement GetIOThreadInfo method for Domain Interface Implement GetJobStats method for Domain Interface Implement GetMetadata method for Domain Interface Implement GetNumaParameters method for Domain Interface Implement GetPerfEvents method for Domain Interface Implement GetCPUStats method for Domain Interface data/org.libvirt.Domain.xml | 98 +++++++ src/domain.c | 665 ++++++++++++++++++++++++++++++++++++++++++++ tests/test_domain.py | 6 + 3 files changed, 769 insertions(+) -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index a57b05a..631dabb 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -201,6 +201,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="records" type="a{sv}" direction="out"/> </method> + <method name="GetTime"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetTime"/> + <arg name="flags" type="u" direction="in"/> + <arg name="time" type="(tu)" direction="out"/> + </method> <method name="GetVcpus"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetVcpusFlags"/> diff --git a/src/domain.c b/src/domain.c index 488760b..f6de3ac 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1054,6 +1054,33 @@ virtDBusDomainGetStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetTime(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + glong seconds; + guint nseconds; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainGetTime(domain, (long long *)&seconds, &nseconds, flags) < 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("((tu))", seconds, nseconds); +} + static void virtDBusDomainGetVcpus(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1935,6 +1962,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, { "GetStats", virtDBusDomainGetStats }, + { "GetTime", virtDBusDomainGetTime }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, { "HasManagedSaveImage", virtDBusDomainHasManagedSaveImage }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:16PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index a57b05a..631dabb 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -201,6 +201,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="records" type="a{sv}" direction="out"/> </method> + <method name="GetTime"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetTime"/> + <arg name="flags" type="u" direction="in"/> + <arg name="time" type="(tu)" direction="out"/> + </method> <method name="GetVcpus"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetVcpusFlags"/> diff --git a/src/domain.c b/src/domain.c index 488760b..f6de3ac 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1054,6 +1054,33 @@ virtDBusDomainGetStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); }
+static void +virtDBusDomainGetTime(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + glong seconds;
Per https://developer.gnome.org/glib/2.56/glib-Basic-Types.html#glong This is the equivalent of C's long type. For 'long long', gint64 should be used. Unless nobody cares about 32-bit architectures anymore, then Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
+ guint nseconds; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainGetTime(domain, (long long *)&seconds, &nseconds, flags) < 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("((tu))", seconds, nseconds); +} + static void virtDBusDomainGetVcpus(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED,

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 631dabb..2d8f6fe 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -254,6 +254,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="stats" type="a{st}" direction="out"/> </method> + <method name="MigrateGetCompressionCache"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateGetCompressionCache"/> + <arg name="flags" type="u" direction="in"/> + <arg name="cacheSize" type="t" direction="out"/> + </method> <method name="MigrateGetMaxDowntime"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateGetMaxDowntime"/> diff --git a/src/domain.c b/src/domain.c index f6de3ac..b61e9f1 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1301,6 +1301,35 @@ virtDBusDomainMemoryStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gstats, 1); } +static void +virtDBusDomainMigrateGetCompressionCache(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gulong cacheSize; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainMigrateGetCompressionCache(domain, + (unsigned long long *)&cacheSize, + flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + + *outArgs = g_variant_new("(t)", cacheSize); +} + static void virtDBusDomainMigrateGetMaxDowntime(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1971,6 +2000,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "ManagedSaveRemove", virtDBusDomainManagedSaveRemove }, { "MemoryPeek", virtDBusDomainMemoryPeek }, { "MemoryStats", virtDBusDomainMemoryStats }, + { "MigrateGetCompressionCache", virtDBusDomainMigrateGetCompressionCache }, { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, { "MigrateGetMaxSpeed", virtDBusDomainMigrateGetMaxSpeed }, { "MigrateSetCompressionCache", virtDBusDomainMigrateSetCompressionCache }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:17PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 2d8f6fe..6f80cc7 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -171,6 +171,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="BlkioParameters" type="a{sv}" direction="out"/> </method> + <method name="GetBlockIoTune"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlockIoTune"/> + <arg name="disk" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="blockIoTune" type="a{sv}" direction="out"/> + </method> <method name="GetControlInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetControlInfo"/> diff --git a/src/domain.c b/src/domain.c index b61e9f1..b4bdd34 100644 --- a/src/domain.c +++ b/src/domain.c @@ -866,6 +866,45 @@ virtDBusDomainGetBlkioParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetBlockIoTune(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + const gchar *disk; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(&su)", &disk, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetBlockIoTune(domain, disk, NULL, ¶ms.nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + if (ret == 0 && params.nparams != 0) { + params.params = g_new0(virTypedParameter, params.nparams); + if (virDomainGetBlockIoTune(domain, disk, params.params, + ¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + } + + grecords = virtDBusUtilTypedParamsToGVariant(params.params, params.nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + static void virtDBusDomainGetControlInfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1986,6 +2025,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "FSThaw", virtDBusDomainFSThaw }, { "FSTrim", virtDBusDomainFSTrim }, { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, + { "GetBlockIoTune", virtDBusDomainGetBlockIoTune }, { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:18PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 2d8f6fe..6f80cc7 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -171,6 +171,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="BlkioParameters" type="a{sv}" direction="out"/> </method> + <method name="GetBlockIoTune">
s/Io/IO/ it's capitalized in every API implemented so far
+ <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlockIoTune"/> + <arg name="disk" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="blockIoTune" type="a{sv}" direction="out"/>
here too
+ </method> <method name="GetControlInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetControlInfo"/>
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Wed, 2018-04-25 at 13:43 +0200, Ján Tomko wrote:
On Wed, Apr 25, 2018 at 12:20:18PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 2d8f6fe..6f80cc7 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -171,6 +171,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="BlkioParameters" type="a{sv}" direction="out"/> </method> + <method name="GetBlockIoTune">
s/Io/IO/
it's capitalized in every API implemented so far'
I follow the convention that I keep the method name as the original API name, apart from when there is the `Flags` suffix. Would you mind if we keep using this approach? Katerina
+ <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain .html#virDomainGetBlockIoTune"/>; + <arg name="disk" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="blockIoTune" type="a{sv}" direction="out"/>
here too
+ </method> <method name="GetControlInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain. html#virDomainGetControlInfo"/>;
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Jano

On Wed, Apr 25, 2018 at 02:58:12PM +0200, Katerina Koukiou wrote:
On Wed, 2018-04-25 at 13:43 +0200, Ján Tomko wrote:
On Wed, Apr 25, 2018 at 12:20:18PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 2d8f6fe..6f80cc7 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -171,6 +171,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="BlkioParameters" type="a{sv}" direction="out"/> </method> + <method name="GetBlockIoTune">
s/Io/IO/
it's capitalized in every API implemented so far'
I follow the convention that I keep the method name as the original API name, apart from when there is the `Flags` suffix. Would you mind if we keep using this approach?
Yes, I would mind. But the explanation makes sense. With or without the name change: Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 47 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 6f80cc7..c640bcb 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -178,6 +178,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="blockIoTune" type="a{sv}" direction="out"/> </method> + <method name="GetBlockJobInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlockJobInfo"/> + <arg name="disk" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="blockJobInfo" type="(sttt)" direction="out"/> + </method> <method name="GetControlInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetControlInfo"/> diff --git a/src/domain.c b/src/domain.c index b4bdd34..75d29c4 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,15 @@ #include <libvirt/libvirt.h> +VIRT_DBUS_ENUM_DECL(virtDBusDomainBlockJob) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainBlockJob, + VIR_DOMAIN_BLOCK_JOB_TYPE_LAST, + "unknown", + "pull", + "copy", + "commit", + "active-commit") + VIRT_DBUS_ENUM_DECL(virtDBusDomainControlErrorReason) VIRT_DBUS_ENUM_IMPL(virtDBusDomainControlErrorReason, VIR_DOMAIN_CONTROL_ERROR_REASON_LAST, @@ -905,6 +914,43 @@ virtDBusDomainGetBlockIoTune(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetBlockJobInfo(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + virDomainBlockJobInfo info; + const gchar *disk; + guint flags; + const gchar *blockJobTypeStr; + + g_variant_get(inArgs, "(&su)", &disk, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainGetBlockJobInfo(domain, disk, &info, flags) < 0) + return virtDBusUtilSetLastVirtError(error); + + blockJobTypeStr = virtDBusDomainBlockJobTypeToString(info.type); + if (!blockJobTypeStr) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't format virDomainBlockJobType '%d' to string.", + info.type); + return; + } + + *outArgs = g_variant_new("((sttt))", blockJobTypeStr, info.bandwidth, + info.cur, info.end); +} + static void virtDBusDomainGetControlInfo(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2026,6 +2072,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "FSTrim", virtDBusDomainFSTrim }, { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, { "GetBlockIoTune", virtDBusDomainGetBlockIoTune }, + { "GetBlockJobInfo", virtDBusDomainGetBlockJobInfo }, { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:19PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 47 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 61 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index c640bcb..fbf7140 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -191,6 +191,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="controlInfo" type="(sst)" direction="out"/> </method> + <method name="GetDiskErrors"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetDiskErrors"/> + <arg name="flags" type="u" direction="in"/> + <arg name="diskErrors" type="a(ss)" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 75d29c4..67ea260 100644 --- a/src/domain.c +++ b/src/domain.c @@ -28,6 +28,13 @@ VIRT_DBUS_ENUM_IMPL(virtDBusDomainControlState, "occupied", "error") +VIRT_DBUS_ENUM_DECL(virtDBusDomainDiskError) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainDiskError, + VIR_DOMAIN_DISK_ERROR_LAST, + "none", + "unspec", + "no-space") + VIRT_DBUS_ENUM_DECL(virtDBusDomainJob) VIRT_DBUS_ENUM_IMPL(virtDBusDomainJob, VIR_DOMAIN_JOB_LAST, @@ -996,6 +1003,59 @@ virtDBusDomainGetControlInfo(GVariant *inArgs, errorReasonStr, controlInfo->stateTime); } +static void +virtDBusDomainGetDiskErrors(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree virDomainDiskErrorPtr disks = NULL; + guint ndisks; + gint count; + guint flags; + GVariant *res; + GVariantBuilder builder; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + count = virDomainGetDiskErrors(domain, NULL, 0, 0); + if (count < 0) + return virtDBusUtilSetLastVirtError(error); + ndisks = count; + + if (ndisks) { + disks = g_new0(virDomainDiskError, ndisks); + + count = virDomainGetDiskErrors(domain, disks, ndisks, 0); + if (count < 0) + return virtDBusUtilSetLastVirtError(error); + } + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a(ss)")); + for (gint i = 0; i < count; i++) { + const gchar *err = virtDBusDomainDiskErrorTypeToString(disks[i].error); + + if (!err) + continue; + g_variant_builder_open(&builder, G_VARIANT_TYPE("(ss)")); + g_variant_builder_add(&builder, "s", disks[i].disk); + g_variant_builder_add(&builder, "s", err); + g_variant_builder_close(&builder); + } + res = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&res, 1); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2074,6 +2134,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetBlockIoTune", virtDBusDomainGetBlockIoTune }, { "GetBlockJobInfo", virtDBusDomainGetBlockJobInfo }, { "GetControlInfo", virtDBusDomainGetControlInfo }, + { "GetDiskErrors", virtDBusDomainGetDiskErrors }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:20PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 61 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index fbf7140..b7fa35f 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -197,6 +197,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="diskErrors" type="a(ss)" direction="out"/> </method> + <method name="GetFSInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetFSInfo"/> + <arg name="flags" type="u" direction="in"/> + <arg name="fsInfo" type="a(sssas)" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 67ea260..1156b84 100644 --- a/src/domain.c +++ b/src/domain.c @@ -66,6 +66,25 @@ VIRT_DBUS_ENUM_IMPL(virtDBusDomainMetadata, "title", "element") +struct _virtDBusDomainFSInfoList { + virDomainFSInfoPtr *info; + gint count; +}; + +typedef struct _virtDBusDomainFSInfoList virtDBusDomainFSInfoList; + +static void +virtDBusDomainFSInfoListFree(virtDBusDomainFSInfoList *info) +{ + for (gint i = 0; i < info->count; i++) + virDomainFSInfoFree(info->info[i]); + + g_free(info->info); +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virtDBusDomainFSInfoList, + virtDBusDomainFSInfoListFree); + static GVariant * virtDBusDomainMemoryStatsToGVariant(virDomainMemoryStatPtr stats, gint nr_stats) @@ -1056,6 +1075,52 @@ virtDBusDomainGetDiskErrors(GVariant *inArgs, *outArgs = g_variant_new_tuple(&res, 1); } +static void +virtDBusDomainGetFSInfo(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusDomainFSInfoList) info = { 0 }; + GVariantBuilder builder; + guint flags; + GVariant *gret; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + info.count = virDomainGetFSInfo(domain, &info.info, flags); + if (info.count < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a(sssas)")); + + for (gint i = 0; i < info.count; i++) { + g_variant_builder_open(&builder, G_VARIANT_TYPE("(sssas)")); + g_variant_builder_add(&builder, "s", info.info[i]->mountpoint); + g_variant_builder_add(&builder, "s", info.info[i]->name); + g_variant_builder_add(&builder, "s", info.info[i]->fstype); + + g_variant_builder_open(&builder, G_VARIANT_TYPE("as")); + for (guint j = 0; j < info.info[i]->ndevAlias; j++) { + g_variant_builder_add(&builder, "s", info.info[i]->devAlias[j]); + g_variant_builder_close(&builder); + } + g_variant_builder_close(&builder); + } + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2135,6 +2200,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetBlockJobInfo", virtDBusDomainGetBlockJobInfo }, { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetDiskErrors", virtDBusDomainGetDiskErrors }, + { "GetFSInfo", virtDBusDomainGetFSInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 2.15.0

On Wed, 2018-04-25 at 12:20 +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+)
s/Impement/Implement Typo in commit msg allready fixed.

On Wed, Apr 25, 2018 at 12:20:21PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index fbf7140..b7fa35f 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -197,6 +197,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="diskErrors" type="a(ss)" direction="out"/> </method> + <method name="GetFSInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetFSInfo"/> + <arg name="flags" type="u" direction="in"/> + <arg name="fsInfo" type="a(sssas)" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 67ea260..1156b84 100644 --- a/src/domain.c +++ b/src/domain.c @@ -66,6 +66,25 @@ VIRT_DBUS_ENUM_IMPL(virtDBusDomainMetadata, "title", "element")
+struct _virtDBusDomainFSInfoList { + virDomainFSInfoPtr *info; + gint count; +}; + +typedef struct _virtDBusDomainFSInfoList virtDBusDomainFSInfoList; + +static void +virtDBusDomainFSInfoListFree(virtDBusDomainFSInfoList *info)
This should be named virtDBusDomainFSInfoListClear() because it doesn't free the virtDBusDomainFSInfoList structure itself, it frees the content.
+{ + for (gint i = 0; i < info->count; i++) + virDomainFSInfoFree(info->info[i]); + + g_free(info->info); +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virtDBusDomainFSInfoList, + virtDBusDomainFSInfoListFree); + static GVariant * virtDBusDomainMemoryStatsToGVariant(virDomainMemoryStatPtr stats, gint nr_stats) @@ -1056,6 +1075,52 @@ virtDBusDomainGetDiskErrors(GVariant *inArgs, *outArgs = g_variant_new_tuple(&res, 1); }
+static void +virtDBusDomainGetFSInfo(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusDomainFSInfoList) info = { 0 }; + GVariantBuilder builder; + guint flags; + GVariant *gret; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + info.count = virDomainGetFSInfo(domain, &info.info, flags); + if (info.count < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a(sssas)")); + + for (gint i = 0; i < info.count; i++) { + g_variant_builder_open(&builder, G_VARIANT_TYPE("(sssas)")); + g_variant_builder_add(&builder, "s", info.info[i]->mountpoint); + g_variant_builder_add(&builder, "s", info.info[i]->name); + g_variant_builder_add(&builder, "s", info.info[i]->fstype); + + g_variant_builder_open(&builder, G_VARIANT_TYPE("as")); + for (guint j = 0; j < info.info[i]->ndevAlias; j++) { + g_variant_builder_add(&builder, "s", info.info[i]->devAlias[j]); + g_variant_builder_close(&builder);
The g_variant_builder_close() needs to be outside of the for loop otherwise you will close the container multiple times for only one g_variant_builder_open() call. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index b7fa35f..343fc08 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -203,6 +203,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="fsInfo" type="a(sssas)" direction="out"/> </method> + <method name="GetGuestVcpus"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetGuestVcpus"/> + <arg name="flags" type="u" direction="in"/> + <arg name="vcpus" type="a{sv}" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 1156b84..7b0d6c4 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1121,6 +1121,37 @@ virtDBusDomainGetFSInfo(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gret, 1); } +static void +virtDBusDomainGetGuestVcpus(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainGetGuestVcpus(domain, ¶ms.params, + (guint *)¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + + grecords = virtDBusUtilTypedParamsToGVariant(params.params, params.nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2201,6 +2232,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetControlInfo", virtDBusDomainGetControlInfo }, { "GetDiskErrors", virtDBusDomainGetDiskErrors }, { "GetFSInfo", virtDBusDomainGetFSInfo }, + { "GetGuestVcpus", virtDBusDomainGetGuestVcpus }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:22PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 343fc08..1324db8 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -209,6 +209,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="vcpus" type="a{sv}" direction="out"/> </method> + <method name="GetHostname"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetHostname"/> + <arg name="flags" type="u" direction="in"/> + <arg name="hostname" type="s" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 7b0d6c4..18ca7aa 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1152,6 +1152,33 @@ virtDBusDomainGetGuestVcpus(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetHostname(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree gchar *hostname = NULL; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + hostname = virDomainGetHostname(domain, flags); + if (!hostname) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(s)", hostname); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2233,6 +2260,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetDiskErrors", virtDBusDomainGetDiskErrors }, { "GetFSInfo", virtDBusDomainGetFSInfo }, { "GetGuestVcpus", virtDBusDomainGetGuestVcpus }, + { "GetHostname", virtDBusDomainGetHostname }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:23PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 343fc08..1324db8 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -209,6 +209,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="vcpus" type="a{sv}" direction="out"/> </method> + <method name="GetHostname"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetHostname"/> + <arg name="flags" type="u" direction="in"/> + <arg name="hostname" type="s" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/>
The code looks good to me, but the API is only supported by the openvz driver: https://libvirt.org/hvsupport.html Is it worth exposing? Jano

On Wed, Apr 25, 2018 at 13:15:06 +0200, Ján Tomko wrote:
On Wed, Apr 25, 2018 at 12:20:23PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 343fc08..1324db8 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -209,6 +209,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="vcpus" type="a{sv}" direction="out"/> </method> + <method name="GetHostname"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetHostname"/> + <arg name="flags" type="u" direction="in"/> + <arg name="hostname" type="s" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/>
The code looks good to me, but the API is only supported by the openvz driver: https://libvirt.org/hvsupport.html Is it worth exposing?
It might: https://bugzilla.redhat.com/show_bug.cgi?id=1515831 [RFE] Add API to access guest-get-hostname from QEMU-GA

On Wed, Apr 25, 2018 at 01:22:40PM +0200, Peter Krempa wrote:
On Wed, Apr 25, 2018 at 13:15:06 +0200, Ján Tomko wrote:
On Wed, Apr 25, 2018 at 12:20:23PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 343fc08..1324db8 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -209,6 +209,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="vcpus" type="a{sv}" direction="out"/> </method> + <method name="GetHostname"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetHostname"/> + <arg name="flags" type="u" direction="in"/> + <arg name="hostname" type="s" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/>
The code looks good to me, but the API is only supported by the openvz driver: https://libvirt.org/hvsupport.html Is it worth exposing?
It might: https://bugzilla.redhat.com/show_bug.cgi?id=1515831 [RFE] Add API to access guest-get-hostname from QEMU-GA
Okay then: Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 1324db8..84ef3bf 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -215,6 +215,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="hostname" type="s" direction="out"/> </method> + <method name="GetInterfaceParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetInterfaceParameters"/> + <arg name="device" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="interfaceParameters" type="a{sv}" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 18ca7aa..3c1fec7 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1179,6 +1179,46 @@ virtDBusDomainGetHostname(GVariant *inArgs, *outArgs = g_variant_new("(s)", hostname); } +static void +virtDBusDomainGetInterfaceParameters(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + const gchar *device; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(&su)", &device, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetInterfaceParameters(domain, device, NULL, + ¶ms.nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + if (ret == 0 && params.nparams != 0) { + params.params = g_new0(virTypedParameter, params.nparams); + if (virDomainGetInterfaceParameters(domain, device, params.params, + ¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + } + + grecords = virtDBusUtilTypedParamsToGVariant(params.params, params.nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2261,6 +2301,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetFSInfo", virtDBusDomainGetFSInfo }, { "GetGuestVcpus", virtDBusDomainGetGuestVcpus }, { "GetHostname", virtDBusDomainGetHostname }, + { "GetInterfaceParameters", virtDBusDomainGetInterfaceParameters }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:24PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 7 +++++++ src/domain.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 1324db8..84ef3bf 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -215,6 +215,13 @@ <arg name="flags" type="u" direction="in"/> <arg name="hostname" type="s" direction="out"/> </method> + <method name="GetInterfaceParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetInterfaceParameters"/> + <arg name="device" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="interfaceParameters" type="a{sv}" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 18ca7aa..3c1fec7 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1179,6 +1179,46 @@ virtDBusDomainGetHostname(GVariant *inArgs, *outArgs = g_variant_new("(s)", hostname); }
+static void +virtDBusDomainGetInterfaceParameters(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + const gchar *device; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(&su)", &device, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetInterfaceParameters(domain, device, NULL, + ¶ms.nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + if (ret == 0 && params.nparams != 0) {
There is no need to check the 'ret' variable here. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 64 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 84ef3bf..bda63f4 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -222,6 +222,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="interfaceParameters" type="a{sv}" direction="out"/> </method> + <method name="GetIOThreadInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetIOThreadInfo"/> + <arg name="flags" type="u" direction="in"/> + <arg name="ioThreadInfo" type="a(uay)" direction="out"/> + </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 3c1fec7..f611fbf 100644 --- a/src/domain.c +++ b/src/domain.c @@ -85,6 +85,25 @@ virtDBusDomainFSInfoListFree(virtDBusDomainFSInfoList *info) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virtDBusDomainFSInfoList, virtDBusDomainFSInfoListFree); +struct _virtDBusDomainIOThreadInfoList { + virDomainIOThreadInfoPtr *info; + gint count; +}; + +typedef struct _virtDBusDomainIOThreadInfoList virtDBusDomainIOThreadInfoList; + +static void +virtDBusDomainIOThreadInfoListFree(virtDBusDomainIOThreadInfoList *info) +{ + for (gint i = 0; i < info->count; i++) + virDomainIOThreadInfoFree(info->info[i]); + + g_free(info->info); +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virtDBusDomainIOThreadInfoList, + virtDBusDomainIOThreadInfoListFree); + static GVariant * virtDBusDomainMemoryStatsToGVariant(virDomainMemoryStatPtr stats, gint nr_stats) @@ -1219,6 +1238,50 @@ virtDBusDomainGetInterfaceParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetIOThreadInfo(GVariant *inArgs G_GNUC_UNUSED, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusDomainIOThreadInfoList) info = { 0 }; + GVariantBuilder builder; + guint flags; + GVariant *gret; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + info.count = virDomainGetIOThreadInfo(domain, &info.info, flags); + if (info.count < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a(uay)")); + + for (gint i = 0; i < info.count; i++) { + g_variant_builder_open(&builder, G_VARIANT_TYPE("(uay)")); + g_variant_builder_add(&builder, "u", info.info[i]->iothread_id); + + g_variant_builder_open(&builder, G_VARIANT_TYPE("ay")); + for (gint j = 0; j < info.info[i]->cpumaplen; j++) { + g_variant_builder_add(&builder, "y", info.info[i]->cpumap[j]); + g_variant_builder_close(&builder); + } + g_variant_builder_close(&builder); + } + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2302,6 +2365,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetGuestVcpus", virtDBusDomainGetGuestVcpus }, { "GetHostname", virtDBusDomainGetHostname }, { "GetInterfaceParameters", virtDBusDomainGetInterfaceParameters }, + { "GetIOThreadInfo", virtDBusDomainGetIOThreadInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:25PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 +++++ src/domain.c | 64 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 84ef3bf..bda63f4 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -222,6 +222,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="interfaceParameters" type="a{sv}" direction="out"/> </method> + <method name="GetIOThreadInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetIOThreadInfo"/> + <arg name="flags" type="u" direction="in"/> + <arg name="ioThreadInfo" type="a(uay)" direction="out"/>
This returns cpumap for the iothread and we've decided that cpumap should be represented as an array of boolean.
+ </method> <method name="GetJobInfo"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> diff --git a/src/domain.c b/src/domain.c index 3c1fec7..f611fbf 100644 --- a/src/domain.c +++ b/src/domain.c @@ -85,6 +85,25 @@ virtDBusDomainFSInfoListFree(virtDBusDomainFSInfoList *info) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virtDBusDomainFSInfoList, virtDBusDomainFSInfoListFree);
+struct _virtDBusDomainIOThreadInfoList { + virDomainIOThreadInfoPtr *info; + gint count; +}; + +typedef struct _virtDBusDomainIOThreadInfoList virtDBusDomainIOThreadInfoList; + +static void +virtDBusDomainIOThreadInfoListFree(virtDBusDomainIOThreadInfoList *info)
virtDBusDomainIOThreadInfoListClear instead
+{ + for (gint i = 0; i < info->count; i++) + virDomainIOThreadInfoFree(info->info[i]); + + g_free(info->info); +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virtDBusDomainIOThreadInfoList, + virtDBusDomainIOThreadInfoListFree); + static GVariant * virtDBusDomainMemoryStatsToGVariant(virDomainMemoryStatPtr stats, gint nr_stats) @@ -1219,6 +1238,50 @@ virtDBusDomainGetInterfaceParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); }
+static void +virtDBusDomainGetIOThreadInfo(GVariant *inArgs G_GNUC_UNUSED,
inArgs is used
+ GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusDomainIOThreadInfoList) info = { 0 }; + GVariantBuilder builder; + guint flags; + GVariant *gret; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + info.count = virDomainGetIOThreadInfo(domain, &info.info, flags); + if (info.count < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a(uay)")); + + for (gint i = 0; i < info.count; i++) { + g_variant_builder_open(&builder, G_VARIANT_TYPE("(uay)")); + g_variant_builder_add(&builder, "u", info.info[i]->iothread_id); + + g_variant_builder_open(&builder, G_VARIANT_TYPE("ay")); + for (gint j = 0; j < info.info[i]->cpumaplen; j++) { + g_variant_builder_add(&builder, "y", info.info[i]->cpumap[j]); + g_variant_builder_close(&builder);
g_variant_builder_close() needs to be outside of the for loop
+ } + g_variant_builder_close(&builder); + } + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2302,6 +2365,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetGuestVcpus", virtDBusDomainGetGuestVcpus }, { "GetHostname", virtDBusDomainGetHostname }, { "GetInterfaceParameters", virtDBusDomainGetInterfaceParameters }, + { "GetIOThreadInfo", virtDBusDomainGetIOThreadInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, -- 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.Domain.xml | 6 ++++++ src/domain.c | 48 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index bda63f4..168820b 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -233,6 +233,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> <arg name="jobInfo" type="(sttttttttttt)" direction="out"/> </method> + <method name="GetJobStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobStats"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="(sa{sv})" direction="out"/> + </method> <method name="GetMemoryParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetMemoryParameters"/> diff --git a/src/domain.c b/src/domain.c index f611fbf..05ea680 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1319,6 +1319,53 @@ virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, jobInfo->fileRemaining); } +static void +virtDBusDomainGetJobStats(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + const gchar *typeStr; + gint type; + GVariant *grecords; + GVariantBuilder builder; + GVariant *gret; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainGetJobStats(domain, &type, ¶ms.params, + ¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + + grecords = virtDBusUtilTypedParamsToGVariant(params.params, params.nparams); + + typeStr = virtDBusDomainJobTypeToString(type); + if (!typeStr) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't format virDomainJobType '%d' to string.", type); + return; + } + + g_variant_builder_init(&builder, G_VARIANT_TYPE("(sa{sv})")); + g_variant_builder_add(&builder, "s", typeStr); + g_variant_builder_add_value(&builder, grecords); + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusDomainGetMemoryParameters(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2367,6 +2414,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetInterfaceParameters", virtDBusDomainGetInterfaceParameters }, { "GetIOThreadInfo", virtDBusDomainGetIOThreadInfo }, { "GetJobInfo", virtDBusDomainGetJobInfo }, + { "GetJobStats", virtDBusDomainGetJobStats }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, { "GetStats", virtDBusDomainGetStats }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:26PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 48 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 41 +++++++++++++++++++++++++++++++++++++++++ tests/test_domain.py | 6 ++++++ 3 files changed, 56 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 168820b..5557030 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -245,6 +245,15 @@ <arg name="flags" type="u" direction="in"/> <arg name="memoryParameters" type="a{sv}" direction="out"/> </method> + <method name="GetMetadata"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetMetadata + Empty string can be used to pass a NULL as @uri argument."/> + <arg name="type" type="s" direction="in"/> + <arg name="uri" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="metadata" type="s" direction="out"/> + </method> <method name="GetSchedulerParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetSchedulerParametersFlags"/> diff --git a/src/domain.c b/src/domain.c index 05ea680..4cd6a4f 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1402,6 +1402,46 @@ virtDBusDomainGetMemoryParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetMetadata(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *typeStr; + gint type; + const gchar *uri; + guint flags; + g_autofree gchar *ret = NULL; + + g_variant_get(inArgs, "(&s&su)", &typeStr, &uri, &flags); + if (g_str_equal(uri, "")) + uri = NULL; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + type = virtDBusDomainMetadataTypeFromString(typeStr); + if (type < 0) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't get valid virDomainMetadataType from string '%s'.", + typeStr); + return; + } + + ret = virDomainGetMetadata(domain, type, uri, flags); + if (!ret) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(s)", ret); +} + static void virtDBusDomainGetSchedulerParameters(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2416,6 +2456,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetJobStats", virtDBusDomainGetJobStats }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, + { "GetMetadata", virtDBusDomainGetMetadata }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, { "GetStats", virtDBusDomainGetStats }, { "GetTime", virtDBusDomainGetTime }, diff --git a/tests/test_domain.py b/tests/test_domain.py index f2ae215..d0cebcd 100755 --- a/tests/test_domain.py +++ b/tests/test_domain.py @@ -63,6 +63,12 @@ class TestDomain(libvirttest.BaseTestClass): self.main_loop() + def test_domain_metadata(self): + obj, domain = self.domain() + description_expected = "This is the Test domain" + domain.SetMetadata('description', description_expected, "", "", 0) + assert description_expected == domain.GetMetadata('description', "", 0) + def test_resume(self): def domain_resumed(path, _event): assert isinstance(path, dbus.ObjectPath) -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:27PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 9 +++++++++ src/domain.c | 41 +++++++++++++++++++++++++++++++++++++++++ tests/test_domain.py | 6 ++++++ 3 files changed, 56 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 5557030..19ec861 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -254,6 +254,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="metadata" type="s" direction="out"/> </method> + <method name="GetNumaParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetNumaParameters"/> + <arg name="flags" type="u" direction="in"/> + <arg name="numaParameters" type="a{sv}" direction="out"/> + </method> <method name="GetSchedulerParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetSchedulerParametersFlags"/> diff --git a/src/domain.c b/src/domain.c index 4cd6a4f..0df2b23 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1442,6 +1442,44 @@ virtDBusDomainGetMetadata(GVariant *inArgs, *outArgs = g_variant_new("(s)", ret); } +static void +virtDBusDomainGetNumaParameters(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetNumaParameters(domain, NULL, ¶ms.nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + if (ret == 0 && params.nparams != 0) { + params.params = g_new0(virTypedParameter, params.nparams); + if (virDomainGetNumaParameters(domain, params.params, + ¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + } + + grecords = virtDBusUtilTypedParamsToGVariant(params.params, params.nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + static void virtDBusDomainGetSchedulerParameters(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2457,6 +2495,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetJobStats", virtDBusDomainGetJobStats }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetMetadata", virtDBusDomainGetMetadata }, + { "GetNumaParameters", virtDBusDomainGetNumaParameters }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, { "GetStats", virtDBusDomainGetStats }, { "GetTime", virtDBusDomainGetTime }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:28PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 5557030..19ec861 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -254,6 +254,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="metadata" type="s" direction="out"/> </method> + <method name="GetNumaParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetNumaParameters"/> + <arg name="flags" type="u" direction="in"/> + <arg name="numaParameters" type="a{sv}" direction="out"/> + </method> <method name="GetSchedulerParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetSchedulerParametersFlags"/> diff --git a/src/domain.c b/src/domain.c index 4cd6a4f..0df2b23 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1442,6 +1442,44 @@ virtDBusDomainGetMetadata(GVariant *inArgs, *outArgs = g_variant_new("(s)", ret); }
+static void +virtDBusDomainGetNumaParameters(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetNumaParameters(domain, NULL, ¶ms.nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + if (ret == 0 && params.nparams != 0) {
No need to check for 'ret' here. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 19ec861..8d027dd 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -260,6 +260,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="numaParameters" type="a{sv}" direction="out"/> </method> + <method name="GetPerfEvents"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetPerfEvents"/> + <arg name="flags" type="u" direction="in"/> + <arg name="perfEvents" type="a{sv}" direction="out"/> + </method> <method name="GetSchedulerParameters"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetSchedulerParametersFlags"/> diff --git a/src/domain.c b/src/domain.c index 0df2b23..608f1d1 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1480,6 +1480,37 @@ virtDBusDomainGetNumaParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetPerfEvents(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainGetPerfEvents(domain, ¶ms.params, + ¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + + grecords = virtDBusUtilTypedParamsToGVariant(params.params, params.nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + static void virtDBusDomainGetSchedulerParameters(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2496,6 +2527,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetMetadata", virtDBusDomainGetMetadata }, { "GetNumaParameters", virtDBusDomainGetNumaParameters }, + { "GetPerfEvents", virtDBusDomainGetPerfEvents }, { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, { "GetStats", virtDBusDomainGetStats }, { "GetTime", virtDBusDomainGetTime }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:29PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++ src/domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 8d027dd..9292a91 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -191,6 +191,14 @@ <arg name="flags" type="u" direction="in"/> <arg name="controlInfo" type="(sst)" direction="out"/> </method> + <method name="GetCPUStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetCPUStats + @total should be set to get total stats instead of per-cpu stats."/> + <arg name="total" type="b" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="a(sa{sv})" direction="out"/> + </method> <method name="GetDiskErrors"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetDiskErrors"/> diff --git a/src/domain.c b/src/domain.c index 608f1d1..1c09cc9 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,8 @@ #include <libvirt/libvirt.h> +#define VIRT_DBUS_DOMAIN_MAX_CPUS 128 + VIRT_DBUS_ENUM_DECL(virtDBusDomainBlockJob) VIRT_DBUS_ENUM_IMPL(virtDBusDomainBlockJob, VIR_DOMAIN_BLOCK_JOB_TYPE_LAST, @@ -1041,6 +1043,71 @@ virtDBusDomainGetControlInfo(GVariant *inArgs, errorReasonStr, controlInfo->stateTime); } +static void +virtDBusDomainGetCPUStats(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + gint startCPU = 0; + guint ncpus = VIRT_DBUS_DOMAIN_MAX_CPUS; + gboolean total; + guint flags; + GVariant *gret; + GVariantBuilder builder; + gint ret; + + g_variant_get(inArgs, "(bu)", &total, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (total) { + startCPU = -1; + ncpus = 1; + } + params.nparams = virDomainGetCPUStats(domain, NULL, 0, 0, 1, flags); + if (params.nparams < 0) + return virtDBusUtilSetLastVirtError(error); + params.params = g_new0(virTypedParameter, ncpus * params.nparams + 1); + + ret = virDomainGetCPUStats(domain, params.params, params.nparams, + startCPU, ncpus, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a(sa{sv})")); + + for (guint i = 0; i < ncpus; i++) { + GVariant *grecords; + g_autofree gchar *name = NULL; + + if (params.params[i * params.nparams].type == 0) + continue; + + g_variant_builder_open(&builder, G_VARIANT_TYPE("(sa{sv})")); + grecords = virtDBusUtilTypedParamsToGVariant(params.params + i*params.nparams, + params.nparams); + if (!total) + name = g_strdup_printf("CPU%d", i + startCPU); + else + name = g_strdup_printf("Total"); + g_variant_builder_add(&builder, "s", name); + g_variant_builder_add_value(&builder, grecords); + g_variant_builder_close(&builder); + } + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusDomainGetDiskErrors(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -2516,6 +2583,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetBlockIoTune", virtDBusDomainGetBlockIoTune }, { "GetBlockJobInfo", virtDBusDomainGetBlockJobInfo }, { "GetControlInfo", virtDBusDomainGetControlInfo }, + { "GetCPUStats", virtDBusDomainGetCPUStats }, { "GetDiskErrors", virtDBusDomainGetDiskErrors }, { "GetFSInfo", virtDBusDomainGetFSInfo }, { "GetGuestVcpus", virtDBusDomainGetGuestVcpus }, -- 2.15.0

On Wed, Apr 25, 2018 at 12:20:30PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++ src/domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 8d027dd..9292a91 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -191,6 +191,14 @@ <arg name="flags" type="u" direction="in"/> <arg name="controlInfo" type="(sst)" direction="out"/> </method> + <method name="GetCPUStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetCPUStats + @total should be set to get total stats instead of per-cpu stats."/>
I would rephrase it: "If @total is True, it returns total cpu stats, otherwise it returns per-cpu stats."
+ <arg name="total" type="b" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="a(sa{sv})" direction="out"/> + </method> <method name="GetDiskErrors"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetDiskErrors"/> diff --git a/src/domain.c b/src/domain.c index 608f1d1..1c09cc9 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,8 @@
#include <libvirt/libvirt.h>
+#define VIRT_DBUS_DOMAIN_MAX_CPUS 128 + VIRT_DBUS_ENUM_DECL(virtDBusDomainBlockJob) VIRT_DBUS_ENUM_IMPL(virtDBusDomainBlockJob, VIR_DOMAIN_BLOCK_JOB_TYPE_LAST, @@ -1041,6 +1043,71 @@ virtDBusDomainGetControlInfo(GVariant *inArgs, errorReasonStr, controlInfo->stateTime); }
+static void +virtDBusDomainGetCPUStats(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + gint startCPU = 0; + guint ncpus = VIRT_DBUS_DOMAIN_MAX_CPUS; + gboolean total; + guint flags; + GVariant *gret; + GVariantBuilder builder; + gint ret; + + g_variant_get(inArgs, "(bu)", &total, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return;
So this libvirt API has really stupid design and it's super complicated, I'm considering dropping it completely since the only benefit of this API is that you can get per host cpu statistic for specific domain. However, if we decide to keep it, it has to be rewritten. Currently the code would report only first 128 host CPUs which is not correct. You can look at libvirt-python implementation [1] of this API to get the idea of how it needs to be done, basically if there is more than 128 host CPUs, the virDomainGetCPUStats() needs to be called multiple times to get all statistics. [1] libvirt-override.c (libvirt_virDomainGetCPUStats) Pavel

On Wed, 2018-04-25 at 18:33 +0200, Pavel Hrdina wrote:
On Wed, Apr 25, 2018 at 12:20:30PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 8 ++++++ src/domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 8d027dd..9292a91 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -191,6 +191,14 @@ <arg name="flags" type="u" direction="in"/> <arg name="controlInfo" type="(sst)" direction="out"/> </method> + <method name="GetCPUStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain .html#virDomainGetCPUStats + @total should be set to get total stats instead of per-cpu stats."/>
I would rephrase it:
"If @total is True, it returns total cpu stats, otherwise it returns per-cpu stats."
+ <arg name="total" type="b" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="a(sa{sv})" direction="out"/> + </method> <method name="GetDiskErrors"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain .html#virDomainGetDiskErrors"/>; diff --git a/src/domain.c b/src/domain.c index 608f1d1..1c09cc9 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,8 @@
#include <libvirt/libvirt.h>
+#define VIRT_DBUS_DOMAIN_MAX_CPUS 128 + VIRT_DBUS_ENUM_DECL(virtDBusDomainBlockJob) VIRT_DBUS_ENUM_IMPL(virtDBusDomainBlockJob, VIR_DOMAIN_BLOCK_JOB_TYPE_LAST, @@ -1041,6 +1043,71 @@ virtDBusDomainGetControlInfo(GVariant *inArgs, errorReasonStr, controlInfo-
stateTime); }
+static void +virtDBusDomainGetCPUStats(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + gint startCPU = 0; + guint ncpus = VIRT_DBUS_DOMAIN_MAX_CPUS; + gboolean total; + guint flags; + GVariant *gret; + GVariantBuilder builder; + gint ret; + + g_variant_get(inArgs, "(bu)", &total, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return;
So this libvirt API has really stupid design and it's super complicated, I'm considering dropping it completely since the only benefit of this API is that you can get per host cpu statistic for specific domain.
However, if we decide to keep it, it has to be rewritten. Currently the code would report only first 128 host CPUs which is not correct.
You can look at libvirt-python implementation [1] of this API to get the idea of how it needs to be done, basically if there is more than 128 host CPUs, the virDomainGetCPUStats() needs to be called multiple times to get all statistics.
[1] libvirt-override.c (libvirt_virDomainGetCPUStats)
Pavel
Thanks for the heads up. So, I 'll drop it for now and I 'll leave it for future. Katerina
participants (4)
-
Ján Tomko
-
Katerina Koukiou
-
Pavel Hrdina
-
Peter Krempa