[libvirt] [PATCHv4 06/18] blockjob: add 'blockcopy' to virsh
Jiri Denemark
jdenemar at redhat.com
Fri Apr 13 09:55:19 UTC 2012
On Mon, Apr 09, 2012 at 21:52:15 -0600, Eric Blake wrote:
> Rather than further overloading 'blockpull', I decided to create a
> new virsh command to expose the new flags of virDomainBlockRebase.
>
> Someday, I'd also like to make blockpull and blockcopy have a
> synchronous mode, which blocks until the event happens or Ctrl-C
> is pressed, as well as a --verbose flag to print status updates
> before the job finishes - but not today.
>
> * tools/virsh.c (VSH_CMD_BLOCK_JOB_COPY): New mode.
> (blockJobImpl): Support new flags.
> (cmdBlockCopy): New command.
> (cmdBlockJob): Support new job info, new abort flag.
> * tools/virsh.pod (blockcopy, blockjob): Document the new command
> and flags.
> ---
> tools/virsh.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++-------
> tools/virsh.pod | 36 +++++++++++++++++++++++--
> 2 files changed, 101 insertions(+), 13 deletions(-)
>
> diff --git a/tools/virsh.c b/tools/virsh.c
> index 084d533..25403f5 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -7515,16 +7515,18 @@ typedef enum {
> VSH_CMD_BLOCK_JOB_INFO = 1,
> VSH_CMD_BLOCK_JOB_SPEED = 2,
> VSH_CMD_BLOCK_JOB_PULL = 3,
> -} VSH_CMD_BLOCK_JOB_MODE;
> + VSH_CMD_BLOCK_JOB_COPY = 4,
> +} vshCmdBlockJobMode;
>
> static int
> blockJobImpl(vshControl *ctl, const vshCmd *cmd,
> - virDomainBlockJobInfoPtr info, int mode)
> + virDomainBlockJobInfoPtr info, int mode)
> {
> virDomainPtr dom = NULL;
> const char *name, *path;
> unsigned long bandwidth = 0;
> int ret = -1;
> + const char *base = NULL;
> unsigned int flags = 0;
>
> if (!vshConnectionUsability(ctl, ctl->conn))
> @@ -7541,22 +7543,39 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
> goto cleanup;
> }
>
> - if (mode == VSH_CMD_BLOCK_JOB_ABORT) {
> + switch ((vshCmdBlockJobMode) mode) {
> + case VSH_CMD_BLOCK_JOB_ABORT:
> if (vshCommandOptBool(cmd, "async"))
> flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC;
> + if (vshCommandOptBool(cmd, "pivot"))
> + flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT;
> ret = virDomainBlockJobAbort(dom, path, flags);
> - } else if (mode == VSH_CMD_BLOCK_JOB_INFO) {
> + break;
> + case VSH_CMD_BLOCK_JOB_INFO:
> ret = virDomainGetBlockJobInfo(dom, path, info, 0);
> - } else if (mode == VSH_CMD_BLOCK_JOB_SPEED) {
> + break;
> + case VSH_CMD_BLOCK_JOB_SPEED:
> ret = virDomainBlockJobSetSpeed(dom, path, bandwidth, 0);
> - } else if (mode == VSH_CMD_BLOCK_JOB_PULL) {
> - const char *base = NULL;
> + break;
> + case VSH_CMD_BLOCK_JOB_PULL:
> if (vshCommandOptString(cmd, "base", &base) < 0)
> goto cleanup;
> if (base)
> ret = virDomainBlockRebase(dom, path, base, bandwidth, 0);
> else
> ret = virDomainBlockPull(dom, path, bandwidth, 0);
> + break;
> + case VSH_CMD_BLOCK_JOB_COPY:
> + flags |= VIR_DOMAIN_BLOCK_REBASE_COPY;
> + if (vshCommandOptBool(cmd, "shallow"))
> + flags |= VIR_DOMAIN_BLOCK_REBASE_SHALLOW;
> + if (vshCommandOptBool(cmd, "reuse-external"))
> + flags |= VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT;
> + if (vshCommandOptBool(cmd, "raw"))
> + flags |= VIR_DOMAIN_BLOCK_REBASE_COPY_RAW;
> + if (vshCommandOptString(cmd, "dest", &base) < 0)
> + goto cleanup;
> + ret = virDomainBlockRebase(dom, path, base, bandwidth, flags);
> }
>
> cleanup:
> @@ -7566,6 +7585,34 @@ cleanup:
> }
>
> /*
> + * "blockcopy" command
> + */
> +static const vshCmdInfo info_block_copy[] = {
> + {"help", N_("Start a block copy operation.")},
> + {"desc", N_("Populate a disk from its backing image.")},
> + {NULL, NULL}
> +};
> +
> +static const vshCmdOptDef opts_block_copy[] = {
> + {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
> + {"path", VSH_OT_DATA, VSH_OFLAG_REQ, N_("Fully-qualified path of disk")},
> + {"dest", VSH_OT_DATA, VSH_OFLAG_REQ, N_("path of the copy to create")},
> + {"bandwidth", VSH_OT_DATA, VSH_OFLAG_NONE, N_("Bandwidth limit in MB/s")},
> + {"shallow", VSH_OT_BOOL, 0, N_("make the copy share a backing chain")},
> + {"reuse-external", VSH_OT_BOOL, 0, N_("reuse existing destination")},
> + {"raw", VSH_OT_BOOL, 0, N_("use raw destination file")},
> + {NULL, 0, 0, NULL}
> +};
You are pretty inconsistent in upper/lower-case letter at the beginning of
each description string.
> +
> +static bool
> +cmdBlockCopy(vshControl *ctl, const vshCmd *cmd)
> +{
> + if (blockJobImpl(ctl, cmd, NULL, VSH_CMD_BLOCK_JOB_COPY) != 0)
> + return false;
> + return true;
> +}
> +
> +/*
> * "blockpull" command
> */
> static const vshCmdInfo info_block_pull[] = {
> @@ -7607,6 +7654,8 @@ static const vshCmdOptDef opts_block_job[] = {
> N_("Abort the active job on the specified disk")},
> {"async", VSH_OT_BOOL, VSH_OFLAG_NONE,
> N_("don't wait for --abort to complete")},
> + {"pivot", VSH_OT_BOOL, VSH_OFLAG_NONE,
> + N_("conclude and pivot a copy job")},
> {"info", VSH_OT_BOOL, VSH_OFLAG_NONE,
> N_("Get active job information for the specified disk")},
> {"bandwidth", VSH_OT_DATA, VSH_OFLAG_NONE,
This has the same kind of inconsistency but you are not making it any worse
:-)
The rest looks good.
Jirka
More information about the libvir-list
mailing list