[libvirt] [PATCH v2 3/8] blockcopy: expose new API in virsh

Peter Krempa pkrempa at redhat.com
Tue Aug 26 15:12:32 UTC 2014


On 08/26/14 13:21, Eric Blake wrote:
> Expose the new power of virDomainBlockCopy through virsh.  Continue
> to use the older API where possible, for maximum compatibility.
> 
> The command now requires either --dest (with optional --format),
> to directly describe the file destination, or --xml, to name a
> file that contains an XML description such as:
> 
> <disk type='network'>
>   <driver type='raw'/>
>   <source protocol='gluster' name='vol1/img'>
>     <host name='red'/>
>   </source>
> </disk>
> 
> Non-zero option parameters are converted into virTypedParameters,
> and if anything requires the new API, the command can synthesize
> appropriate XML even if the --dest option was used instead of --xml.
> 
> The existing --raw flag remains for back-compat, but the preferred
> spelling is now --format=raw, since the new API now allows us
> to specify all formats rather than just a boolean raw to suppress
> probing.
> 
> I hope I did justice in describing the effects of granularity and
> buf-size on how they get passed through to qemu.
> 
> * tools/virsh-domain.c (cmdBlockCopy): Add new options --xml,
> --granularity, --buf-size, --format. Make --raw an alias for
> --format=raw. Call new API if new parameters are in use.
> * tools/virsh.pod (blockcopy): Document new options.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  tools/virsh-domain.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++-----
>  tools/virsh.pod      |  35 +++++++++------
>  2 files changed, 134 insertions(+), 25 deletions(-)
> 
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index fb9c009..a42858a 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -1793,11 +1793,10 @@ static const vshCmdOptDef opts_block_copy[] = {
>      {.name = "path",
>       .type = VSH_OT_DATA,
>       .flags = VSH_OFLAG_REQ,
> -     .help = N_("fully-qualified path of disk")
> +     .help = N_("fully-qualified path of source disk")
>      },
>      {.name = "dest",
>       .type = VSH_OT_DATA,
> -     .flags = VSH_OFLAG_REQ,
>       .help = N_("path of the copy to create")
>      },
>      {.name = "bandwidth",
> @@ -1813,8 +1812,8 @@ static const vshCmdOptDef opts_block_copy[] = {
>       .help = N_("reuse existing destination")
>      },
>      {.name = "raw",
> -     .type = VSH_OT_BOOL,
> -     .help = N_("use raw destination file")
> +     .type = VSH_OT_ALIAS,
> +     .help = "format=raw"
>      },
>      {.name = "wait",
>       .type = VSH_OT_BOOL,
> @@ -1840,6 +1839,22 @@ static const vshCmdOptDef opts_block_copy[] = {
>       .type = VSH_OT_BOOL,
>       .help = N_("with --wait, don't wait for cancel to finish")
>      },
> +    {.name = "xml",
> +     .type = VSH_OT_DATA,
> +     .help = N_("filename containing XML description of the copy destination")
> +    },
> +    {.name = "format",
> +     .type = VSH_OT_DATA,
> +     .help = N_("format of the destination file")
> +    },
> +    {.name = "granularity",
> +     .type = VSH_OT_INT,
> +     .help = N_("power-of-two granularity to use during the copy")
> +    },
> +    {.name = "buf-size",
> +     .type = VSH_OT_INT,
> +     .help = N_("maximum amount of in-flight data during the copy")
> +    },
>      {.name = NULL}
>  };
> 
> @@ -1847,9 +1862,12 @@ static bool
>  cmdBlockCopy(vshControl *ctl, const vshCmd *cmd)
>  {
>      virDomainPtr dom = NULL;
> -    const char *dest;
> +    const char *dest = NULL;
> +    const char *format = NULL;
>      unsigned long bandwidth = 0;
> -    unsigned int flags = VIR_DOMAIN_BLOCK_REBASE_COPY;
> +    unsigned int granularity = 0;
> +    unsigned int buf_size = 0;
> +    unsigned int flags = 0;
>      bool ret = false;
>      bool blocking = vshCommandOptBool(cmd, "wait");
>      bool verbose = vshCommandOptBool(cmd, "verbose");
> @@ -1864,6 +1882,22 @@ cmdBlockCopy(vshControl *ctl, const vshCmd *cmd)
>      const char *path = NULL;
>      bool quit = false;
>      int abort_flags = 0;
> +    const char *xml = NULL;
> +    char *xmlstr = NULL;
> +    virTypedParameterPtr params = NULL;
> +    int nparams = 0;
> +
> +    if (vshCommandOptStringReq(ctl, cmd, "path", &path) < 0)
> +        return false;
> +    if (vshCommandOptString(cmd, "dest", &dest) < 0)
> +        goto cleanup;
> +    if (vshCommandOptString(cmd, "xml", &xml) < 0)
> +        return false;
> +    if (vshCommandOptString(cmd, "format", &format) < 0)
> +        return false;
> +
> +    VSH_EXCLUSIVE_OPTIONS_VAR(dest, xml);
> +    VSH_EXCLUSIVE_OPTIONS_VAR(format, xml);
> 
>      if (vshCommandOptStringReq(ctl, cmd, "path", &path) < 0)
>          return false;
> @@ -1901,18 +1935,82 @@ cmdBlockCopy(vshControl *ctl, const vshCmd *cmd)
>          vshError(ctl, "%s", _("bandwidth must be a number"));
>          goto cleanup;
>      }
> +    if (vshCommandOptUIntWrap(cmd, "granularity", &granularity) < 0) {
> +        vshError(ctl, "%s", _("granularity must be a number"));
> +        goto cleanup;
> +    }

I don't think wrapping makes sense here as you've documented that it has
to be a power of 2.

> +    if (vshCommandOptUIntWrap(cmd, "buf-size", &buf_size) < 0) {
> +        vshError(ctl, "%s", _("buf-size must be a number"));
> +        goto cleanup;
> +    }
> 
> +    if (xml) {
> +        if (virFileReadAll(xml, 8192, &xmlstr) < 0) {
> +            vshReportError(ctl);
> +            goto cleanup;
> +        }
> +    } else if (!dest) {
> +        vshError(ctl, "%s", _("need either --dest or --xml"));
> +        goto cleanup;
> +    }

ACK, the wrapped granularity number should be rejected by the daemon.

Peter


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140826/2ab5e3ba/attachment-0001.sig>


More information about the libvir-list mailing list