[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