[libvirt] [PATCH v5] virsh: Introduce virsh-pool command

Jovanka Gulicoska jovanka.gulicoska at gmail.com
Thu Jun 16 17:42:54 UTC 2016


Hi,

There is a typo in the commit message.
This patch is for introducing virsh pool-event command.


Thanks,
Jovanka

On Thu, Jun 16, 2016 at 7:27 PM, Jovanka Gulicoska <
jovanka.gulicoska at gmail.com> wrote:

> ---
>  tools/virsh-pool.c | 184
> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tools/virsh.pod    |  18 ++++++
>  2 files changed, 202 insertions(+)
>
> diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
> index f9299e2..18e218c 100644
> --- a/tools/virsh-pool.c
> +++ b/tools/virsh-pool.c
> @@ -32,6 +32,7 @@
>  #include "virfile.h"
>  #include "conf/storage_conf.h"
>  #include "virstring.h"
> +#include "virtime.h"
>
>  #define VIRSH_COMMON_OPT_POOL_FULL                            \
>      VIRSH_COMMON_OPT_POOL(N_("pool name or uuid"))            \
> @@ -1889,6 +1890,183 @@ cmdPoolEdit(vshControl *ctl, const vshCmd *cmd)
>      return ret;
>  }
>
> +/*
> + * "pool-event" command
> + */
> +VIR_ENUM_DECL(virshPoolEvent)
> +VIR_ENUM_IMPL(virshPoolEvent,
> +              VIR_STORAGE_POOL_EVENT_LAST,
> +              N_("Defined"),
> +              N_("Undefined"),
> +              N_("Started"),
> +              N_("Stopped"),
> +              N_("Refreshed"))
> +
> +static const char *
> +virshPoolEventToString(int event)
> +{
> +    const char *str = virshPoolEventTypeToString(event);
> +    return str ? _(str) : _("unknown");
> +}
> +
> +struct virshPoolEventData {
> +    vshControl *ctl;
> +    bool loop;
> +    bool timestamp;
> +    int count;
> +};
> +typedef struct virshPoolEventData virshPoolEventData;
> +
> +VIR_ENUM_DECL(virshPoolEventId)
> +VIR_ENUM_IMPL(virshPoolEventId,
> +              VIR_STORAGE_POOL_EVENT_ID_LAST,
> +              "lifecycle")
> +
> +static void
> +vshEventLifecyclePrint(virConnectPtr conn ATTRIBUTE_UNUSED,
> +                       virStoragePoolPtr pool,
> +                       int event,
> +                       int detail ATTRIBUTE_UNUSED,
> +                       void *opaque)
> +{
> +    virshPoolEventData *data = opaque;
> +
> +    if (!data->loop && data->count)
> +        return;
> +
> +    if (data->timestamp) {
> +        char timestamp[VIR_TIME_STRING_BUFLEN];
> +
> +        if (virTimeStringNowRaw(timestamp) < 0)
> +            timestamp[0] = '\0';
> +
> +        vshPrint(data->ctl, _("%s: event 'lifecycle' for storage pool %s:
> %s\n"),
> +                 timestamp,
> +                 virStoragePoolGetName(pool),
> +                 virshPoolEventToString(event));
> +    } else {
> +        vshPrint(data->ctl, _("event 'lifecycle' for storage pool %s:
> %s\n"),
> +                 virStoragePoolGetName(pool),
> +                 virshPoolEventToString(event));
> +    }
> +
> +    data->count++;
> +    if (!data->loop)
> +        vshEventDone(data->ctl);
> +}
> +
> +static const vshCmdInfo info_pool_event[] = {
> +    {.name = "help",
> +     .data = N_("Storage Pool Events")
> +    },
> +    {.name = "desc",
> +     .data = N_("List event types, or wait for storage pool events to
> occur")
> +    },
> +    {.name = NULL}
> +};
> +
> +static const vshCmdOptDef opts_pool_event[] = {
> +    {.name = "pool",
> +     .type = VSH_OT_STRING,
> +     .help = N_("filter by storage pool name or uuid")
> +    },
> +    {.name = "event",
> +     .type = VSH_OT_STRING,
> +     .help = N_("which event type to wait for")
> +    },
> +    {.name = "loop",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("loop until timeout or interrupt, rather than one-shot")
> +    },
> +    {.name = "timeout",
> +     .type = VSH_OT_INT,
> +     .help = N_("timeout seconds")
> +    },
> +    {.name = "list",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("list valid event types")
> +    },
> +    {.name = "timestamp",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("show timestamp for each printed event")
> +    },
> +    {.name = NULL}
> +};
> +
> +static bool
> +cmdPoolEvent(vshControl *ctl, const vshCmd *cmd)
> +{
> +    virStoragePoolPtr pool = NULL;
> +    bool ret = false;
> +    int eventId = -1;
> +    int timeout = 0;
> +    virshPoolEventData data;
> +    const char *eventName = NULL;
> +    int event;
> +    virshControlPtr priv = ctl->privData;
> +
> +    if (vshCommandOptBool(cmd, "list")) {
> +        size_t i;
> +
> +        for (i = 0; i < VIR_STORAGE_POOL_EVENT_ID_LAST; i++)
> +            vshPrint(ctl, "%s\n", virshPoolEventIdTypeToString(i));
> +        return true;
> +    }
> +
> +    if (vshCommandOptStringReq(ctl, cmd, "event", &eventName) < 0)
> +        return false;
> +    if (!eventName) {
> +        vshError(ctl, "%s", _("either --list or event type is required"));
> +        return false;
> +    }
> +    if ((event = virshPoolEventIdTypeFromString(eventName)) < 0) {
> +        vshError(ctl, _("unknown event type %s"), eventName);
> +        return false;
> +    }
> +
> +    data.ctl = ctl;
> +    data.loop = vshCommandOptBool(cmd, "loop");
> +    data.timestamp = vshCommandOptBool(cmd, "timestamp");
> +    data.count = 0;
> +    if (vshCommandOptTimeoutToMs(ctl, cmd, &timeout) < 0)
> +        return false;
> +
> +    if (vshCommandOptBool(cmd, "pool"))
> +        pool = virshCommandOptPool(ctl, cmd, "pool", NULL);
> +    if (vshEventStart(ctl, timeout) < 0)
> +        goto cleanup;
> +
> +    if ((eventId = virConnectStoragePoolEventRegisterAny(priv->conn,
> pool, event,
> +
>  VIR_STORAGE_POOL_EVENT_CALLBACK(vshEventLifecyclePrint),
> +                                                         &data, NULL)) <
> 0)
> +        goto cleanup;
> +    switch (vshEventWait(ctl)) {
> +    case VSH_EVENT_INTERRUPT:
> +        vshPrint(ctl, "%s", _("event loop interrupted\n"));
> +        break;
> +    case VSH_EVENT_TIMEOUT:
> +        vshPrint(ctl, "%s", _("event loop timed out\n"));
> +        break;
> +    case VSH_EVENT_DONE:
> +        break;
> +    default:
> +        goto cleanup;
> +    }
> +    vshPrint(ctl, _("events received: %d\n"), data.count);
> +    if (data.count)
> +        ret = true;
> +
> + cleanup:
> +    vshEventCleanup(ctl);
> +    if (eventId >= 0 &&
> +        virConnectStoragePoolEventDeregisterAny(priv->conn, eventId) < 0)
> +        ret = false;
> +    if (pool)
> +        virStoragePoolFree(pool);
> +    return ret;
> +}
> +
> +
>  const vshCmdDef storagePoolCmds[] = {
>      {.name = "find-storage-pool-sources-as",
>       .handler = cmdPoolDiscoverSourcesAs,
> @@ -2004,5 +2182,11 @@ const vshCmdDef storagePoolCmds[] = {
>       .info = info_pool_uuid,
>       .flags = 0
>      },
> +    {.name = "pool-event",
> +     .handler = cmdPoolEvent,
> +     .opts = opts_pool_event,
> +     .info = info_pool_event,
> +     .flags = 0
> +    },
>      {.name = NULL}
>  };
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 1e56660..e530160 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -3457,6 +3457,24 @@ Undefine the configuration for an inactive I<pool>.
>
>  Returns the UUID of the named I<pool>.
>
> +=item B<pool-event> {[I<pool>] I<event> [I<--loop>] [I<--timeout>
> +I<seconds>] [I<--timestamp>] | I<--list>}
> +
> +Wait for a class of storage pool events to occur, and print appropriate
> +details of events as they happen.  The events can optionally be filtered
> +by I<pool>.  Using I<--list> as the only argument will provide a list
> +of possible I<event> values known by this client, although the connection
> +might not allow registering for all these events.
> +
> +By default, this command is one-shot, and returns success once an event
> +occurs; you can send SIGINT (usually via C<Ctrl-C>) to quit immediately.
> +If I<--timeout> is specified, the command gives up waiting for events
> +after I<seconds> have elapsed.   With I<--loop>, the command prints all
> +events until a timeout or interrupt key.
> +
> +When I<--timestamp> is used, a human-readable timestamp will be printed
> +before the event.
> +
>  =back
>
>  =head1 VOLUME COMMANDS
> --
> 2.5.5
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160616/5c8ddac5/attachment-0001.htm>


More information about the libvir-list mailing list