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@xxxxxxxxxx> > --- > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list