[libvirt] [dbus PATCH v2 0/9] NodeAPIs for Connect Interface

Changes from v1: * Added tests were the test driver exported the relevant API * Removed NodeGetCellsFreeMemory which will be sent in seperate patchset * Adjusted other comments from review Katerina Koukiou (9): Implement NodeGetCPUStats method for Connect Interface Implement NodeGetFreeMemory method for Connect Interface Implement NodeGetInfo method for Connect Interface Implement NodeGetMemoryParameters method in Connect Interface Implement NodeGetMemoryStats method for Connect Interface Implement NodeGetSecurityModel method for Domain Interface Implement NodeSetMemoryParameters method for Connect Interface Implement NodeSuspendForDuration method for Connect Interface Implement NodeGetCPUMap method for Connect Interface data/org.libvirt.Connect.xml | 54 ++++++++ src/connect.c | 303 +++++++++++++++++++++++++++++++++++++++++++ tests/test_connect.py | 16 +++ 3 files changed, 373 insertions(+) -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 41 +++++++++++++++++++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 52 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index ee7bfdc..e5c18bd 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -166,6 +166,13 @@ <arg name="uuid" type="s" direction="in"/> <arg name="network" type="o" direction="out"/> </method> + <method name="NodeGetCPUStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetCPUStats"/> + <arg name="cpuNum" type="i" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="cpuStats" type="a{st}" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index 5e577e4..6d0243f 100644 --- a/src/connect.c +++ b/src/connect.c @@ -842,6 +842,46 @@ virtDBusConnectNetworkLookupByUUID(GVariant *inArgs, *outArgs = g_variant_new("(o)", path); } +static void +virtDBusConnectNodeGetCPUStats(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; + gint cpuNum; + guint flags; + g_autofree virNodeCPUStatsPtr stats = NULL; + gint count = 0; + gint ret; + GVariant *gret; + GVariantBuilder builder; + + g_variant_get(inArgs, "(iu)", &cpuNum, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virNodeGetCPUStats(connect->connection, cpuNum, NULL, &count, flags); + if (ret == 0 && count != 0) { + stats = g_new0(virNodeCPUStats, count); + if (virNodeGetCPUStats(connect->connection, cpuNum, stats, + &count, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + } + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{st}")); + for (gint i = 0; i < count; i++) + g_variant_builder_add(&builder, "{st}", stats[i].field, stats[i].value); + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -873,6 +913,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NetworkDefineXML", virtDBusConnectNetworkDefineXML }, { "NetworkLookupByName", virtDBusConnectNetworkLookupByName }, { "NetworkLookupByUUID", virtDBusConnectNetworkLookupByUUID }, + { "NodeGetCPUStats", virtDBusConnectNodeGetCPUStats }, { 0 } }; diff --git a/tests/test_connect.py b/tests/test_connect.py index 57f0658..1383cc0 100755 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -156,6 +156,10 @@ class TestConnect(libvirttest.BaseTestClass): path = getattr(self.connect, lookup_method_name)(prop) assert original_path == path + def test_connect_node_get_cpu_stats(self): + stats = self.connect.NodeGetCPUStats(0, 0) + assert isinstance(stats, dbus.Dictionary) + if __name__ == '__main__': libvirttest.run() -- 2.15.0

On Wed, May 02, 2018 at 12:34:38PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 7 +++++++ src/connect.c | 41 +++++++++++++++++++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 52 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index ee7bfdc..e5c18bd 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -166,6 +166,13 @@ <arg name="uuid" type="s" direction="in"/> <arg name="network" type="o" direction="out"/> </method> + <method name="NodeGetCPUStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetCPUStats"/> + <arg name="cpuNum" type="i" direction="in"/> + <arg name="flags" type="u" direction="in"/> + <arg name="cpuStats" type="a{st}" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index 5e577e4..6d0243f 100644 --- a/src/connect.c +++ b/src/connect.c @@ -842,6 +842,46 @@ virtDBusConnectNetworkLookupByUUID(GVariant *inArgs, *outArgs = g_variant_new("(o)", path); }
+static void +virtDBusConnectNodeGetCPUStats(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; + gint cpuNum; + guint flags; + g_autofree virNodeCPUStatsPtr stats = NULL; + gint count = 0; + gint ret; + GVariant *gret; + GVariantBuilder builder; + + g_variant_get(inArgs, "(iu)", &cpuNum, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virNodeGetCPUStats(connect->connection, cpuNum, NULL, &count, flags);
This API can return -1 in case of error, we need to check it.
+ if (ret == 0 && count != 0) {
and the 'ret == 0' can be removed here. Reviewed-by: Pavel Hrdina <phrdina@redhat.com> with this diff applied: diff --git a/src/connect.c b/src/connect.c index 6d0243f..dd1d172 100644 --- a/src/connect.c +++ b/src/connect.c @@ -866,7 +866,10 @@ virtDBusConnectNodeGetCPUStats(GVariant *inArgs, return; ret = virNodeGetCPUStats(connect->connection, cpuNum, NULL, &count, flags); - if (ret == 0 && count != 0) { + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + + if (count != 0) { stats = g_new0(virNodeCPUStats, count); if (virNodeGetCPUStats(connect->connection, cpuNum, stats, &count, flags) < 0) {

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 5 +++++ src/connect.c | 24 ++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 33 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index e5c18bd..c642aff 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -173,6 +173,11 @@ <arg name="flags" type="u" direction="in"/> <arg name="cpuStats" type="a{st}" direction="out"/> </method> + <method name="NodeGetFreeMemory"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetFreeMemory"/> + <arg name="freemem" type="t" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index 6d0243f..b161925 100644 --- a/src/connect.c +++ b/src/connect.c @@ -882,6 +882,29 @@ virtDBusConnectNodeGetCPUStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gret, 1); } +static void +virtDBusConnectNodeGetFreeMemory(GVariant *inArgs G_GNUC_UNUSED, + 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; + guint64 freemem; + + if (!virtDBusConnectOpen(connect, error)) + return; + + freemem = virNodeGetFreeMemory(connect->connection); + if (freemem == 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(t)", freemem); +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -914,6 +937,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NetworkLookupByName", virtDBusConnectNetworkLookupByName }, { "NetworkLookupByUUID", virtDBusConnectNetworkLookupByUUID }, { "NodeGetCPUStats", virtDBusConnectNodeGetCPUStats }, + { "NodeGetFreeMemory", virtDBusConnectNodeGetFreeMemory }, { 0 } }; diff --git a/tests/test_connect.py b/tests/test_connect.py index 1383cc0..7b9ad0d 100755 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -160,6 +160,10 @@ class TestConnect(libvirttest.BaseTestClass): stats = self.connect.NodeGetCPUStats(0, 0) assert isinstance(stats, dbus.Dictionary) + def test_connect_node_get_free_memory(self): + free_mem = self.connect.NodeGetFreeMemory() + assert isinstance(free_mem, dbus.UInt64) + if __name__ == '__main__': libvirttest.run() -- 2.15.0

On Wed, May 02, 2018 at 12:34:39PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 5 +++++ src/connect.c | 24 ++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 33 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 5 +++++ src/connect.c | 25 +++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 34 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index c642aff..6b6758f 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -178,6 +178,11 @@ value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetFreeMemory"/> <arg name="freemem" type="t" direction="out"/> </method> + <method name="NodeGetInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetInfo"/> + <arg name="info" type="(stuuuuuu)" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index b161925..367d5ae 100644 --- a/src/connect.c +++ b/src/connect.c @@ -905,6 +905,30 @@ virtDBusConnectNodeGetFreeMemory(GVariant *inArgs G_GNUC_UNUSED, *outArgs = g_variant_new("(t)", freemem); } +static void +virtDBusConnectNodeGetInfo(GVariant *inArgs G_GNUC_UNUSED, + 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; + virNodeInfo info; + + if (!virtDBusConnectOpen(connect, error)) + return; + + if (virNodeGetInfo(connect->connection, &info) < 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("((stuuuuuu))", info.model, info.memory, + info.cpus, info.mhz, info.nodes, info.sockets, + info.cores, info.threads); +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -938,6 +962,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NetworkLookupByUUID", virtDBusConnectNetworkLookupByUUID }, { "NodeGetCPUStats", virtDBusConnectNodeGetCPUStats }, { "NodeGetFreeMemory", virtDBusConnectNodeGetFreeMemory }, + { "NodeGetInfo", virtDBusConnectNodeGetInfo }, { 0 } }; diff --git a/tests/test_connect.py b/tests/test_connect.py index 7b9ad0d..f0f68b1 100755 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -164,6 +164,10 @@ class TestConnect(libvirttest.BaseTestClass): free_mem = self.connect.NodeGetFreeMemory() assert isinstance(free_mem, dbus.UInt64) + def test_connect_node_get_info(self): + info = self.connect.NodeGetInfo() + assert isinstance(info, dbus.Struct) + if __name__ == '__main__': libvirttest.run() -- 2.15.0

On Wed, May 02, 2018 at 12:34:40PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 5 +++++ src/connect.c | 25 +++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 34 insertions(+)
So this API is broken and may report invalid values, we should not implement it in libvirt-dbus. Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 6b6758f..c62d107 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -183,6 +183,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetInfo"/> <arg name="info" type="(stuuuuuu)" direction="out"/> </method> + <method name="NodeGetMemoryParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetMemoryParameters"/> + <arg name="flags" type="u" direction="in"/> + <arg name="memoryParameters" type="a{sv}" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index 367d5ae..f2c6d45 100644 --- a/src/connect.c +++ b/src/connect.c @@ -929,6 +929,43 @@ virtDBusConnectNodeGetInfo(GVariant *inArgs G_GNUC_UNUSED, info.cores, info.threads); } +static void +virtDBusConnectNodeGetMemoryParameters(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_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virNodeGetMemoryParameters(connect->connection, NULL, + ¶ms.nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + if (params.nparams != 0) { + params.params = g_new0(virTypedParameter, params.nparams); + if (virNodeGetMemoryParameters(connect->connection, params.params, + ¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + } + + grecords = virtDBusUtilTypedParamsToGVariant(params.params, params.nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -963,6 +1000,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NodeGetCPUStats", virtDBusConnectNodeGetCPUStats }, { "NodeGetFreeMemory", virtDBusConnectNodeGetFreeMemory }, { "NodeGetInfo", virtDBusConnectNodeGetInfo }, + { "NodeGetMemoryParameters", virtDBusConnectNodeGetMemoryParameters }, { 0 } }; -- 2.15.0

On Wed, May 02, 2018 at 12:34:41PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 6b6758f..c62d107 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -183,6 +183,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetInfo"/> <arg name="info" type="(stuuuuuu)" direction="out"/> </method> + <method name="NodeGetMemoryParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetMemoryParameters"/> + <arg name="flags" type="u" direction="in"/> + <arg name="memoryParameters" type="a{sv}" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index 367d5ae..f2c6d45 100644 --- a/src/connect.c +++ b/src/connect.c @@ -929,6 +929,43 @@ virtDBusConnectNodeGetInfo(GVariant *inArgs G_GNUC_UNUSED, info.cores, info.threads); }
+static void +virtDBusConnectNodeGetMemoryParameters(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_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virNodeGetMemoryParameters(connect->connection, NULL, + ¶ms.nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error);
I would put an empty line here to logically separate the code.
+ if (params.nparams != 0) { + params.params = g_new0(virTypedParameter, params.nparams); + if (virNodeGetMemoryParameters(connect->connection, params.params, + ¶ms.nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + }
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index c62d107..4a1ee4a 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -189,6 +189,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="memoryParameters" type="a{sv}" direction="out"/> </method> + <method name="NodeGetMemoryStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetMemoryStats"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="a{st}" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index f2c6d45..0ecb333 100644 --- a/src/connect.c +++ b/src/connect.c @@ -966,6 +966,49 @@ virtDBusConnectNodeGetMemoryParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusConnectNodeGetMemoryStats(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 virNodeMemoryStatsPtr params = NULL; + gint nparams = 0; + gint cellNum = VIR_NODE_MEMORY_STATS_ALL_CELLS; + guint flags; + gint ret; + GVariantBuilder builder; + GVariant *res; + + g_variant_get(inArgs, "(u)", &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virNodeGetMemoryStats(connect->connection, cellNum, NULL, + &nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + if (nparams != 0) { + params = g_new0(virNodeMemoryStats, nparams); + if (virNodeGetMemoryStats(connect->connection, cellNum, params, + &nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + } + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{st}")); + for (gint i = 0; i < nparams; i++) + g_variant_builder_add(&builder, "{st}", params[i].field, params[i].value); + res = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&res, 1); +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -1001,6 +1044,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NodeGetFreeMemory", virtDBusConnectNodeGetFreeMemory }, { "NodeGetInfo", virtDBusConnectNodeGetInfo }, { "NodeGetMemoryParameters", virtDBusConnectNodeGetMemoryParameters }, + { "NodeGetMemoryStats", virtDBusConnectNodeGetMemoryStats }, { 0 } }; -- 2.15.0

On Wed, May 02, 2018 at 12:34:42PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index c62d107..4a1ee4a 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -189,6 +189,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="memoryParameters" type="a{sv}" direction="out"/> </method> + <method name="NodeGetMemoryStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetMemoryStats"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="a{st}" direction="out"/> + </method>
In the review of v1 I've stated that we should drop the cellNum argument, that was wrong. I thought that this API will report stats for all numa nodes, but that's not true. This is similar to the NodeGetCPUStats API so it should be same. Sorry about that.
<signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index f2c6d45..0ecb333 100644 --- a/src/connect.c +++ b/src/connect.c @@ -966,6 +966,49 @@ virtDBusConnectNodeGetMemoryParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); }
+static void +virtDBusConnectNodeGetMemoryStats(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 virNodeMemoryStatsPtr params = NULL; + gint nparams = 0; + gint cellNum = VIR_NODE_MEMORY_STATS_ALL_CELLS; + guint flags; + gint ret; + GVariantBuilder builder; + GVariant *res; + + g_variant_get(inArgs, "(u)", &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virNodeGetMemoryStats(connect->connection, cellNum, NULL, + &nparams, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error);
I would put an empty line here.
+ if (nparams != 0) { + params = g_new0(virNodeMemoryStats, nparams); + if (virNodeGetMemoryStats(connect->connection, cellNum, params, + &nparams, flags) < 0) { + return virtDBusUtilSetLastVirtError(error); + } + }
Reviewed-by: Pavel Hrdina <phrdina@redhat.com> to the v1 patch with the error check fix as it was pointed out for the v1 patch.

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 5 +++++ src/connect.c | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 4a1ee4a..610dda7 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -195,6 +195,11 @@ <arg name="flags" type="u" direction="in"/> <arg name="stats" type="a{st}" direction="out"/> </method> + <method name="NodeGetSecurityModel"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetSecurityModel"/> + <arg name="secModel" type="(ss)" direction="out"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index 0ecb333..7495017 100644 --- a/src/connect.c +++ b/src/connect.c @@ -1009,6 +1009,28 @@ virtDBusConnectNodeGetMemoryStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&res, 1); } +static void +virtDBusConnectNodeGetSecurityModel(GVariant *inArgs G_GNUC_UNUSED, + 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; + virSecurityModel secmodel; + + if (!virtDBusConnectOpen(connect, error)) + return; + + if (virNodeGetSecurityModel(connect->connection, &secmodel) < 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("((ss))", secmodel.model, secmodel.doi); +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -1045,6 +1067,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NodeGetInfo", virtDBusConnectNodeGetInfo }, { "NodeGetMemoryParameters", virtDBusConnectNodeGetMemoryParameters }, { "NodeGetMemoryStats", virtDBusConnectNodeGetMemoryStats }, + { "NodeGetSecurityModel", virtDBusConnectNodeGetSecurityModel }, { 0 } }; -- 2.15.0

On Wed, May 02, 2018 at 12:34:43PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 5 +++++ src/connect.c | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index 610dda7..e46d28d 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -200,6 +200,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetSecurityModel"/> <arg name="secModel" type="(ss)" direction="out"/> </method> + <method name="NodeSetMemoryParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeSetMemoryParameters"/> + <arg name="params" type="a{sv}" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index 7495017..cea64cb 100644 --- a/src/connect.c +++ b/src/connect.c @@ -1031,6 +1031,36 @@ virtDBusConnectNodeGetSecurityModel(GVariant *inArgs G_GNUC_UNUSED, *outArgs = g_variant_new("((ss))", secmodel.model, secmodel.doi); } +static void +virtDBusConnectNodeSetMemoryParameters(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(GVariantIter) iter = NULL; + g_auto(virtDBusUtilTypedParams) params = { 0 }; + guint flags; + + g_variant_get(inArgs, "(a{sv}u)", &iter, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + if (!virtDBusUtilGVariantToTypedParams(iter, ¶ms.params, + ¶ms.nparams, error)) { + return; + } + + if (virNodeSetMemoryParameters(connect->connection, params.params, + params.nparams, flags) < 0) { + virtDBusUtilSetLastVirtError(error); + } +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -1068,6 +1098,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NodeGetMemoryParameters", virtDBusConnectNodeGetMemoryParameters }, { "NodeGetMemoryStats", virtDBusConnectNodeGetMemoryStats }, { "NodeGetSecurityModel", virtDBusConnectNodeGetSecurityModel }, + { "NodeSetMemoryParameters", virtDBusConnectNodeSetMemoryParameters }, { 0 } }; -- 2.15.0

On Wed, May 02, 2018 at 12:34:44PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 8 ++++++++ src/connect.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index e46d28d..eb4990e 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -206,6 +206,14 @@ <arg name="params" type="a{sv}" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="NodeSuspendForDuration"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeSuspendForDuration + @target argument should be one of 'mem', 'disk' or 'hybrid'."/> + <arg name="target" type="s" direction="in"/> + <arg name="duration" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> diff --git a/src/connect.c b/src/connect.c index cea64cb..4035853 100644 --- a/src/connect.c +++ b/src/connect.c @@ -13,6 +13,13 @@ VIRT_DBUS_ENUM_IMPL(virtDBusConnectCPUCompareResult, "identical", "superset") +VIRT_DBUS_ENUM_DECL(virtDBusConnectNodeSuspendTarget) +VIRT_DBUS_ENUM_IMPL(virtDBusConnectNodeSuspendTarget, + VIR_NODE_SUSPEND_TARGET_LAST, + "mem", + "disk", + "hybrid") + static gint virtDBusConnectCredType[] = { VIR_CRED_AUTHNAME, VIR_CRED_ECHOPROMPT, @@ -1061,6 +1068,40 @@ virtDBusConnectNodeSetMemoryParameters(GVariant *inArgs, } } +static void +virtDBusConnectNodeSuspendForDuration(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath G_GNUC_UNUSED, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + const gchar *targetStr; + gint target; + guint64 duration; + guint flags; + + g_variant_get(inArgs, "(&stu)", &targetStr, &duration, &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + target = virtDBusConnectNodeSuspendTargetTypeFromString(targetStr); + if (target < 0) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't get valid virNodeSuspendTarget from string '%s'.", + targetStr); + return; + } + + if (virNodeSuspendForDuration(connect->connection, target, + duration, flags) < 0) { + virtDBusUtilSetLastVirtError(error); + } +} + static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = { { "Encrypted", virtDBusConnectGetEncrypted, NULL }, { "Hostname", virtDBusConnectGetHostname, NULL }, @@ -1099,6 +1140,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NodeGetMemoryStats", virtDBusConnectNodeGetMemoryStats }, { "NodeGetSecurityModel", virtDBusConnectNodeGetSecurityModel }, { "NodeSetMemoryParameters", virtDBusConnectNodeSetMemoryParameters }, + { "NodeSuspendForDuration", virtDBusConnectNodeSuspendForDuration }, { 0 } }; -- 2.15.0

On Wed, May 02, 2018 at 12:34:45PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 8 ++++++++ src/connect.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index e46d28d..eb4990e 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -206,6 +206,14 @@ <arg name="params" type="a{sv}" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="NodeSuspendForDuration"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeSuspendForDuration + @target argument should be one of 'mem', 'disk' or 'hybrid'."/>
We will probably remove the string->enum translation so I would wait to get that pushed before pushing this patch. Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 35 +++++++++++++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 45 insertions(+) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index eb4990e..b84753b 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -166,6 +166,12 @@ <arg name="uuid" type="s" direction="in"/> <arg name="network" type="o" direction="out"/> </method> + <method name="NodeGetCPUMap"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetCPUMap"/> + <arg name="flags" type="u" direction="in"/> + <arg name="res" type="ab" direction="out"/> + </method> <method name="NodeGetCPUStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetCPUStats"/> diff --git a/src/connect.c b/src/connect.c index 4035853..7558b70 100644 --- a/src/connect.c +++ b/src/connect.c @@ -849,6 +849,40 @@ virtDBusConnectNetworkLookupByUUID(GVariant *inArgs, *outArgs = g_variant_new("(o)", path); } +static void +virtDBusConnectNodeGetCPUMap(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 guchar *cpumap = NULL; + guint online = 0; + guint flags; + gint ret; + GVariant *gret; + GVariantBuilder builder; + + g_variant_get(inArgs, "(u)", &flags); + + if (!virtDBusConnectOpen(connect, error)) + return; + + ret = virNodeGetCPUMap(connect->connection, &cpumap, &online, flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + + g_variant_builder_init(&builder, G_VARIANT_TYPE("ab")); + for (gint i = 0; i < ret; i++) + g_variant_builder_add(&builder, "b", VIR_CPU_USED(cpumap, i)); + gret = g_variant_builder_end(&builder); + + *outArgs = g_variant_new_tuple(&gret, 1); +} + static void virtDBusConnectNodeGetCPUStats(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1133,6 +1167,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = { { "NetworkDefineXML", virtDBusConnectNetworkDefineXML }, { "NetworkLookupByName", virtDBusConnectNetworkLookupByName }, { "NetworkLookupByUUID", virtDBusConnectNetworkLookupByUUID }, + { "NodeGetCPUMap", virtDBusConnectNodeGetCPUMap }, { "NodeGetCPUStats", virtDBusConnectNodeGetCPUStats }, { "NodeGetFreeMemory", virtDBusConnectNodeGetFreeMemory }, { "NodeGetInfo", virtDBusConnectNodeGetInfo }, diff --git a/tests/test_connect.py b/tests/test_connect.py index f0f68b1..4ddcb52 100755 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -168,6 +168,10 @@ class TestConnect(libvirttest.BaseTestClass): info = self.connect.NodeGetInfo() assert isinstance(info, dbus.Struct) + def test_connect_node_get_cpumap(self): + info = self.connect.NodeGetCPUMap(0) + assert isinstance(info, dbus.Array) + if __name__ == '__main__': libvirttest.run() -- 2.15.0

On Wed, May 02, 2018 at 12:34:46PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 6 ++++++ src/connect.c | 35 +++++++++++++++++++++++++++++++++++ tests/test_connect.py | 4 ++++ 3 files changed, 45 insertions(+)
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
participants (2)
-
Katerina Koukiou
-
Pavel Hrdina