[libvirt] [PATCH 4/8] snapshot: Add VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE flag

Peter Krempa pkrempa at redhat.com
Mon Jul 8 07:56:43 UTC 2019


On Fri, Jul 05, 2019 at 23:37:31 -0500, Eric Blake wrote:
> We've been doing a terrible job of performing XML validation in our
> various API that parse XML with a corresponding schema (we started
> with domains back in commit dd69a14f, v1.2.12, but didn't catch all
> domain-related APIs, and didn't cover other XMLM). New APIs (like

s/XMLM/XMLs/ ?

> checkpoints) should do the validation unconditionally, but it doesn't
> hurt to retrofit existing APIs to at least allow the option.  Wire up
> a new snapshot XML creation flag through all the hypervisors that
> support snapshots, as well as exposing it in 'virsh snapshot-create'.
> For 'virsh snapshot-create-as', we blindly set the flag without a
> command-line option, since the XML we create from the command line
> should always comply, but we have to add in code to disable validation
> if the server is too old to understand the flag.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  include/libvirt/libvirt-domain-snapshot.h |  2 ++
>  src/libvirt-domain-snapshot.c             |  3 +++
>  src/qemu/qemu_driver.c                    |  6 +++++-
>  src/test/test_driver.c                    |  6 +++++-
>  src/vbox/vbox_common.c                    | 11 ++++++++---
>  src/vz/vz_driver.c                        |  5 ++++-

The 'esx' driver also implements 'domainSnapshotCreateXML' as
esxDomainSnapshotCreateXML

>  tests/virsh-snapshot                      |  6 +++---
>  tools/virsh-snapshot.c                    | 15 ++++++++++++++-
>  tools/virsh.pod                           |  7 +++++--
>  9 files changed, 49 insertions(+), 12 deletions(-)

[...]

> diff --git a/src/libvirt-domain-snapshot.c b/src/libvirt-domain-snapshot.c
> index 0c8023d9f6..2687a34b96 100644
> --- a/src/libvirt-domain-snapshot.c
> +++ b/src/libvirt-domain-snapshot.c
> @@ -115,6 +115,9 @@ virDomainSnapshotGetConnect(virDomainSnapshotPtr snapshot)
>   * becomes current (see virDomainSnapshotCurrent()), and is a child
>   * of any previous current snapshot.
>   *
> + * If @flags includes VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE, then @xmlDesc
> + * must validate against the <domainsnapshot> XML schema.

s/must validate/is validated/ ?

>   * If @flags includes VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE, then this
>   * is a request to reinstate snapshot metadata that was previously
>   * captured from virDomainSnapshotGetXMLDesc() before removing that

[...]

> diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
> index 54e31bec9d..8a912da50c 100644
> --- a/src/vbox/vbox_common.c
> +++ b/src/vbox/vbox_common.c
> @@ -5487,6 +5487,8 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom,
>      nsresult rc;
>      resultCodeUnion result;
>      virDomainSnapshotPtr ret = NULL;
> +    unsigned int parse_flags = (VIR_DOMAIN_SNAPSHOT_PARSE_DISKS |
> +                                VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE);

Parentheses unnecessary.

>      VIR_AUTOUNREF(virDomainSnapshotDefPtr) def = NULL;
> 
>      if (!data->vboxObj)

[...]

> diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c
> index e9f0ee0810..f7772ce549 100644
> --- a/tools/virsh-snapshot.c
> +++ b/tools/virsh-snapshot.c
> @@ -50,6 +50,13 @@ virshSnapshotCreate(vshControl *ctl, virDomainPtr dom, const char *buffer,
> 
>      snapshot = virDomainSnapshotCreateXML(dom, buffer, flags);
> 
> +    /* If no source file but validate was not recognized, try again without
> +     * that flag. */
> +    if (!snapshot && last_error->code == VIR_ERR_NO_SUPPORT && !from) {
> +        flags &= ~VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE;
> +        snapshot = virDomainSnapshotCreateXML(dom, buffer, flags);
> +    }

I think this compatibility glue is unnecessary ...

> +
>      /* Emulate --halt on older servers.  */
>      if (!snapshot && last_error->code == VIR_ERR_INVALID_ARG &&
>          (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) {

[...]

> @@ -177,6 +188,8 @@ cmdSnapshotCreate(vshControl *ctl, const vshCmd *cmd)
>          flags |= VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC;
>      if (vshCommandOptBool(cmd, "live"))
>          flags |= VIR_DOMAIN_SNAPSHOT_CREATE_LIVE;
> +    if (vshCommandOptBool(cmd, "validate"))
> +        flags |= VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE;
> 
>      if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
>          goto cleanup;
> @@ -366,7 +379,7 @@ cmdSnapshotCreateAs(vshControl *ctl, const vshCmd *cmd)
>      const char *desc = NULL;
>      const char *memspec = NULL;
>      virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    unsigned int flags = 0;
> +    unsigned int flags = VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE;

... just to validate something we always generated ourselves.

ACK if you remove the use of the flag in cmdSnapshotCreateAs. Other are
at your discretion.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190708/8e68b76d/attachment-0001.sig>


More information about the libvir-list mailing list