[libvirt] [PATCH 3/4] virsh: add event command, for lifecycle events

Daniel P. Berrange berrange at redhat.com
Thu Feb 20 17:33:11 UTC 2014


On Fri, Feb 14, 2014 at 05:21:40PM -0700, Eric Blake wrote:
> Add 'virsh event --list' and 'virsh event [dom] --event=name
> [--loop] [--timeout]'.  Borrows somewhat from event-test.c,
> but defaults to a one-shot notification, and takes advantage
> of the event loop integration to allow Ctrl-C to interrupt the
> wait for an event.  For now, this just does lifecycle events.
> 
> * tools/virsh.pod (event): Document new command.
> * tools/virsh-domain.c (vshDomainEventToString)
> (vshDomainEventDetailToString, vshDomEventData)
> (vshEventLifecyclePrint, cmdEvent): New struct and functions.

ACK

> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  tools/virsh-domain.c | 338 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  tools/virsh.pod      |  15 +++
>  2 files changed, 353 insertions(+)
> 
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 2c7bf66..3548131 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -10295,6 +10295,338 @@ cmdEdit(vshControl *ctl, const vshCmd *cmd)
>      return ret;
>  }
> 
> +
> +/*
> + * "event" command
> + */
> +static const char *
> +vshDomainEventToString(int event)
> +{
> +    const char *ret = _("unknown");
> +    switch ((virDomainEventType) event) {
> +    case VIR_DOMAIN_EVENT_DEFINED:
> +        ret = _("Defined");
> +        break;
> +    case VIR_DOMAIN_EVENT_UNDEFINED:
> +        ret = _("Undefined");
> +        break;
> +    case VIR_DOMAIN_EVENT_STARTED:
> +        ret = _("Started");
> +        break;
> +    case VIR_DOMAIN_EVENT_SUSPENDED:
> +        ret = _("Suspended");
> +        break;
> +    case VIR_DOMAIN_EVENT_RESUMED:
> +        ret = _("Resumed");
> +        break;
> +    case VIR_DOMAIN_EVENT_STOPPED:
> +        ret = _("Stopped");
> +        break;
> +    case VIR_DOMAIN_EVENT_SHUTDOWN:
> +        ret = _("Shutdown");
> +        break;
> +    case VIR_DOMAIN_EVENT_PMSUSPENDED:
> +        ret = _("PMSuspended");
> +        break;
> +    case VIR_DOMAIN_EVENT_CRASHED:
> +        ret = _("Crashed");
> +        break;
> +    case VIR_DOMAIN_EVENT_LAST:
> +        break;
> +    }
> +    return ret;
> +}

How about using VIR_ENUM ?

We avoided it in the event-test.c file since we wanted it to
be example code people can compile outside libvirt. Using
enums would be fine for virsh though i think

> +
> +static const char *
> +vshDomainEventDetailToString(int event, int detail)
> +{
> +    const char *ret = _("unknown");
> +    switch ((virDomainEventType) event) {
> +    case VIR_DOMAIN_EVENT_DEFINED:
> +        switch ((virDomainEventDefinedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_DEFINED_ADDED:
> +            ret = _("Added");
> +            break;
> +        case VIR_DOMAIN_EVENT_DEFINED_UPDATED:
> +            ret = _("Updated");
> +            break;
> +        case VIR_DOMAIN_EVENT_DEFINED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_UNDEFINED:
> +        switch ((virDomainEventUndefinedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_UNDEFINED_REMOVED:
> +            ret = _("Removed");
> +            break;
> +        case VIR_DOMAIN_EVENT_UNDEFINED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_STARTED:
> +        switch ((virDomainEventStartedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_STARTED_BOOTED:
> +            ret = _("Booted");
> +            break;
> +        case VIR_DOMAIN_EVENT_STARTED_MIGRATED:
> +            ret = _("Migrated");
> +            break;
> +        case VIR_DOMAIN_EVENT_STARTED_RESTORED:
> +            ret = _("Restored");
> +            break;
> +        case VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT:
> +            ret = _("Snapshot");
> +            break;
> +        case VIR_DOMAIN_EVENT_STARTED_WAKEUP:
> +            ret = _("Event wakeup");
> +            break;
> +        case VIR_DOMAIN_EVENT_STARTED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_SUSPENDED:
> +        switch ((virDomainEventSuspendedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_SUSPENDED_PAUSED:
> +            ret = _("Paused");
> +            break;
> +        case VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED:
> +            ret = _("Migrated");
> +            break;
> +        case VIR_DOMAIN_EVENT_SUSPENDED_IOERROR:
> +            ret = _("I/O Error");
> +            break;
> +        case VIR_DOMAIN_EVENT_SUSPENDED_WATCHDOG:
> +            ret = _("Watchdog");
> +            break;
> +        case VIR_DOMAIN_EVENT_SUSPENDED_RESTORED:
> +            ret = _("Restored");
> +            break;
> +        case VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT:
> +            ret = _("Snapshot");
> +            break;
> +        case VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR:
> +            ret = _("API error");
> +            break;
> +        case VIR_DOMAIN_EVENT_SUSPENDED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_RESUMED:
> +        switch ((virDomainEventResumedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_RESUMED_UNPAUSED:
> +            ret = _("Unpaused");
> +            break;
> +        case VIR_DOMAIN_EVENT_RESUMED_MIGRATED:
> +            ret = _("Migrated");
> +            break;
> +        case VIR_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT:
> +            ret = _("Snapshot");
> +            break;
> +        case VIR_DOMAIN_EVENT_RESUMED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_STOPPED:
> +        switch ((virDomainEventStoppedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN:
> +            ret = _("Shutdown");
> +            break;
> +        case VIR_DOMAIN_EVENT_STOPPED_DESTROYED:
> +            ret = _("Destroyed");
> +            break;
> +        case VIR_DOMAIN_EVENT_STOPPED_CRASHED:
> +            ret = _("Crashed");
> +            break;
> +        case VIR_DOMAIN_EVENT_STOPPED_MIGRATED:
> +            ret = _("Migrated");
> +            break;
> +        case VIR_DOMAIN_EVENT_STOPPED_SAVED:
> +            ret = _("Saved");
> +            break;
> +        case VIR_DOMAIN_EVENT_STOPPED_FAILED:
> +            ret = _("Failed");
> +            break;
> +        case VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT:
> +            ret = _("Snapshot");
> +            break;
> +        case VIR_DOMAIN_EVENT_STOPPED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_SHUTDOWN:
> +        switch ((virDomainEventShutdownDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED:
> +            ret = _("Finished");
> +            break;
> +        case VIR_DOMAIN_EVENT_SHUTDOWN_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_PMSUSPENDED:
> +        switch ((virDomainEventPMSuspendedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY:
> +            ret = _("Memory");
> +            break;
> +        case VIR_DOMAIN_EVENT_PMSUSPENDED_DISK:
> +            ret = _("Disk");
> +            break;
> +        case VIR_DOMAIN_EVENT_PMSUSPENDED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_CRASHED:
> +        switch ((virDomainEventCrashedDetailType) detail) {
> +        case VIR_DOMAIN_EVENT_CRASHED_PANICKED:
> +            ret = _("Panicked");
> +            break;
> +        case VIR_DOMAIN_EVENT_CRASHED_LAST:
> +            break;
> +        }
> +        break;
> +    case VIR_DOMAIN_EVENT_LAST:
> +        break;
> +    }

And VIR_ENUM for each of the detail sets ?

> +    return ret;
> +}
> +

> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index f221475..0878778 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> +By default, tihs command is one-shot, and returns success once an event

s/tihs/this/ 

Rare case of me spotting a typo in your code, instead of the
reverse :-)

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list