[libvirt] [PATCH 02/14] snapshot: indent domain xml when nesting, round 2

Daniel Veillard veillard at redhat.com
Tue Sep 27 07:20:45 UTC 2011


On Thu, Sep 22, 2011 at 02:34:56PM -0600, Eric Blake wrote:
> <domainsnapshot> is the first public instance of <domain> being
> used as a sub-element, although we have two other private uses
> (runtime state, and migration cookie).  Although indentation has
> no effect on XML parsing, using it makes the output more consistent.
> 
> The overall process of adding indentation will be rather mechanical,
> but breaking it into steps will help review.  This step adds the
> framework to request the indentation.
> 
> * src/conf/domain_conf.h (virDomainDefFormatInternal): New prototype.
> * src/conf/domain_conf.c (virDomainDefFormatInternal): Add
> parameter, and export.
> (virDomainDefFormat, virDomainObjFormat): Update callers.
> * src/libvirt_private.syms (domain_conf.h): Add new export.
> * src/qemu/qemu_migration.c (qemuMigrationCookieXMLFormat): Use
> new function.
> (qemuMigrationCookieXMLFormatStr): Update caller.
> ---
>  src/conf/domain_conf.c    |   24 +++++++++++++++---------
>  src/conf/domain_conf.h    |    4 ++++
>  src/libvirt_private.syms  |    1 +
>  src/qemu/qemu_migration.c |   23 ++++++++++++-----------
>  4 files changed, 32 insertions(+), 20 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 7463d7c..3e3be3c 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -10450,14 +10450,14 @@ verify(((VIR_DOMAIN_XML_INTERNAL_STATUS |
> 
>  /* This internal version can accept VIR_DOMAIN_XML_INTERNAL_*,
>   * whereas the public version cannot.  Also, it appends to an existing
> - * buffer, rather than flattening to string.  Return -1 on failure.  */
> -static int
> + * buffer, rather than flattening to string, as well as allowing
> + * additional indentation.  Return -1 on failure.  */
> +int
>  virDomainDefFormatInternal(virDomainDefPtr def,
> +                           int indent,
>                             unsigned int flags,
>                             virBufferPtr buf)
>  {
> -    /* XXX Also need to take an indentation parameter - either int or
> -     * string prefix, so that snapshot xml gets uniform indentation.  */
>      unsigned char *uuid;
>      char uuidstr[VIR_UUID_STRING_BUFLEN];
>      const char *type = NULL;
> @@ -10477,13 +10477,16 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>      if (def->id == -1)
>          flags |= VIR_DOMAIN_XML_INACTIVE;
> 
> -    virBufferAsprintf(buf, "<domain type='%s'", type);
> +    virBufferAsprintf(buf, "%*s<domain type='%s'", indent, "", type);

  Hum I have never seen that formatting command used before. I would
rather add a virBufferIndentAsprintf() instead to be honnest and avoid
this, that's clearer from my POV.

>      if (!(flags & VIR_DOMAIN_XML_INACTIVE))
>          virBufferAsprintf(buf, " id='%d'", def->id);
>      if (def->namespaceData && def->ns.href)
>          virBufferAsprintf(buf, " %s", (def->ns.href)());
>      virBufferAddLit(buf, ">\n");
> 
> +    indent += 2;
> +    /* XXX Fix indentation of the body */
> +
>      virBufferEscapeString(buf, "  <name>%s</name>\n", def->name);
> 
>      uuid = def->uuid;
> @@ -10895,7 +10898,10 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>              goto cleanup;
>      }
> 
> -    virBufferAddLit(buf, "</domain>\n");
> +    /* XXX Fix indentation of body prior to here */
> +    indent -= 2;
> +
> +    virBufferIndentAddLit(buf, indent, "</domain>\n");
> 
>      if (virBufferError(buf))
>          goto no_memory;
> @@ -10915,7 +10921,7 @@ virDomainDefFormat(virDomainDefPtr def, unsigned int flags)
>      virBuffer buf = VIR_BUFFER_INITIALIZER;
> 
>      virCheckFlags(DUMPXML_FLAGS, NULL);
> -    if (virDomainDefFormatInternal(def, flags, &buf) < 0)
> +    if (virDomainDefFormatInternal(def, 0, flags, &buf) < 0)
>          return NULL;
> 
>      return virBufferContentAndReset(&buf);
> @@ -10947,7 +10953,7 @@ static char *virDomainObjFormat(virCapsPtr caps,
>          ((caps->privateDataXMLFormat)(&buf, obj->privateData)) < 0)
>          goto error;
> 
> -    if (virDomainDefFormatInternal(obj->def, flags, &buf) < 0)
> +    if (virDomainDefFormatInternal(obj->def, 2, flags, &buf) < 0)
>          goto error;
> 
>      virBufferAddLit(&buf, "</domstatus>\n");
> @@ -11963,7 +11969,7 @@ char *virDomainSnapshotDefFormat(char *domain_uuid,
>          virBufferAddLit(&buf, "  </disks>\n");
>      }
>      if (def->dom) {
> -        virDomainDefFormatInternal(def->dom, flags, &buf);
> +        virDomainDefFormatInternal(def->dom, 2, flags, &buf);
>      } else {
>          virBufferAddLit(&buf, "  <domain>\n");
>          virBufferAsprintf(&buf, "    <uuid>%s</uuid>\n", domain_uuid);
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 371f270..7e3c06c 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1643,6 +1643,10 @@ int virDomainDefAddImplicitControllers(virDomainDefPtr def);
> 
>  char *virDomainDefFormat(virDomainDefPtr def,
>                           unsigned int flags);
> +int virDomainDefFormatInternal(virDomainDefPtr def,
> +                               int indent,
> +                               unsigned int flags,
> +                               virBufferPtr buf);
> 
>  int virDomainCpuSetParse(const char **str,
>                           char sep,
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 1523289..f4064c0 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -265,6 +265,7 @@ virDomainDefCheckABIStability;
>  virDomainDefClearDeviceAliases;
>  virDomainDefClearPCIAddresses;
>  virDomainDefFormat;
> +virDomainDefFormatInternal;
>  virDomainDefFree;
>  virDomainDefParseFile;
>  virDomainDefParseNode;
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 0a5a13d..a131c5c 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -378,12 +378,12 @@ static void qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf,
>  }
> 
> 
> -static void qemuMigrationCookieXMLFormat(virBufferPtr buf,
> -                                         qemuMigrationCookiePtr mig)
> +static int
> +qemuMigrationCookieXMLFormat(virBufferPtr buf,
> +                             qemuMigrationCookiePtr mig)
>  {
>      char uuidstr[VIR_UUID_STRING_BUFLEN];
>      char hostuuidstr[VIR_UUID_STRING_BUFLEN];
> -    char *domXML;
>      int i;
> 
>      virUUIDFormat(mig->uuid, uuidstr);
> @@ -415,15 +415,15 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf,
>      }
> 
>      if ((mig->flags & QEMU_MIGRATION_COOKIE_PERSISTENT) &&
> -        mig->persistent) {
> -        domXML = virDomainDefFormat(mig->persistent,
> -                                    VIR_DOMAIN_XML_INACTIVE |
> -                                    VIR_DOMAIN_XML_SECURE);
> -        virBufferAdd(buf, domXML, -1);
> -        VIR_FREE(domXML);
> -    }
> +        mig->persistent &&
> +        virDomainDefFormatInternal(mig->persistent, 2,
> +                                   VIR_DOMAIN_XML_INACTIVE |
> +                                   VIR_DOMAIN_XML_SECURE,
> +                                   buf) < 0)
> +        return -1;
> 
>      virBufferAddLit(buf, "</qemu-migration>\n");
> +    return 0;
>  }
> 
> 
> @@ -431,7 +431,8 @@ static char *qemuMigrationCookieXMLFormatStr(qemuMigrationCookiePtr mig)
>  {
>      virBuffer buf = VIR_BUFFER_INITIALIZER;
> 
> -    qemuMigrationCookieXMLFormat(&buf, mig);
> +    if (qemuMigrationCookieXMLFormat(&buf, mig) < 0)
> +        return NULL;
> 
>      if (virBufferError(&buf)) {
>          virReportOOMError();

  That looks correct, I think pushing this would be fine but a separate
patch implementing and using virBufferIndentAsprintf() would be a nice
improvement,

  ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list