[libvirt] [PATCH 04/13] backup: Parse and output checkpoint XML

Peter Krempa pkrempa at redhat.com
Wed Jun 19 11:43:18 UTC 2019


On Tue, Jun 18, 2019 at 22:47:45 -0500, Eric Blake wrote:
> Add a new file checkpoint_conf.c that performs the translation to and
> from new XML describing a checkpoint. The code shares a common base
> class with snapshots, since a checkpoint similarly represents the
> domain state at a moment in time. Add some basic testing of round trip
> XML handling through the new code.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  src/conf/checkpoint_conf.h                    |  94 +++
>  src/conf/virconftypes.h                       |   3 +
>  po/POTFILES                                   |   1 +
>  src/conf/Makefile.inc.am                      |   2 +
>  src/conf/checkpoint_conf.c                    | 575 ++++++++++++++++++
>  src/libvirt_private.syms                      |   8 +
>  tests/Makefile.am                             |   9 +-
>  .../internal-active-invalid.xml               |  53 ++
>  .../internal-inactive-invalid.xml             |  53 ++
>  tests/domaincheckpointxml2xmltest.c           | 223 +++++++
>  10 files changed, 1019 insertions(+), 2 deletions(-)
>  create mode 100644 src/conf/checkpoint_conf.h
>  create mode 100644 src/conf/checkpoint_conf.c
>  create mode 100644 tests/domaincheckpointxml2xmlout/internal-active-invalid.xml
>  create mode 100644 tests/domaincheckpointxml2xmlout/internal-inactive-invalid.xml
>  create mode 100644 tests/domaincheckpointxml2xmltest.c



> diff --git a/src/conf/checkpoint_conf.c b/src/conf/checkpoint_conf.c
> new file mode 100644
> index 0000000000..a7a34d3887
> --- /dev/null
> +++ b/src/conf/checkpoint_conf.c
> @@ -0,0 +1,575 @@

[...]

> +static int
> +virDomainCheckpointDiskDefParseXML(xmlNodePtr node,
> +                                   xmlXPathContextPtr ctxt,
> +                                   virDomainCheckpointDiskDefPtr def)
> +{
> +    int ret = -1;
> +    char *checkpoint = NULL;
> +    char *bitmap = NULL;
> +    xmlNodePtr saved = ctxt->node;
> +
> +    ctxt->node = node;
> +
> +    def->name = virXMLPropString(node, "name");
> +    if (!def->name) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("missing name from disk checkpoint element"));

Shouldn't schema validation catch this? If schema validation is not
enabled note that there isn't a second chance to do it.

> +        goto cleanup;
> +    }

[...]

> +
> +    if (!(def = virDomainCheckpointDefNew()))
> +        return NULL;
> +
> +    def->parent.name = virXPathString("string(./name)", ctxt);
> +    if (def->parent.name == NULL) {
> +        if (flags & VIR_DOMAIN_CHECKPOINT_PARSE_REDEFINE) {
> +            virReportError(VIR_ERR_XML_ERROR, "%s",
> +                           _("a redefined checkpoint must have a name"));
> +            goto cleanup;
> +        }
> +    }
> +
> +    def->parent.description = virXPathString("string(./description)", ctxt);
> +
> +    if (flags & VIR_DOMAIN_CHECKPOINT_PARSE_REDEFINE) {
> +        if (virXPathLongLong("string(./creationTime)", ctxt,
> +                             &def->parent.creationTime) < 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("missing creationTime from existing checkpoint"));

While I can see the point that we do the same thing in the snapshot XML
parser, having validation intermixed with the parser is not great for
the future.

> +            goto cleanup;
> +        }
> +
> +        def->parent.parent_name = virXPathString("string(./parent/name)", ctxt);
> +
> +        if ((tmp = virXPathString("string(./domain/@type)", ctxt))) {
> +            int domainflags = VIR_DOMAIN_DEF_PARSE_INACTIVE |
> +                              VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE;
> +            xmlNodePtr domainNode = virXPathNode("./domain", ctxt);

ACK, this adds bunch of technical debt based on the fact that it's
mostly copied form snapshots, but I trust you will address that later.

I'd strongly prefer if we'd do schema validation unconditionally for the
new APIs though since we won't get to fix that one later.
-------------- 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/20190619/34cd1b0f/attachment-0001.sig>


More information about the libvir-list mailing list