[libvirt] [dbus PATCH v4 0/5] New APIs and Domain Lifecycle signal change

* Implemented Suspend and Resume APIs. * Reused virsh functions for taking the Event Strings names from ENUM. * Merged all Domain Lifecycle events signals into one signal. Changes from v3: * s/arg2/arg1/ since Event Type is the second argument of the signal. Katerina Koukiou (5): Implement Suspend method for Domain interface. Implement Resume method for Domain interface. utils: Introduce functions and macros for translating ENUMs to strings events: Introduce virtDBusEventsDomainEventToString function Merge all Domain lifecycle signals into one signal called Domain. data/org.libvirt.Connect.xml | 54 +++------------------------------------- data/org.libvirt.Domain.xml | 8 ++++++ src/domain.c | 42 +++++++++++++++++++++++++++++++ src/events.c | 59 +++++++++++++++++--------------------------- src/util.c | 27 ++++++++++++++++++++ src/util.h | 28 +++++++++++++++++++++ test/test_connect.py | 10 +++----- test/test_domain.py | 40 +++++++++++++++++++++++++----- 8 files changed, 168 insertions(+), 100 deletions(-) -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 4 ++++ src/domain.c | 21 +++++++++++++++++++++ test/test_domain.py | 15 +++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index 39212ff..f31d078 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -84,6 +84,10 @@ value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainUndefineFlags"/> <arg name="flags" type="u" direction="in"/> </method> + <method name="Suspend"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSuspend"/> + </method> <signal name="DeviceAdded"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventDeviceAddedCallback"/> diff --git a/src/domain.c b/src/domain.c index 4ff9f60..cb13b6b 100644 --- a/src/domain.c +++ b/src/domain.c @@ -450,6 +450,26 @@ virtDBusDomainUndefine(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainSuspend(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 (virDomainSuspend(domain) < 0) + virtDBusUtilSetLastVirtError(error); +} + static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { { "Name", virtDBusDomainGetName, NULL }, { "UUID", virtDBusDomainGetUUID, NULL }, @@ -472,6 +492,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Reset", virtDBusDomainReset }, { "Create", virtDBusDomainCreate }, { "Undefine", virtDBusDomainUndefine }, + { "Suspend", virtDBusDomainSuspend }, { 0 } }; diff --git a/test/test_domain.py b/test/test_domain.py index e617b1b..bb1b498 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -67,6 +67,21 @@ class TestDomain(libvirttest.BaseTestClass): self.main_loop() + def test_suspend(self): + def domain_suspended(name, path): + assert name == 'test' + assert isinstance(path, dbus.ObjectPath) + self.loop.quit() + + self.connect.connect_to_signal('DomainSuspended', domain_suspended) + + obj, domain = self.domain() + domain.Suspend() + + state = obj.Get('org.libvirt.Domain', 'State', dbus_interface=dbus.PROPERTIES_IFACE) + assert state == 'paused' + + self.main_loop() if __name__ == '__main__': libvirttest.run() -- 2.15.0

Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Domain.xml | 4 ++++ src/domain.c | 21 +++++++++++++++++++++ test/test_domain.py | 17 +++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml index f31d078..7679018 100644 --- a/data/org.libvirt.Domain.xml +++ b/data/org.libvirt.Domain.xml @@ -88,6 +88,10 @@ <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainSuspend"/> </method> + <method name="Resume"> + <annotation name="org.gtk.GDBus.DocString" + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainResume"/> + </method> <signal name="DeviceAdded"> <annotation name="org.gtk.GDBus.DocString" value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventDeviceAddedCallback"/> diff --git a/src/domain.c b/src/domain.c index cb13b6b..a530987 100644 --- a/src/domain.c +++ b/src/domain.c @@ -470,6 +470,26 @@ virtDBusDomainSuspend(GVariant *inArgs G_GNUC_UNUSED, virtDBusUtilSetLastVirtError(error); } +static void +virtDBusDomainResume(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 (virDomainResume(domain) < 0) + virtDBusUtilSetLastVirtError(error); +} + static virtDBusGDBusPropertyTable virtDBusDomainPropertyTable[] = { { "Name", virtDBusDomainGetName, NULL }, { "UUID", virtDBusDomainGetUUID, NULL }, @@ -493,6 +513,7 @@ static virtDBusGDBusMethodTable virtDBusDomainMethodTable[] = { { "Create", virtDBusDomainCreate }, { "Undefine", virtDBusDomainUndefine }, { "Suspend", virtDBusDomainSuspend }, + { "Resume", virtDBusDomainResume }, { 0 } }; diff --git a/test/test_domain.py b/test/test_domain.py index bb1b498..1433ff5 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -83,5 +83,22 @@ class TestDomain(libvirttest.BaseTestClass): self.main_loop() + def test_resume(self): + def domain_resumed(name, path): + assert name == 'test' + assert isinstance(path, dbus.ObjectPath) + self.loop.quit() + + self.connect.connect_to_signal('DomainResumed', domain_resumed) + + obj, domain = self.domain() + domain.Suspend() + domain.Resume() + + state = obj.Get('org.libvirt.Domain', 'State', dbus_interface=dbus.PROPERTIES_IFACE) + assert state == 'running' + + self.main_loop() + if __name__ == '__main__': libvirttest.run() -- 2.15.0

The functions were copied from src/util/virutil.* files from libvirt project Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- src/util.c | 27 +++++++++++++++++++++++++++ src/util.h | 28 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/util.c b/src/util.c index d6c27f3..be65172 100644 --- a/src/util.c +++ b/src/util.c @@ -124,3 +124,30 @@ virtDBusUtilVirDomainListFree(virDomainPtr *domains) g_free(domains); } + +const gchar * +virtDBusUtilEnumToString(const gchar *const *types, + guint ntypes, + gint type) +{ + if (type < 0 || (guint)type >= ntypes) + return NULL; + + return types[type]; +} + +gint +virtDBusUtilEnumFromString(const gchar *const *types, + guint ntypes, + const gchar *type) +{ + guint i; + if (!type) + return -1; + + for (i = 0; i < ntypes; i++) + if (g_str_equal(types[i], type) == 0) + return i; + + return -1; +} diff --git a/src/util.h b/src/util.h index 4304bac..c9d9cfd 100644 --- a/src/util.h +++ b/src/util.h @@ -37,3 +37,31 @@ virtDBusUtilVirDomainListFree(virDomainPtr *domains); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomain, virDomainFree); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainPtr, virtDBusUtilVirDomainListFree); + +gint +virtDBusUtilEnumFromString(const gchar *const *types, + guint ntypes, + const gchar *type) G_GNUC_PURE; + +const gchar * +virtDBusUtilEnumToString(const gchar *const *types, + guint ntypes, + gint type) G_GNUC_PURE; + +#define VIRT_DBUS_ENUM_IMPL(name, lastVal, ...) \ + static const gchar *const name ##TypeList[] = { __VA_ARGS__ }; \ + G_STATIC_ASSERT(G_N_ELEMENTS(name ##TypeList) == lastVal); \ + const gchar *name ##TypeToString(gint type) { \ + return virtDBusUtilEnumToString(name ##TypeList, \ + G_N_ELEMENTS(name ##TypeList), \ + type); \ + } \ + gint name ##TypeFromString(const gchar *type) { \ + return virtDBusUtilEnumFromString(name ##TypeList, \ + G_N_ELEMENTS(name ##TypeList), \ + type); \ + } + +#define VIRT_DBUS_ENUM_DECL(name) \ + const gchar *name ##TypeToString(gint type) G_GNUC_PURE; \ + gint name ##TypeFromString(const gchar *type) G_GNUC_PURE; -- 2.15.0

This function replaces the manual translation of Event ENUMS. Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- src/events.c | 55 +++++++++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/src/events.c b/src/events.c index dada55f..1877115 100644 --- a/src/events.c +++ b/src/events.c @@ -4,6 +4,26 @@ #include <libvirt/libvirt.h> +VIRT_DBUS_ENUM_DECL(virtDBusEventsDomainEvent) +VIRT_DBUS_ENUM_IMPL(virtDBusEventsDomainEvent, + VIR_DOMAIN_EVENT_LAST, + "DomainDefined", + "DomainUndefined", + "DomainStarted", + "DomainSuspended", + "DomainResumed", + "DomainStopped", + "DomainShutdown", + "DomainPMSuspended", + "DomainCrashed") + +static const gchar * +virtDBusEventsDomainEventToString(gint event) +{ + const gchar *str = virtDBusEventsDomainEventTypeToString(event); + return str ? str : "unknown"; +} + static gint virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, virDomainPtr domain, @@ -12,42 +32,9 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, gpointer opaque) { virtDBusConnect *connect = opaque; - const gchar *signal = NULL; const gchar *name; g_autofree gchar *path = NULL; - switch (event) { - case VIR_DOMAIN_EVENT_DEFINED: - signal = "DomainDefined"; - break; - case VIR_DOMAIN_EVENT_UNDEFINED: - signal = "DomainUndefined"; - break; - case VIR_DOMAIN_EVENT_STARTED: - signal = "DomainStarted"; - break; - case VIR_DOMAIN_EVENT_SUSPENDED: - signal = "DomainSuspended"; - break; - case VIR_DOMAIN_EVENT_RESUMED: - signal = "DomainResumed"; - break; - case VIR_DOMAIN_EVENT_STOPPED: - signal = "DomainStopped"; - break; - case VIR_DOMAIN_EVENT_SHUTDOWN: - signal = "DomainShutdown"; - break; - case VIR_DOMAIN_EVENT_PMSUSPENDED: - signal = "DomainPMSuspended"; - break; - case VIR_DOMAIN_EVENT_CRASHED: - signal = "DomainCrashed"; - break; - default: - return 0; - } - name = virDomainGetName(domain); path = virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); @@ -55,7 +42,7 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, NULL, connect->connectPath, VIRT_DBUS_CONNECT_INTERFACE, - signal, + virtDBusEventsDomainEventToString(event), g_variant_new("(so)", name, path), NULL); -- 2.15.0

On Tue, Apr 03, 2018 at 10:29:59AM +0200, Katerina Koukiou wrote:
This function replaces the manual translation of Event ENUMS.
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- src/events.c | 55 +++++++++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 34 deletions(-)
diff --git a/src/events.c b/src/events.c index dada55f..1877115 100644 --- a/src/events.c +++ b/src/events.c @@ -4,6 +4,26 @@
#include <libvirt/libvirt.h>
+VIRT_DBUS_ENUM_DECL(virtDBusEventsDomainEvent) +VIRT_DBUS_ENUM_IMPL(virtDBusEventsDomainEvent, + VIR_DOMAIN_EVENT_LAST, + "DomainDefined", + "DomainUndefined", + "DomainStarted", + "DomainSuspended", + "DomainResumed", + "DomainStopped", + "DomainShutdown", + "DomainPMSuspended", + "DomainCrashed") + +static const gchar * +virtDBusEventsDomainEventToString(gint event) +{ + const gchar *str = virtDBusEventsDomainEventTypeToString(event); + return str ? str : "unknown"; +} + static gint virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, virDomainPtr domain, @@ -12,42 +32,9 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, gpointer opaque) { virtDBusConnect *connect = opaque; - const gchar *signal = NULL; const gchar *name; g_autofree gchar *path = NULL;
- switch (event) { - case VIR_DOMAIN_EVENT_DEFINED: - signal = "DomainDefined"; - break; - case VIR_DOMAIN_EVENT_UNDEFINED: - signal = "DomainUndefined"; - break; - case VIR_DOMAIN_EVENT_STARTED: - signal = "DomainStarted"; - break; - case VIR_DOMAIN_EVENT_SUSPENDED: - signal = "DomainSuspended"; - break; - case VIR_DOMAIN_EVENT_RESUMED: - signal = "DomainResumed"; - break; - case VIR_DOMAIN_EVENT_STOPPED: - signal = "DomainStopped"; - break; - case VIR_DOMAIN_EVENT_SHUTDOWN: - signal = "DomainShutdown"; - break; - case VIR_DOMAIN_EVENT_PMSUSPENDED: - signal = "DomainPMSuspended"; - break; - case VIR_DOMAIN_EVENT_CRASHED: - signal = "DomainCrashed"; - break; - default: - return 0; - } - name = virDomainGetName(domain); path = virtDBusUtilBusPathForVirDomain(domain, connect->domainPath);
@@ -55,7 +42,7 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, NULL, connect->connectPath, VIRT_DBUS_CONNECT_INTERFACE, - signal, + virtDBusEventsDomainEventToString(event),
I've just noticed that we should check the return value of virtDBusEventsDomainEventToString() and if it's NULL simply "return 0" without emitting any signal. So this will require to use temporary variable. If you add something like this: const gchar *eventStr = virtDBusEventsDomainEventToString(event); if (!eventStr) return 0; you don't have to resend it and you can push it. Pavel

Instead of having multiple signals regarding to domain events, like DomainStarted, DomainUndefined etc, we will have only one called DomainEvents, and the specific event type will be specified in the signals arguments. The domain name argument in not needed in the signal since we can fetch it from path. The tests are adjusted to call correctly connect_to_signal method on the new signal. Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 54 +++----------------------------------------- src/events.c | 24 +++++++++----------- test/test_connect.py | 10 ++++---- test/test_domain.py | 20 +++++++--------- 4 files changed, 26 insertions(+), 82 deletions(-) diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index f24dff4..1695100 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -44,59 +44,11 @@ <arg name="uuid" type="s" direction="in"/> <arg name="domain" type="o" direction="out"/> </method> - <signal name="DomainCrashed"> + <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_CRASHED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainDefined"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_DEFINED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainPMSuspended"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_SUSPENDED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainResumed"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_RESUMED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainShutdown"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_SHUTDOWN"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainStarted"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_STARTED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainStopped"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_STOPPED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainSuspended"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_SUSPENDED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainUndefined"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_UNDEFINED"/> - <arg name="reason" type="s"/> + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> <arg name="domain" type="o"/> + <arg name="event" type="s"/> </signal> </interface> </node> diff --git a/src/events.c b/src/events.c index 1877115..9229063 100644 --- a/src/events.c +++ b/src/events.c @@ -7,15 +7,15 @@ VIRT_DBUS_ENUM_DECL(virtDBusEventsDomainEvent) VIRT_DBUS_ENUM_IMPL(virtDBusEventsDomainEvent, VIR_DOMAIN_EVENT_LAST, - "DomainDefined", - "DomainUndefined", - "DomainStarted", - "DomainSuspended", - "DomainResumed", - "DomainStopped", - "DomainShutdown", - "DomainPMSuspended", - "DomainCrashed") + "Defined", + "Undefined", + "Started", + "Suspended", + "Resumed", + "Stopped", + "Shutdown", + "PMSuspended", + "Crashed") static const gchar * virtDBusEventsDomainEventToString(gint event) @@ -32,18 +32,16 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, gpointer opaque) { virtDBusConnect *connect = opaque; - const gchar *name; g_autofree gchar *path = NULL; - name = virDomainGetName(domain); path = virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); g_dbus_connection_emit_signal(connect->bus, NULL, connect->connectPath, VIRT_DBUS_CONNECT_INTERFACE, - virtDBusEventsDomainEventToString(event), - g_variant_new("(so)", name, path), + "DomainEvent", + g_variant_new("(os)", path, virtDBusEventsDomainEventToString(event)), NULL); return 0; diff --git a/test/test_connect.py b/test/test_connect.py index 48e25cb..5df7a5b 100755 --- a/test/test_connect.py +++ b/test/test_connect.py @@ -29,12 +29,11 @@ class TestConnect(libvirttest.BaseTestClass): domain.Introspect(dbus_interface=dbus.INTROSPECTABLE_IFACE) def test_create(self): - def domain_started(name, path): - assert name == 'foo' + def domain_started(path, _event): assert isinstance(path, dbus.ObjectPath) self.loop.quit() - self.connect.connect_to_signal('DomainStarted', domain_started) + self.connect.connect_to_signal('DomainEvent', domain_started, arg1='Started') path = self.connect.CreateXML(self.minimal_xml, 0) assert isinstance(path, dbus.ObjectPath) @@ -42,12 +41,11 @@ class TestConnect(libvirttest.BaseTestClass): self.main_loop() def test_define(self): - def domain_defined(name, path): - assert name == 'foo' + def domain_defined(path, _event): assert isinstance(path, dbus.ObjectPath) self.loop.quit() - self.connect.connect_to_signal('DomainDefined', domain_defined) + self.connect.connect_to_signal('DomainEvent', domain_defined, arg1='Defined') path = self.connect.DefineXML(self.minimal_xml) assert isinstance(path, dbus.ObjectPath) diff --git a/test/test_domain.py b/test/test_domain.py index 1433ff5..d36adf7 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -38,12 +38,11 @@ class TestDomain(libvirttest.BaseTestClass): domain.Undefine(0) def test_shutdown(self): - def domain_stopped(name, path): - assert name == 'test' + def domain_stopped(path, _event): assert isinstance(path, dbus.ObjectPath) self.loop.quit() - self.connect.connect_to_signal('DomainStopped', domain_stopped) + self.connect.connect_to_signal('DomainEvent', domain_stopped, arg1='Stopped') obj, domain = self.domain() domain.Shutdown(0) @@ -54,12 +53,11 @@ class TestDomain(libvirttest.BaseTestClass): self.main_loop() def test_undefine(self): - def domain_undefined(name, path): - assert name == 'test' + def domain_undefined(path, _event): assert isinstance(path, dbus.ObjectPath) self.loop.quit() - self.connect.connect_to_signal('DomainUndefined', domain_undefined) + self.connect.connect_to_signal('DomainEvent', domain_undefined, arg1='Undefined') _, domain = self.domain() domain.Shutdown(0) @@ -68,12 +66,11 @@ class TestDomain(libvirttest.BaseTestClass): self.main_loop() def test_suspend(self): - def domain_suspended(name, path): - assert name == 'test' + def domain_suspended(path, _event): assert isinstance(path, dbus.ObjectPath) self.loop.quit() - self.connect.connect_to_signal('DomainSuspended', domain_suspended) + self.connect.connect_to_signal('DomainEvent', domain_suspended, arg1='Suspended') obj, domain = self.domain() domain.Suspend() @@ -84,12 +81,11 @@ class TestDomain(libvirttest.BaseTestClass): self.main_loop() def test_resume(self): - def domain_resumed(name, path): - assert name == 'test' + def domain_resumed(path, _event): assert isinstance(path, dbus.ObjectPath) self.loop.quit() - self.connect.connect_to_signal('DomainResumed', domain_resumed) + self.connect.connect_to_signal('DomainEvent', domain_resumed, arg1='Resumed') obj, domain = self.domain() domain.Suspend() -- 2.15.0

On Tue, Apr 03, 2018 at 10:30:00AM +0200, Katerina Koukiou wrote:
Instead of having multiple signals regarding to domain events, like DomainStarted, DomainUndefined etc, we will have only one called DomainEvents, and the specific event type will be specified in the signals arguments.
The domain name argument in not needed in the signal since we can fetch it from path.
The tests are adjusted to call correctly connect_to_signal method on the new signal.
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com> --- data/org.libvirt.Connect.xml | 54 +++----------------------------------------- src/events.c | 24 +++++++++----------- test/test_connect.py | 10 ++++---- test/test_domain.py | 20 +++++++--------- 4 files changed, 26 insertions(+), 82 deletions(-)
diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml index f24dff4..1695100 100644 --- a/data/org.libvirt.Connect.xml +++ b/data/org.libvirt.Connect.xml @@ -44,59 +44,11 @@ <arg name="uuid" type="s" direction="in"/> <arg name="domain" type="o" direction="out"/> </method> - <signal name="DomainCrashed"> + <signal name="DomainEvent"> <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_CRASHED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainDefined"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_DEFINED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainPMSuspended"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_SUSPENDED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainResumed"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_RESUMED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainShutdown"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_SHUTDOWN"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainStarted"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_STARTED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainStopped"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_STOPPED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainSuspended"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_SUSPENDED"/> - <arg name="reason" type="s"/> - <arg name="domain" type="o"/> - </signal> - <signal name="DomainUndefined"> - <annotation name="org.gtk.GDBus.DocString" - value="See https://libvirt.org/html/libvirt-libvirt-domain.html#VIR_DOMAIN_EVENT_UNDEFINED"/> - <arg name="reason" type="s"/> + value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/> <arg name="domain" type="o"/> + <arg name="event" type="s"/> </signal> </interface> </node> diff --git a/src/events.c b/src/events.c index 1877115..9229063 100644 --- a/src/events.c +++ b/src/events.c @@ -7,15 +7,15 @@ VIRT_DBUS_ENUM_DECL(virtDBusEventsDomainEvent) VIRT_DBUS_ENUM_IMPL(virtDBusEventsDomainEvent, VIR_DOMAIN_EVENT_LAST, - "DomainDefined", - "DomainUndefined", - "DomainStarted", - "DomainSuspended", - "DomainResumed", - "DomainStopped", - "DomainShutdown", - "DomainPMSuspended", - "DomainCrashed") + "Defined", + "Undefined", + "Started", + "Suspended", + "Resumed", + "Stopped", + "Shutdown", + "PMSuspended", + "Crashed")
static const gchar * virtDBusEventsDomainEventToString(gint event) @@ -32,18 +32,16 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection G_GNUC_UNUSED, gpointer opaque) { virtDBusConnect *connect = opaque; - const gchar *name; g_autofree gchar *path = NULL;
- name = virDomainGetName(domain); path = virtDBusUtilBusPathForVirDomain(domain, connect->domainPath);
g_dbus_connection_emit_signal(connect->bus, NULL, connect->connectPath, VIRT_DBUS_CONNECT_INTERFACE, - virtDBusEventsDomainEventToString(event), - g_variant_new("(so)", name, path), + "DomainEvent", + g_variant_new("(os)", path, virtDBusEventsDomainEventToString(event)),
This line is too long, but the change in the previous patch will introduce temporary variable which will fix the long line. Pavel

On Tue, Apr 03, 2018 at 10:29:55AM +0200, Katerina Koukiou wrote:
* Implemented Suspend and Resume APIs. * Reused virsh functions for taking the Event Strings names from ENUM. * Merged all Domain Lifecycle events signals into one signal.
Changes from v3: * s/arg2/arg1/ since Event Type is the second argument of the signal.
Katerina Koukiou (5): Implement Suspend method for Domain interface. Implement Resume method for Domain interface. utils: Introduce functions and macros for translating ENUMs to strings events: Introduce virtDBusEventsDomainEventToString function Merge all Domain lifecycle signals into one signal called Domain.
If you fix the small issues pointed out in the last two patches Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
participants (2)
-
Katerina Koukiou
-
Pavel Hrdina