[libvirt] [dbus PATCH v3 00/20] More APIs for Domain Interface

Changes from v2: Adjusted to reviews. Katerina Koukiou (20): Implement Setter for Autostart property for Domain interface Implement SchedulerType property for Domain Interface Implement MemoryStats for Domain Interface Implement AttachDevice method for Domain Interface Implement DetachDevice method for Domain Interface Implement GetJobInfo method for Domain interface Implement AbortJob for Domain interface Implement MigrateSetMaxDowntime method for Domain interface Implement MigrateGetMaxDowntime method for Domain Interface Implement ManagedSave method for Domain Interface Implement HasManagedSaveImage method for Domain Interface Implement ManagedSaveRemove method for Domain Interface Implement SetVcpus method for Domain Interface Implement GetMemoryParameters method for Domain Interface Implement GetBlkioParameters method for domain Interface Implement Updated property for Domain Interface Implement MigrateGetMaxSpeed method for Domain Interface Implement MigrateSetMaxSpeed method for Domain Interface Implement SetMemory method for Domain Interface Implement GetSchedulerParameters method for Domain Interface data/org.libvirt.Domain.xml | 110 +++++++- src/domain.c | 605 +++++++++++++++++++++++++++++++++++++++++++- test/test_domain.py | 37 ++- 3 files changed, 747 insertions(+), 5 deletions(-) -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++-- src/domain.c | 22 +++++++++++++++++++++- test/test_domain.py | 7 +++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 78378bb..b8ee5b8 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -7,9 +7,10 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainIsActive"/> </property> - <property name="Autostart" type="b" access="read"> + <property name="Autostart" type="b" access="readwrite"> <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetAutostart"/> + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetAutostart and + https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetAutostart"/> </property> <property name="Id" type="u" access="read"> <annotation name="org.gtk.GDBus.DocString" diff --git a/src/domain.c b/src/domain.c index 14f07fc..82682ef 100644 --- a/src/domain.c +++ b/src/domain.c @@ -218,6 +218,26 @@ virtDBusDomainGetUUID(const gchar *objectPath, *value = g_variant_new("s", uuid); } +static void +virtDBusDomainSetAutostart(GVariant *value, + const gchar *objectPath, + gpointer userData, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gboolean autostart; + + g_variant_get(value, "b", &autostart); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainSetAutostart(domain, autostart) < 0) + return virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainCreate(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -492,7 +512,7 @@ virtDBusDomainUndefine(GVariant *inArgs, static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { { "Active", virtDBusDomainGetActive, NULL }, - { "Autostart", virtDBusDomainGetAutostart, NULL }, + { "Autostart", virtDBusDomainGetAutostart, virtDBusDomainSetAutostart }, { "Id", virtDBusDomainGetId, NULL }, { "Name", virtDBusDomainGetName, NULL }, { "OSType", virtDBusDomainGetOsType, NULL }, diff --git a/test/test_domain.py b/test/test_domain.py index 952bf59..7fa9aad 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -37,6 +37,13 @@ class TestDomain(libvirttest.BaseTestClass): raise e domain.Undefine(0) + def test_domain_autostart(self): + _, domain = self.domain() + autostart_expected = True + domain.Set('org.libvirt.Domain', 'Autostart', autostart_expected, dbus_interface=dbus.PROPERTIES_IFACE) + autostart_current = domain.Get('org.libvirt.Domain', 'Autostart', dbus_interface=dbus.PROPERTIES_IFACE) + assert autostart_current == dbus.Boolean(autostart_expected) + def test_resume(self): def domain_resumed(path, _event): assert isinstance(path, dbus.ObjectPath) -- 2.15.0

On Fri, Apr 13, 2018 at 01:15:12PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++-- src/domain.c | 22 +++++++++++++++++++++- test/test_domain.py | 7 +++++++ 3 files changed, 31 insertions(+), 3 deletions(-)
[...]
+static void +virtDBusDomainSetAutostart(GVariant *value, + const gchar *objectPath, + gpointer userData, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gboolean autostart; + + g_variant_get(value, "b", &autostart); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainSetAutostart(domain, autostart) < 0) + return virtDBusUtilSetLastVirtError(error);
You missed one 'return'. Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 4 ++++ src/domain.c | 23 +++++++++++++++++++++++ test/test_domain.py | 3 +++ 3 files changed, 30 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index b8ee5b8..df9fbf9 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -28,6 +28,10 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainIsPersistent"/> </property> + <property name="SchedulerType" type="(si)" access="read"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetSchedulerType"/> + </property> <property name="State" type="s" access="read"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetState"/> diff --git a/src/domain.c b/src/domain.c index 82682ef..f775fd4 100644 --- a/src/domain.c +++ b/src/domain.c @@ -149,6 +149,28 @@ virtDBusDomainGetPersistent(const gchar *objectPath, *value = g_variant_new("b", !!persistent); } +static void +virtDBusDomainGetSchedulerType(const gchar *objectPath, + gpointer userData, + GVariant **value, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + g_autofree gchar *schedtype = NULL; + gint nparams; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + schedtype = virDomainGetSchedulerType(domain, &nparams); + if (!schedtype) + return virtDBusUtilSetLastVirtError(error); + + *value = g_variant_new("(si)", schedtype, nparams); +} + static void virtDBusDomainGetState(const gchar *objectPath, gpointer userData, @@ -517,6 +539,7 @@ static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { { "Name", virtDBusDomainGetName, NULL }, { "OSType", virtDBusDomainGetOsType, NULL }, { "Persistent", virtDBusDomainGetPersistent, NULL }, + { "SchedulerType", virtDBusDomainGetSchedulerType, NULL}, { "State", virtDBusDomainGetState, NULL }, { "UUID", virtDBusDomainGetUUID, NULL }, { 0 } diff --git a/test/test_domain.py b/test/test_domain.py index 7fa9aad..a7cf962 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -16,6 +16,9 @@ class TestDomain(libvirttest.BaseTestClass): assert isinstance(props['Name'], dbus.String) assert isinstance(props['OSType'], dbus.String) assert isinstance(props['Persistent'], dbus.Boolean) + assert any([isinstance(props['SchedulerType'], dbus.Struct), + isinstance(props['SchedulerType'][0], dbus.String), + isinstance(props['SchedulerType'][1], dbus.Int32)]) assert isinstance(props['State'], dbus.String) assert isinstance(props['UUID'], dbus.String) -- 2.15.0

This method is not tested for now since the test driver doesn't support this API. Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++ src/domain.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index df9fbf9..7174769 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -69,6 +69,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="xml" type="s" direction="out"/> </method> + <method name="MemoryStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryStats"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="a{st}" direction="out"/> + </method> <method name="Reboot"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> diff --git a/src/domain.c b/src/domain.c index f775fd4..5f87572 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,42 @@ #include <libvirt/libvirt.h> +VIRT_DBUS_ENUM_DECL(virtDBusDomainMemoryStat) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainMemoryStat, + VIR_DOMAIN_MEMORY_STAT_LAST, + "swap_in", + "swap_out", + "major_fault", + "minor_fault", + "unused", + "available", + "actual_baloon", + "rss", + "usable", + "last_update") + +static GVariant * +virtDBusDomainMemoryStatsToGVariant(virDomainMemoryStatPtr stats, + gint nr_stats, + GError **error) +{ + GVariantBuilder builder; + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{st}")); + + for (gint i = 0; i < nr_stats; i++) { + const gchar *memoryStat = virtDBusDomainMemoryStatTypeToString(stats[i].tag); + if (!memoryStat) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't translate virDomainMemoryStatTags to string."); + return NULL; + } + g_variant_builder_add(&builder, "{st}", memoryStat, stats[i].val); + } + + return g_variant_builder_end(&builder); +} + static virDomainPtr virtDBusDomainGetVirDomain(virtDBusConnect *connect, const gchar *objectPath, @@ -398,6 +434,41 @@ virtDBusDomainGetXMLDesc(GVariant *inArgs, *outArgs = g_variant_new("(s)", xml); } +static void +virtDBusDomainMemoryStats(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; + virDomainMemoryStatStruct stats[VIR_DOMAIN_MEMORY_STAT_NR]; + gint nr_stats; + guint flags; + GVariant *gstats; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + nr_stats = virDomainMemoryStats(domain, stats, VIR_DOMAIN_MEMORY_STAT_NR, flags); + if (nr_stats < 0) + return virtDBusUtilSetLastVirtError(error); + + gstats = virtDBusDomainMemoryStatsToGVariant(stats, nr_stats, error); + if (!gstats) { + virtDBusUtilSetLastVirtError(error); + return; + } + + *outArgs = g_variant_new_tuple(&gstats, 1); +} + static void virtDBusDomainReboot(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -551,6 +622,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetStats", virtDBusDomainGetStats }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, + { "MemoryStats", virtDBusDomainMemoryStats }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, -- 2.15.0

On Fri, Apr 13, 2018 at 01:15:14PM +0200, Katerina Koukiou wrote:
This method is not tested for now since the test driver doesn't support this API.
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++ src/domain.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index df9fbf9..7174769 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -69,6 +69,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="xml" type="s" direction="out"/> </method> + <method name="MemoryStats"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryStats"/> + <arg name="flags" type="u" direction="in"/> + <arg name="stats" type="a{st}" direction="out"/> + </method> <method name="Reboot"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> diff --git a/src/domain.c b/src/domain.c index f775fd4..5f87572 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,42 @@
#include <libvirt/libvirt.h>
+VIRT_DBUS_ENUM_DECL(virtDBusDomainMemoryStat) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainMemoryStat, + VIR_DOMAIN_MEMORY_STAT_LAST, + "swap_in", + "swap_out", + "major_fault", + "minor_fault", + "unused", + "available", + "actual_baloon", + "rss", + "usable", + "last_update")
I was looking at libvirt-python code to get some inspiration how to handle the error message later in this code and find out that the last two memory stats "usable" and "last_update" were introduced in libvirt 2.1.0 but we currently require only 1.2.8. You need to bump it in configure.ac.
+ +static GVariant * +virtDBusDomainMemoryStatsToGVariant(virDomainMemoryStatPtr stats, + gint nr_stats, + GError **error) +{ + GVariantBuilder builder; + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{st}")); + + for (gint i = 0; i < nr_stats; i++) { + const gchar *memoryStat = virtDBusDomainMemoryStatTypeToString(stats[i].tag); + if (!memoryStat) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't translate virDomainMemoryStatTags to string."); + return NULL; + }
Now that I think about it a little bit more, we should probably skip it in case that we don't know how to translate it. Sorry about the noise. The reason is that if libvirt-dbus is used with newer libvirt that has some new stats this API would stop working. So instead of setting an error simple 'continue' should be good enough. You can remove the '**error' parameter.
+ g_variant_builder_add(&builder, "{st}", memoryStat, stats[i].val); + } + + return g_variant_builder_end(&builder); +} + static virDomainPtr virtDBusDomainGetVirDomain(virtDBusConnect *connect, const gchar *objectPath, @@ -398,6 +434,41 @@ virtDBusDomainGetXMLDesc(GVariant *inArgs, *outArgs = g_variant_new("(s)", xml); }
+static void +virtDBusDomainMemoryStats(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; + virDomainMemoryStatStruct stats[VIR_DOMAIN_MEMORY_STAT_NR]; + gint nr_stats; + guint flags; + GVariant *gstats; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + nr_stats = virDomainMemoryStats(domain, stats, VIR_DOMAIN_MEMORY_STAT_NR, flags); + if (nr_stats < 0) + return virtDBusUtilSetLastVirtError(error); + + gstats = virtDBusDomainMemoryStatsToGVariant(stats, nr_stats, error); + if (!gstats) { + virtDBusUtilSetLastVirtError(error); + return; + }
The whole if part can be dropped now. Pavel

This method is not tested for now since the test driver doesn't suport this API. Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 7174769..9360cbf 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -40,6 +40,12 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetUUIDString"/> </property> + <method name="AttachDevice"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainAttachDeviceFlags"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Create"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainCreateWithFlags"/> diff --git a/src/domain.c b/src/domain.c index 5f87572..dccba94 100644 --- a/src/domain.c +++ b/src/domain.c @@ -296,6 +296,30 @@ virtDBusDomainSetAutostart(GVariant *value, return virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainAttachDevice(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&su)", &xml, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainAttachDeviceFlags(domain, xml, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainCreate(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -617,6 +641,7 @@ static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { }; static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { + { "AttachDevice", virtDBusDomainAttachDevice }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "GetStats", virtDBusDomainGetStats }, -- 2.15.0

This method is not tested for now since the test driver doesn't suport this API. Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 9360cbf..5c310ad 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -56,6 +56,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainDestroyFlags"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="DetachDevice"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainDetachDeviceFlags"/> + <arg name="xml" type="s" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="GetStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainListGetStats"/> diff --git a/src/domain.c b/src/domain.c index dccba94..2c3174b 100644 --- a/src/domain.c +++ b/src/domain.c @@ -366,6 +366,30 @@ virtDBusDomainDestroy(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainDetachDevice(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + const gchar *xml; + guint flags; + + g_variant_get(inArgs, "(&su)", &xml, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainDetachDeviceFlags(domain, xml, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainStatsRecordPtr, virDomainStatsRecordListFree); static void @@ -644,6 +668,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "AttachDevice", virtDBusDomainAttachDevice }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, + { "DetachDevice", virtDBusDomainDetachDevice }, { "GetStats", virtDBusDomainGetStats }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 5c310ad..c672053 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -62,6 +62,11 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="GetJobInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> + <arg name="jobInfo" type="(sttttttttttt)" direction="out"/> + </method> <method name="GetStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainListGetStats"/> diff --git a/src/domain.c b/src/domain.c index 2c3174b..47bd585 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,16 @@ #include <libvirt/libvirt.h> +VIRT_DBUS_ENUM_DECL(virtDBusDomainJob) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainJob, + VIR_DOMAIN_JOB_LAST, + "none", + "bounded", + "unbounded", + "completed", + "failed", + "canceled") + VIRT_DBUS_ENUM_DECL(virtDBusDomainMemoryStat) VIRT_DBUS_ENUM_IMPL(virtDBusDomainMemoryStat, VIR_DOMAIN_MEMORY_STAT_LAST, @@ -390,6 +400,44 @@ virtDBusDomainDetachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainGetJobInfo(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_autofree virDomainJobInfoPtr jobInfo = NULL; + const gchar *jobTypeStr; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + jobInfo = g_new0(virDomainJobInfo, 1); + if (virDomainGetJobInfo(domain, jobInfo) < 0) + return virtDBusUtilSetLastVirtError(error); + + jobTypeStr = virtDBusDomainJobTypeToString(jobInfo->type); + if (!jobTypeStr) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't translate virDomainJobType to string."); + virtDBusUtilSetLastVirtError(error); + return; + } + *outArgs = g_variant_new("((sttttttttttt))", jobTypeStr, + jobInfo->timeElapsed, jobInfo->timeRemaining, + jobInfo->dataTotal, jobInfo->dataProcessed, + jobInfo->dataRemaining, jobInfo->memTotal, + jobInfo->memProcessed, jobInfo->memRemaining, + jobInfo->fileTotal, jobInfo->fileProcessed, + jobInfo->fileRemaining); +} + G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainStatsRecordPtr, virDomainStatsRecordListFree); static void @@ -669,6 +717,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, + { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetStats", virtDBusDomainGetStats }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, -- 2.15.0

On Fri, Apr 13, 2018 at 01:15:17PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+)
diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 5c310ad..c672053 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -62,6 +62,11 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="GetJobInfo"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> + <arg name="jobInfo" type="(sttttttttttt)" direction="out"/> + </method> <method name="GetStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainListGetStats"/> diff --git a/src/domain.c b/src/domain.c index 2c3174b..47bd585 100644 --- a/src/domain.c +++ b/src/domain.c @@ -3,6 +3,16 @@
#include <libvirt/libvirt.h>
+VIRT_DBUS_ENUM_DECL(virtDBusDomainJob) +VIRT_DBUS_ENUM_IMPL(virtDBusDomainJob, + VIR_DOMAIN_JOB_LAST, + "none", + "bounded", + "unbounded", + "completed", + "failed", + "canceled") + VIRT_DBUS_ENUM_DECL(virtDBusDomainMemoryStat) VIRT_DBUS_ENUM_IMPL(virtDBusDomainMemoryStat, VIR_DOMAIN_MEMORY_STAT_LAST, @@ -390,6 +400,44 @@ virtDBusDomainDetachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); }
+static void +virtDBusDomainGetJobInfo(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_autofree virDomainJobInfoPtr jobInfo = NULL; + const gchar *jobTypeStr; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + jobInfo = g_new0(virDomainJobInfo, 1); + if (virDomainGetJobInfo(domain, jobInfo) < 0) + return virtDBusUtilSetLastVirtError(error); + + jobTypeStr = virtDBusDomainJobTypeToString(jobInfo->type); + if (!jobTypeStr) { + g_set_error(error, VIRT_DBUS_ERROR, VIRT_DBUS_ERROR_LIBVIRT, + "Can't translate virDomainJobType to string.");
In this case setting the error makes sense since the other two options are not to translate the type to string or returning job type 'none' with all values as 0. How about this error message: "Can't format virDomainJobType '%d' to string.", jobInfo->type ?
+ virtDBusUtilSetLastVirtError(error);
This would overwrite the previous error so it should not be used here. The purpose of this function is to get an libvirt error if some libvirt API fails. Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 4 ++++ src/domain.c | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index c672053..074dd62 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -40,6 +40,10 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetUUIDString"/> </property> + <method name="AbortJob"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainAbortJob"/> + </method> <method name="AttachDevice"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainAttachDeviceFlags"/> diff --git a/src/domain.c b/src/domain.c index 47bd585..b55a615 100644 --- a/src/domain.c +++ b/src/domain.c @@ -306,6 +306,26 @@ virtDBusDomainSetAutostart(GVariant *value, return virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainAbortJob(GVariant *inArgs G_GNUC_UNUSED, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainAbortJob(domain) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainAttachDevice(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -713,6 +733,7 @@ static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { }; static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { + { "AbortJob", virtDBusDomainAbortJob }, { "AttachDevice", virtDBusDomainAttachDevice }, { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 074dd62..c3c64fa 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -96,6 +96,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="stats" type="a{st}" direction="out"/> </method> + <method name="MigrateSetMaxDowntime"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateSetMaxDowntime"/> + <arg name="downtime" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Reboot"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> diff --git a/src/domain.c b/src/domain.c index b55a615..88e6aaa 100644 --- a/src/domain.c +++ b/src/domain.c @@ -585,6 +585,30 @@ virtDBusDomainMemoryStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gstats, 1); } +static void +virtDBusDomainMigrateSetMaxDowntime(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gulong downtime; + guint flags; + + g_variant_get(inArgs, "(tu)", &downtime, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainMigrateSetMaxDowntime(domain, downtime, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainReboot(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -743,6 +767,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, { "MemoryStats", virtDBusDomainMemoryStats }, + { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index c3c64fa..10c4da8 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -96,6 +96,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="stats" type="a{st}" direction="out"/> </method> + <method name="MigrateGetMaxDowntime"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateGetMaxDowntime"/> + <arg name="flags" type="u" direction="in"/> + <arg name="downtime" type="t" direction="out"/> + </method> <method name="MigrateSetMaxDowntime"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateSetMaxDowntime"/> diff --git a/src/domain.c b/src/domain.c index 88e6aaa..522fedb 100644 --- a/src/domain.c +++ b/src/domain.c @@ -585,6 +585,36 @@ virtDBusDomainMemoryStats(GVariant *inArgs, *outArgs = g_variant_new_tuple(&gstats, 1); } +static void +virtDBusDomainMigrateGetMaxDowntime(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 downtime; + guint flags; + gint ret; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainMigrateGetMaxDowntime(domain, + (unsigned long long *)&downtime, + flags); + if (ret < 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(t)", downtime); +} + static void virtDBusDomainMigrateSetMaxDowntime(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -767,6 +797,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, { "MemoryStats", virtDBusDomainMemoryStats }, + { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 24 ++++++++++++++++++++++++ test/test_domain.py | 15 +++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 10c4da8..91e2558 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -90,6 +90,11 @@ <arg name="flags" type="u" direction="in"/> <arg name="xml" type="s" direction="out"/> </method> + <method name="ManagedSave"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainManagedSave"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="MemoryStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryStats"/> diff --git a/src/domain.c b/src/domain.c index 522fedb..4d42d28 100644 --- a/src/domain.c +++ b/src/domain.c @@ -550,6 +550,29 @@ virtDBusDomainGetXMLDesc(GVariant *inArgs, *outArgs = g_variant_new("(s)", xml); } +static void +virtDBusDomainManagedSave(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainManagedSave(domain, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainMemoryStats(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -796,6 +819,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetStats", virtDBusDomainGetStats }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, + { "ManagedSave", virtDBusDomainManagedSave }, { "MemoryStats", virtDBusDomainMemoryStats }, { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, diff --git a/test/test_domain.py b/test/test_domain.py index a7cf962..31348ce 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -47,6 +47,21 @@ class TestDomain(libvirttest.BaseTestClass): autostart_current = domain.Get('org.libvirt.Domain', 'Autostart', dbus_interface=dbus.PROPERTIES_IFACE) assert autostart_current == dbus.Boolean(autostart_expected) + def test_domain_managed_save(self): + def domain_stopped(path, _event): + assert isinstance(path, dbus.ObjectPath) + self.loop.quit() + + self.connect.connect_to_signal('DomainEvent', domain_stopped, arg1='Stopped') + + obj, domain = self.domain() + domain.ManagedSave(0) + + state = obj.Get('org.libvirt.Domain', 'State', dbus_interface=dbus.PROPERTIES_IFACE) + assert state == 'shutoff' + + self.main_loop() + def test_resume(self): def domain_resumed(path, _event): assert isinstance(path, dbus.ObjectPath) -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 29 +++++++++++++++++++++++++++++ test/test_domain.py | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 91e2558..e29cd4c 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -90,6 +90,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="xml" type="s" direction="out"/> </method> + <method name="HasManagedSaveImage"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainHasManagedSaveImage"/> + <arg name="flags" type="u" direction="in"/> + <arg name="managedSaveImage" type="b" direction="out"/> + </method> <method name="ManagedSave"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainManagedSave"/> diff --git a/src/domain.c b/src/domain.c index 4d42d28..05904d7 100644 --- a/src/domain.c +++ b/src/domain.c @@ -550,6 +550,34 @@ virtDBusDomainGetXMLDesc(GVariant *inArgs, *outArgs = g_variant_new("(s)", xml); } +static void +virtDBusDomainHasManagedSaveImage(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; + gint managedSaveImage; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + managedSaveImage = virDomainHasManagedSaveImage(domain, flags); + if (managedSaveImage < 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(b)", managedSaveImage); +} + static void virtDBusDomainManagedSave(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -819,6 +847,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetStats", virtDBusDomainGetStats }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, + { "HasManagedSaveImage", virtDBusDomainHasManagedSaveImage }, { "ManagedSave", virtDBusDomainManagedSave }, { "MemoryStats", virtDBusDomainMemoryStats }, { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, diff --git a/test/test_domain.py b/test/test_domain.py index 31348ce..13f27f7 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -56,7 +56,7 @@ class TestDomain(libvirttest.BaseTestClass): obj, domain = self.domain() domain.ManagedSave(0) - + assert domain.HasManagedSaveImage(0) == dbus.Boolean(True) state = obj.Get('org.libvirt.Domain', 'State', dbus_interface=dbus.PROPERTIES_IFACE) assert state == 'shutoff' -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 5 +++++ src/domain.c | 24 ++++++++++++++++++++++++ test/test_domain.py | 2 ++ 3 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index e29cd4c..f300b59 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -101,6 +101,11 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainManagedSave"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="ManagedSaveRemove"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainManagedSaveRemove"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="MemoryStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMemoryStats"/> diff --git a/src/domain.c b/src/domain.c index 05904d7..5f83b33 100644 --- a/src/domain.c +++ b/src/domain.c @@ -601,6 +601,29 @@ virtDBusDomainManagedSave(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainManagedSaveRemove(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainManagedSaveRemove(domain, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainMemoryStats(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -849,6 +872,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetXMLDesc", virtDBusDomainGetXMLDesc }, { "HasManagedSaveImage", virtDBusDomainHasManagedSaveImage }, { "ManagedSave", virtDBusDomainManagedSave }, + { "ManagedSaveRemove", virtDBusDomainManagedSaveRemove }, { "MemoryStats", virtDBusDomainMemoryStats }, { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, diff --git a/test/test_domain.py b/test/test_domain.py index 13f27f7..45a99f9 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -59,6 +59,8 @@ class TestDomain(libvirttest.BaseTestClass): assert domain.HasManagedSaveImage(0) == dbus.Boolean(True) state = obj.Get('org.libvirt.Domain', 'State', dbus_interface=dbus.PROPERTIES_IFACE) assert state == 'shutoff' + domain.ManagedSaveRemove(0) + assert domain.HasManagedSaveImage(0) == dbus.Boolean(False) self.main_loop() -- 2.15.0

Move testing of [Get,Set]Vcpus to seperate test. Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 26 ++++++++++++++++++++++++++ test/test_domain.py | 9 +++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f300b59..41814c7 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -138,6 +138,12 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> </method> + <method name="SetVcpus"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetVcpusFlags"/> + <arg name="vcpus" type="u" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Shutdown"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainShutdownFlags"/> diff --git a/src/domain.c b/src/domain.c index 5f83b33..9b8779b 100644 --- a/src/domain.c +++ b/src/domain.c @@ -781,6 +781,31 @@ virtDBusDomainResume(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainSetVcpus(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + guint vcpus; + guint flags; + + g_variant_get(inArgs, "(uu)", &vcpus, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainSetVcpusFlags(domain, vcpus, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainShutdown(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -879,6 +904,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, + { "SetVcpus", virtDBusDomainSetVcpus }, { "Shutdown", virtDBusDomainShutdown }, { "Suspend", virtDBusDomainSuspend }, { "Undefine", virtDBusDomainUndefine }, diff --git a/test/test_domain.py b/test/test_domain.py index 45a99f9..31e09bf 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -27,8 +27,6 @@ class TestDomain(libvirttest.BaseTestClass): xml = domain.GetXMLDesc(0) assert isinstance(xml, dbus.String) - vcpus = domain.GetVcpus(0) - assert isinstance(vcpus, dbus.UInt32) domain.Reboot(0) domain.Shutdown(0) @@ -123,5 +121,12 @@ class TestDomain(libvirttest.BaseTestClass): self.main_loop() + def test_domain_vcpus(self): + obj, domain = self.domain() + vcpus_expected = 2 + domain.SetVcpus(vcpus_expected, 0) + assert domain.GetVcpus(0) == dbus.Int32(vcpus_expected) + + if __name__ == '__main__': libvirttest.run() -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 41814c7..36167d8 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -71,6 +71,12 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetJobInfo"/> <arg name="jobInfo" type="(sttttttttttt)" direction="out"/> </method> + <method name="GetMemoryParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetMemoryParameters"/> + <arg name="flags" type="u" direction="in"/> + <arg name="memoryParameters" type="a{sv}" direction="out"/> + </method> <method name="GetStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainListGetStats"/> diff --git a/src/domain.c b/src/domain.c index 9b8779b..7ab832b 100644 --- a/src/domain.c +++ b/src/domain.c @@ -458,6 +458,41 @@ virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, jobInfo->fileRemaining); } +static void +virtDBusDomainGetMemoryParameters(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 virTypedParameterPtr params = NULL; + gint nparams = 0; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetMemoryParameters(domain, NULL, &nparams, flags); + if (ret == 0 && nparams != 0) { + params = g_new0(virTypedParameter, nparams); + if (virDomainGetMemoryParameters(domain, params, &nparams, flags) < 0) + return virtDBusUtilSetLastVirtError(error); + } + + grecords = virtDBusUtilTypedParamsToGVariant(params, nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainStatsRecordPtr, virDomainStatsRecordListFree); static void @@ -892,6 +927,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, { "GetJobInfo", virtDBusDomainGetJobInfo }, + { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetStats", virtDBusDomainGetStats }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 36167d8..243a978 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -66,6 +66,12 @@ <arg name="xml" type="s" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="GetBlkioParameters"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetBlkioParameters"/> + <arg name="flags" type="u" direction="in"/> + <arg name="BlkioParameters" 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 7ab832b..9cf691a 100644 --- a/src/domain.c +++ b/src/domain.c @@ -420,6 +420,41 @@ virtDBusDomainDetachDevice(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainGetBlkioParameters(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 virTypedParameterPtr params = NULL; + gint nparams = 0; + guint flags; + gint ret; + GVariant *grecords; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetBlkioParameters(domain, NULL, &nparams, flags); + if (ret == 0 && nparams != 0) { + params = g_new0(virTypedParameter, nparams); + if (virDomainGetBlkioParameters(domain, params, &nparams, flags) < 0) + return virtDBusUtilSetLastVirtError(error); + } + + grecords = virtDBusUtilTypedParamsToGVariant(params, nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + static void virtDBusDomainGetJobInfo(GVariant *inArgs G_GNUC_UNUSED, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -926,6 +961,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Create", virtDBusDomainCreate }, { "Destroy", virtDBusDomainDestroy }, { "DetachDevice", virtDBusDomainDetachDevice }, + { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, { "GetStats", virtDBusDomainGetStats }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 4 ++++ src/domain.c | 22 ++++++++++++++++++++++ test/test_domain.py | 1 + 3 files changed, 27 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 243a978..21eb162 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -36,6 +36,10 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetState"/> </property> + <property name="Updated" type="b" access="read"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainIsUpdated"/> + </property> <property name="UUID" type="s" access="read"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainGetUUIDString"/> diff --git a/src/domain.c b/src/domain.c index 9cf691a..5a2dbfb 100644 --- a/src/domain.c +++ b/src/domain.c @@ -266,6 +266,27 @@ virtDBusDomainGetState(const gchar *objectPath, *value = g_variant_new("s", string); } +static void +virtDBusDomainGetUpdated(const gchar *objectPath, + gpointer userData, + GVariant **value, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gint updated; + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + updated = virDomainIsUpdated(domain); + if (updated < 0) + return virtDBusUtilSetLastVirtError(error); + + *value = g_variant_new("b", !!updated); +} + static void virtDBusDomainGetUUID(const gchar *objectPath, gpointer userData, @@ -951,6 +972,7 @@ static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { { "Persistent", virtDBusDomainGetPersistent, NULL }, { "SchedulerType", virtDBusDomainGetSchedulerType, NULL}, { "State", virtDBusDomainGetState, NULL }, + { "Updated", virtDBusDomainGetUpdated, NULL }, { "UUID", virtDBusDomainGetUUID, NULL }, { 0 } }; diff --git a/test/test_domain.py b/test/test_domain.py index 31e09bf..f2ae215 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -20,6 +20,7 @@ class TestDomain(libvirttest.BaseTestClass): isinstance(props['SchedulerType'][0], dbus.String), isinstance(props['SchedulerType'][1], dbus.Int32)]) assert isinstance(props['State'], dbus.String) + assert isinstance(props['Updated'], dbus.Boolean) assert isinstance(props['UUID'], dbus.String) # Call all methods except Reset and GetStats, because the test backend -- 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 21eb162..eec9dcb 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -134,6 +134,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="downtime" type="t" direction="out"/> </method> + <method name="MigrateGetMaxSpeed"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateGetMaxSpeed"/> + <arg name="flags" type="u" direction="in"/> + <arg name="bandwidth" type="t" direction="out"/> + </method> <method name="MigrateSetMaxDowntime"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateSetMaxDowntime"/> diff --git a/src/domain.c b/src/domain.c index 5a2dbfb..46a8c03 100644 --- a/src/domain.c +++ b/src/domain.c @@ -780,6 +780,33 @@ virtDBusDomainMigrateGetMaxDowntime(GVariant *inArgs, *outArgs = g_variant_new("(t)", downtime); } +static void +virtDBusDomainMigrateGetMaxSpeed(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 bandwidth; + guint flags; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainMigrateGetMaxSpeed(domain, &bandwidth, flags) < 0) + return virtDBusUtilSetLastVirtError(error); + + *outArgs = g_variant_new("(t)", bandwidth); +} + static void virtDBusDomainMigrateSetMaxDowntime(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -994,6 +1021,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "ManagedSaveRemove", virtDBusDomainManagedSaveRemove }, { "MemoryStats", virtDBusDomainMemoryStats }, { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, + { "MigrateGetMaxSpeed", virtDBusDomainMigrateGetMaxSpeed }, { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index eec9dcb..838ebed 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -146,6 +146,12 @@ <arg name="downtime" type="t" direction="in"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="MigrateSetMaxSpeed"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateSetMaxSpeed"/> + <arg name="bandwidth" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="Reboot"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainReboot"/> diff --git a/src/domain.c b/src/domain.c index 46a8c03..b7bc10c 100644 --- a/src/domain.c +++ b/src/domain.c @@ -831,6 +831,30 @@ virtDBusDomainMigrateSetMaxDowntime(GVariant *inArgs, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainMigrateSetMaxSpeed(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gulong bandwidth; + guint flags; + + g_variant_get(inArgs, "(tu)", &bandwidth, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainMigrateSetMaxSpeed(domain, bandwidth, flags) < 0) + return virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainReboot(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1023,6 +1047,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "MigrateGetMaxDowntime", virtDBusDomainMigrateGetMaxDowntime }, { "MigrateGetMaxSpeed", virtDBusDomainMigrateGetMaxSpeed }, { "MigrateSetMaxDowntime", virtDBusDomainMigrateSetMaxDowntime }, + { "MigrateSetMaxSpeed", virtDBusDomainMigrateSetMaxSpeed }, { "Reboot", virtDBusDomainReboot }, { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, -- 2.15.0

On Fri, Apr 13, 2018 at 01:15:29PM +0200, Katerina Koukiou wrote:
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+)
[...]
+static void +virtDBusDomainMigrateSetMaxSpeed(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gulong bandwidth; + guint flags; + + g_variant_get(inArgs, "(tu)", &bandwidth, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainMigrateSetMaxSpeed(domain, bandwidth, flags) < 0) + return virtDBusUtilSetLastVirtError(error);
Here you missed removing 'return'. Pavel

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 838ebed..dc1df26 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -166,6 +166,12 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> </method> + <method name="SetMemory"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetMemoryFlags"/> + <arg name="memory" type="t" direction="in"/> + <arg name="flags" type="u" direction="in"/> + </method> <method name="SetVcpus"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSetVcpusFlags"/> diff --git a/src/domain.c b/src/domain.c index b7bc10c..72d5775 100644 --- a/src/domain.c +++ b/src/domain.c @@ -923,6 +923,31 @@ virtDBusDomainResume(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainSetMemory(GVariant *inArgs, + GUnixFDList *inFDs G_GNUC_UNUSED, + const gchar *objectPath, + gpointer userData, + GVariant **outArgs G_GNUC_UNUSED, + GUnixFDList **outFDs G_GNUC_UNUSED, + GError **error) + +{ + virtDBusConnect *connect = userData; + g_autoptr(virDomain) domain = NULL; + gulong memory; + guint flags; + + g_variant_get(inArgs, "(tu)", &memory, &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + if (virDomainSetMemoryFlags(domain, memory, flags) < 0) + virtDBusUtilSetLastVirtError(error); +} + static void virtDBusDomainSetVcpus(GVariant *inArgs, GUnixFDList *inFDs G_GNUC_UNUSED, @@ -1052,6 +1077,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Reset", virtDBusDomainReset }, { "Resume", virtDBusDomainResume }, { "SetVcpus", virtDBusDomainSetVcpus }, + { "SetMemory", virtDBusDomainSetMemory }, { "Shutdown", virtDBusDomainShutdown }, { "Suspend", virtDBusDomainSuspend }, { "Undefine", virtDBusDomainUndefine }, -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 6 ++++++ src/domain.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index dc1df26..98e2873 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -87,6 +87,12 @@ <arg name="flags" type="u" direction="in"/> <arg name="memoryParameters" 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"/> + <arg name="flags" type="u" direction="in"/> + <arg name="SchedulerParameters" type="a{sv}" direction="out"/> + </method> <method name="GetStats"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainListGetStats"/> diff --git a/src/domain.c b/src/domain.c index 72d5775..ce19e89 100644 --- a/src/domain.c +++ b/src/domain.c @@ -549,6 +549,41 @@ virtDBusDomainGetMemoryParameters(GVariant *inArgs, *outArgs = g_variant_new_tuple(&grecords, 1); } +static void +virtDBusDomainGetSchedulerParameters(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 virTypedParameterPtr params = NULL; + gint nparams; + guint flags; + GVariant *grecords; + g_autofree gchar *ret = NULL; + + g_variant_get(inArgs, "(u)", &flags); + + domain = virtDBusDomainGetVirDomain(connect, objectPath, error); + if (!domain) + return; + + ret = virDomainGetSchedulerType(domain, &nparams); + if (ret && nparams != 0) { + params = g_new0(virTypedParameter, nparams); + if (virDomainGetSchedulerParametersFlags(domain, params, &nparams, 0)) + return virtDBusUtilSetLastVirtError(error); + } + + grecords = virtDBusUtilTypedParamsToGVariant(params, nparams); + + *outArgs = g_variant_new_tuple(&grecords, 1); +} + G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainStatsRecordPtr, virDomainStatsRecordListFree); static void @@ -1062,6 +1097,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "GetBlkioParameters", virtDBusDomainGetBlkioParameters }, { "GetJobInfo", virtDBusDomainGetJobInfo }, { "GetMemoryParameters", virtDBusDomainGetMemoryParameters }, + { "GetSchedulerParameters", virtDBusDomainGetSchedulerParameters }, { "GetStats", virtDBusDomainGetStats }, { "GetVcpus", virtDBusDomainGetVcpus }, { "GetXMLDesc", virtDBusDomainGetXMLDesc }, -- 2.15.0

On Fri, Apr 13, 2018 at 01:15:11PM +0200, Katerina Koukiou wrote:
Changes from v2: Adjusted to reviews.
Katerina Koukiou (20): Implement Setter for Autostart property for Domain interface Implement SchedulerType property for Domain Interface Implement MemoryStats for Domain Interface Implement AttachDevice method for Domain Interface Implement DetachDevice method for Domain Interface Implement GetJobInfo method for Domain interface Implement AbortJob for Domain interface Implement MigrateSetMaxDowntime method for Domain interface Implement MigrateGetMaxDowntime method for Domain Interface Implement ManagedSave method for Domain Interface Implement HasManagedSaveImage method for Domain Interface Implement ManagedSaveRemove method for Domain Interface Implement SetVcpus method for Domain Interface Implement GetMemoryParameters method for Domain Interface Implement GetBlkioParameters method for domain Interface Implement Updated property for Domain Interface Implement MigrateGetMaxSpeed method for Domain Interface Implement MigrateSetMaxSpeed method for Domain Interface Implement SetMemory method for Domain Interface Implement GetSchedulerParameters method for Domain Interface
There are some small issues along the series but you can fix it before pushing, no need to repost. Nice series, a lot of new domain APIs! Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
participants (2)
-
Katerina Koukiou
-
Pavel Hrdina