[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