[libvirt] [PATCH v2 09/11] Give virDomainDef parser & formatter their own flags
Jiri Denemark
jdenemar at redhat.com
Tue Jan 13 14:05:48 UTC 2015
On Thu, Jan 08, 2015 at 15:48:20 +0000, Daniel Berrange wrote:
> The virDomainDefParse* and virDomainDefFormat* methods both
> accept the VIR_DOMAIN_XML_* flags defined in the public API,
> along with a set of other VIR_DOMAIN_XML_INTERNAL_* flags
> defined in domain_conf.c.
>
> This is seriously confusing & error prone for a number of
> reasons:
>
> - VIR_DOMAIN_XML_SECURE, VIR_DOMAIN_XML_MIGRATABLE and
> VIR_DOMAIN_XML_UPDATE_CPU are only relevant for the
> formatting operation
> - Some of the VIR_DOMAIN_XML_INTERNAL_* flags only apply
> to parse or to format, but not both.
>
> This patch cleanly separates out the flags. There are two
> distint VIR_DOMAIN_DEF_PARSE_* and VIR_DOMAIN_DEF_FORMAT_*
> flags that are used by the corresponding methods. The
> VIR_DOMAIN_XML_* flags received via public API calls must
> be converted to the VIR_DOMAIN_DEF_FORMAT_* flags where
> needed.
>
> The various calls to virDomainDefParse which hardcoded the
> use of the VIR_DOMAIN_XML_INACTIVE flag change to use the
> VIR_DOMAIN_DEF_PARSE_INACTIVE flag.
...
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 1e3bede..4361834 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -86,39 +86,12 @@ struct _virDomainXMLOption {
>
> /* XML namespace callbacks */
> virDomainXMLNamespace ns;
> - };
> -
> -
> -/* Private flags used internally by virDomainSaveStatus and
> - * virDomainLoadStatus, in addition to the public virDomainXMLFlags. */
> -typedef enum {
> - /* dump internal domain status information */
> - VIR_DOMAIN_XML_INTERNAL_STATUS = 1 << 16,
> - /* dump/parse <actual> element */
> - VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET = 1 << 17,
> - /* dump/parse original states of host PCI device */
> - VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES = 1 << 18,
> - VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM = 1 << 19,
> - VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT = 1 << 20,
> - VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST = 1 << 21,
> - /* parse only source half of <disk> */
> - VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE = 1 << 22,
> -} virDomainXMLInternalFlags;
> -
> -#define DUMPXML_FLAGS \
> - (VIR_DOMAIN_XML_SECURE | \
> - VIR_DOMAIN_XML_INACTIVE | \
> - VIR_DOMAIN_XML_UPDATE_CPU | \
> - VIR_DOMAIN_XML_MIGRATABLE)
> -
> -verify(((VIR_DOMAIN_XML_INTERNAL_STATUS |
> - VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET |
> - VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES |
> - VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM |
> - VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT |
> - VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST |
> - VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE)
> - & DUMPXML_FLAGS) == 0);
> +};
> +
> +#define VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS \
> + (VIR_DOMAIN_DEF_FORMAT_SECURE | \
> + VIR_DOMAIN_DEF_FORMAT_INACTIVE | \
> + VIR_DOMAIN_DEF_FORMAT_MIGRATABLE)
DUMPXML_FLAGS used to contain VIR_DOMAIN_XML_UPDATE_CPU so you either
need to include it in VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS too or
explicitly spell it everywhere VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS is
used in place of DUMPXML_FLAGS.
> VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST,
> "custom-argv",
...
> @@ -19303,8 +19274,7 @@ virDomainDefHasCapabilitiesFeatures(virDomainDefPtr def)
> return false;
> }
>
> -/* This internal version can accept VIR_DOMAIN_XML_INTERNAL_*,
> - * whereas the public version cannot. Also, it appends to an existing
> +/* This internal version appends to an existing
s/ / / and I'd even reflow the whole paragraph
> * buffer (possibly with auto-indent), rather than flattening to string.
> * Return -1 on failure. */
> int
> @@ -19320,11 +19290,11 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> bool blkio = false;
> bool cputune = false;
>
> - virCheckFlags(DUMPXML_FLAGS |
> - VIR_DOMAIN_XML_INTERNAL_STATUS |
> - VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET |
> - VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES |
> - VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST,
> + virCheckFlags(VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS |
> + VIR_DOMAIN_DEF_FORMAT_STATUS |
> + VIR_DOMAIN_DEF_FORMAT_ACTUAL_NET |
> + VIR_DOMAIN_DEF_FORMAT_PCI_ORIG_STATES |
> + VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST,
> -1);
This check does not allow VIR_DOMAIN_DEF_FORMAT_UPDATE_CPU because it's
not explicitly spelled here and VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS
doesn't contain it either.
>
> if (!(type = virDomainVirtTypeToString(def->virtType))) {
...
> @@ -19878,7 +19848,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> }
>
> if (virCPUDefFormatBufFull(buf, def->cpu,
> - !!(flags & VIR_DOMAIN_XML_UPDATE_CPU)) < 0)
> + !!(flags & VIR_DOMAIN_DEF_FORMAT_UPDATE_CPU)) < 0)
> goto error;
However, the function is apparently designed to be called with
VIR_DOMAIN_DEF_FORMAT_UPDATE_CPU.
>
> virBufferAsprintf(buf, "<clock offset='%s'",
...
> @@ -20131,12 +20101,29 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> return -1;
> }
>
> +int virDomainDefFormatConvertXMLFlags(unsigned int flags)
> +{
> + int formatFlags = 0;
The function should return unsigned int and formatFlags should be
unsigned too.
> +
> + if (flags & VIR_DOMAIN_XML_SECURE)
> + formatFlags |= VIR_DOMAIN_DEF_FORMAT_SECURE;
> + if (flags & VIR_DOMAIN_XML_INACTIVE)
> + formatFlags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE;
> + if (flags & VIR_DOMAIN_XML_UPDATE_CPU)
> + formatFlags |= VIR_DOMAIN_DEF_FORMAT_UPDATE_CPU;
> + if (flags & VIR_DOMAIN_XML_MIGRATABLE)
> + formatFlags |= VIR_DOMAIN_DEF_FORMAT_MIGRATABLE;
> +
> + return formatFlags;
> +}
> +
> +
> char *
> virDomainDefFormat(virDomainDefPtr def, unsigned int flags)
> {
> virBuffer buf = VIR_BUFFER_INITIALIZER;
>
> - virCheckFlags(DUMPXML_FLAGS, NULL);
> + virCheckFlags(VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS, NULL);
This will refuse VIR_DOMAIN_DEF_FORMAT_UPDATE_CPU.
> if (virDomainDefFormatInternal(def, flags, &buf) < 0)
> return NULL;
>
...
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index ac1f4f8..00ebdf8 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
...
> @@ -2467,6 +2498,8 @@ bool virDomainDefCheckABIStability(virDomainDefPtr src,
>
> int virDomainDefAddImplicitControllers(virDomainDefPtr def);
>
> +int virDomainDefFormatConvertXMLFlags(unsigned int flags);
unsigned int
> +
> char *virDomainDefFormat(virDomainDefPtr def,
> unsigned int flags);
> int virDomainDefFormatInternal(virDomainDefPtr def,
...
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 3d4023c..c4a9508 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
...
> @@ -2160,7 +2162,8 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
>
> virUUIDFormat(vm->def->uuid, uuidstr);
> newxml = virDomainSnapshotDefFormat(uuidstr, snapshot->def,
> - QEMU_DOMAIN_FORMAT_LIVE_FLAGS, 1);
> + VIR_DOMAIN_DEF_FORMAT_SECURE |
> + VIR_DOMAIN_DEF_FORMAT_UPDATE_CPU, 1);
What about
virDomainDefFormatConvertXMLFlags(QEMU_DOMAIN_FORMAT_LIVE_FLAGS) to make
sure we still use the right flags in case QEMU_DOMAIN_FORMAT_LIVE_FLAGS
is ever changed?
> if (newxml == NULL)
> return -1;
>
...
ACK with the small issues fixed (I don't want to review this for the
second time).
Jirka
More information about the libvir-list
mailing list