[libvirt] [PATCH 3/4] Add PMSUSPENDED life cycle event
Doug Goldstein
cardoe at gentoo.org
Thu Sep 6 23:31:11 UTC 2012
On Thu, Sep 6, 2012 at 10:09 AM, Jiri Denemark <jdenemar at redhat.com> wrote:
> While PMSUSPENDED state was added a long time ago, we didn't have
> corresponding life cycle event.
> ---
> examples/domain-events/events-c/event-test.c | 10 ++++++++++
> examples/domain-events/events-python/event-test.py | 4 +++-
> include/libvirt/libvirt.h.in | 14 ++++++++++++++
> src/qemu/qemu_process.c | 12 ++++++++++--
> 4 files changed, 37 insertions(+), 3 deletions(-)
>
> diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c
> index fc4d575..cde60fb 100644
> --- a/examples/domain-events/events-c/event-test.c
> +++ b/examples/domain-events/events-c/event-test.c
> @@ -90,6 +90,9 @@ const char *eventToString(int event) {
> case VIR_DOMAIN_EVENT_SHUTDOWN:
> ret = "Shutdown";
> break;
> + case VIR_DOMAIN_EVENT_PMSUSPENDED:
> + ret = "PMSuspended";
> + break;
> }
> return ret;
> }
> @@ -193,6 +196,13 @@ static const char *eventDetailToString(int event, int detail) {
> break;
> }
> break;
> + case VIR_DOMAIN_EVENT_PMSUSPENDED:
> + switch ((virDomainEventPMSuspendedDetailType) detail) {
> + case VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY:
> + ret = "Memory";
> + break;
> + }
> + break;
> }
> return ret;
> }
> diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py
> index e3b6ed2..fd71acd 100644
> --- a/examples/domain-events/events-python/event-test.py
> +++ b/examples/domain-events/events-python/event-test.py
> @@ -436,7 +436,8 @@ def eventToString(event):
> "Suspended",
> "Resumed",
> "Stopped",
> - "Shutdown" );
> + "Shutdown",
> + "PMSuspended" );
> return eventStrings[event];
>
> def detailToString(event, detail):
> @@ -448,6 +449,7 @@ def detailToString(event, detail):
> ( "Unpaused", "Migrated", "Snapshot" ),
> ( "Shutdown", "Destroyed", "Crashed", "Migrated", "Saved", "Failed", "Snapshot"),
> ( "Finished" )
> + ( "Memory", )
> )
> return eventStrings[event][detail]
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 44c1649..19b13a7 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -2812,6 +2812,7 @@ typedef enum {
> VIR_DOMAIN_EVENT_RESUMED = 4,
> VIR_DOMAIN_EVENT_STOPPED = 5,
> VIR_DOMAIN_EVENT_SHUTDOWN = 6,
> + VIR_DOMAIN_EVENT_PMSUSPENDED = 7,
>
> #ifdef VIR_ENUM_SENTINELS
> VIR_DOMAIN_EVENT_LAST
> @@ -2929,6 +2930,19 @@ typedef enum {
> } virDomainEventShutdownDetailType;
>
> /**
> + * virDomainEventPMSuspendedDetailType:
> + *
> + * Details about the 'pmsuspended' lifecycle event
> + */
> +typedef enum {
> + VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY = 0, /* Guest was PM suspended to memory */
> +
> +#ifdef VIR_ENUM_SENTINELS
> + VIR_DOMAIN_EVENT_PMSUSPENDED_LAST
> +#endif
> +} virDomainEventPMSuspendedDetailType;
> +
> +/**
> * virConnectDomainEventCallback:
> * @conn: virConnect connection
> * @dom: The domain on which the event occurred
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 93653c6..77d679a 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1120,6 +1120,7 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
> {
> struct qemud_driver *driver = qemu_driver;
> virDomainEventPtr event = NULL;
> + virDomainEventPtr lifecycleEvent = NULL;
>
> virDomainObjLock(vm);
> event = virDomainEventPMSuspendNewFromObj(vm);
> @@ -1131,6 +1132,10 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>
> virDomainObjSetState(vm, VIR_DOMAIN_PMSUSPENDED,
> VIR_DOMAIN_PMSUSPENDED_UNKNOWN);
> + lifecycleEvent =
> + virDomainEventNewFromObj(vm,
> + VIR_DOMAIN_EVENT_PMSUSPENDED,
> + VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY);
>
> if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) {
> VIR_WARN("Unable to save status on vm %s after suspend event",
> @@ -1143,9 +1148,12 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>
> virDomainObjUnlock(vm);
>
> - if (event) {
> + if (event || lifecycleEvent) {
> qemuDriverLock(driver);
> - qemuDomainEventQueue(driver, event);
> + if (event)
> + qemuDomainEventQueue(driver, event);
> + if (lifecycleEvent)
> + qemuDomainEventQueue(driver, lifecycleEvent);
> qemuDriverUnlock(driver);
> }
>
> --
> 1.7.12
ACK. I had noticed these missing from the Python side. Glad to see the
issue was tracked down.
--
Doug Goldstein
More information about the libvir-list
mailing list