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(a)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 :|