virDomainSnapshotDefFormat currently takes two sets of knobs:
an 'unsigned int flags' argument that can currently just be
VIR_DOMAIN_DEF_FORMAT_SECURE, and an 'int internal' argument used as
a bool to determine whether to output an additional element. It
then reuses the 'flags' knob to call into virDomainDefFormatInternal(),
which takes a different set of flags. In fact, prior to commit 0ecd6851
(1.2.12), the 'flags' argument actually took the public
VIR_DOMAIN_XML_SECURE, which was even more confusing. Let's borrow
from the style of that earlier commit, by introducing a function
for translating from the public flags (VIR_DOMAIN_SNAPSHOT_XML_SECURE
was just recently introduced) into a new enum specific to snapshot
formatting, and adjust all callers to use snapshot-specific enum
values when formatting, and where the formatter now uses a new
variable 'domainflags' to make it obvious when we are translating
from snapshot flags back to domain flags. We don't even have to
use the conversion function for drivers that don't accept the
public VIR_DOMAIN_SNAPSHOT_XML_SECURE flag.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
src/conf/snapshot_conf.h | 10 ++++++++--
src/conf/snapshot_conf.c | 28 ++++++++++++++++++++++------
src/esx/esx_driver.c | 1 -
src/libvirt_private.syms | 1 +
src/qemu/qemu_domain.c | 3 +--
src/qemu/qemu_driver.c | 3 +--
src/test/test_driver.c | 3 +--
src/vbox/vbox_common.c | 5 ++---
src/vz/vz_driver.c | 3 +--
tests/domainsnapshotxml2xmltest.c | 16 +++++++++-------
10 files changed, 46 insertions(+), 27 deletions(-)
diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
index cc25164261..f990ec8f90 100644
--- a/src/conf/snapshot_conf.h
+++ b/src/conf/snapshot_conf.h
@@ -101,6 +101,13 @@ typedef enum {
VIR_DOMAIN_SNAPSHOT_PARSE_OFFLINE = 1 << 3,
} virDomainSnapshotParseFlags;
+typedef enum {
+ VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE = 1 << 0,
+ VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL = 1 << 1,
+} virDomainSnapshotFormatFlags;
+
+unsigned int virDomainSnapshotFormatConvertXMLFlags(unsigned int flags);
+
virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr,
virCapsPtr caps,
virDomainXMLOptionPtr xmlopt,
@@ -115,8 +122,7 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid,
virDomainSnapshotDefPtr def,
virCapsPtr caps,
virDomainXMLOptionPtr xmlopt,
- unsigned int flags,
- int internal);
+ unsigned int flags);
int virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr snapshot,
int default_snapshot,
bool require_match);
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index 1afc7de30c..b8012cb111 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -652,6 +652,19 @@ virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr def,
return ret;
}
+/* Converts public VIR_DOMAIN_SNAPSHOT_XML_* into
+ * VIR_DOMAIN_SNAPSHOT_FORMAT_* flags, and silently ignores any other
+ * flags. */
+unsigned int virDomainSnapshotFormatConvertXMLFlags(unsigned int flags)
+{
+ unsigned int formatFlags = 0;
+
+ if (flags & VIR_DOMAIN_SNAPSHOT_XML_SECURE)
+ formatFlags |= VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE;
+
+ return formatFlags;
+}
+
static int
virDomainSnapshotDiskDefFormat(virBufferPtr buf,
virDomainSnapshotDiskDefPtr disk,
@@ -692,15 +705,17 @@ virDomainSnapshotDefFormat(const char *domain_uuid,
virDomainSnapshotDefPtr def,
virCapsPtr caps,
virDomainXMLOptionPtr xmlopt,
- unsigned int flags,
- int internal)
+ unsigned int flags)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
size_t i;
+ int domainflags = VIR_DOMAIN_DEF_FORMAT_INACTIVE;
- virCheckFlags(VIR_DOMAIN_DEF_FORMAT_SECURE, NULL);
+ virCheckFlags(VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE |
+ VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL, NULL);
- flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE;
+ if (flags & VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE)
+ domainflags |= VIR_DOMAIN_DEF_FORMAT_SECURE;
virBufferAddLit(&buf, "<domainsnapshot>\n");
virBufferAdjustIndent(&buf, 2);
@@ -742,7 +757,8 @@ virDomainSnapshotDefFormat(const char *domain_uuid,
}
if (def->dom) {
- if (virDomainDefFormatInternal(def->dom, caps, flags, &buf, xmlopt) <
0)
+ if (virDomainDefFormatInternal(def->dom, caps, domainflags, &buf,
+ xmlopt) < 0)
goto error;
} else if (domain_uuid) {
virBufferAddLit(&buf, "<domain>\n");
@@ -756,7 +772,7 @@ virDomainSnapshotDefFormat(const char *domain_uuid,
virDomainXMLOptionGetSaveCookie(xmlopt)) < 0)
goto error;
- if (internal)
+ if (flags & VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL)
virBufferAsprintf(&buf, "<active>%d</active>\n",
def->current);
virBufferAdjustIndent(&buf, -2);
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index 379c2bae73..8ddfa93847 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -4204,7 +4204,6 @@ esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
virUUIDFormat(snapshot->domain->uuid, uuid_string);
xml = virDomainSnapshotDefFormat(uuid_string, &def, priv->caps,
priv->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
0);
cleanup:
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index b720acdc93..6f72d45870 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -887,6 +887,7 @@ virDomainSnapshotFindByName;
virDomainSnapshotForEach;
virDomainSnapshotForEachChild;
virDomainSnapshotForEachDescendant;
+virDomainSnapshotFormatConvertXMLFlags;
virDomainSnapshotIsExternal;
virDomainSnapshotLocationTypeFromString;
virDomainSnapshotLocationTypeToString;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index bbd4a5efe8..4a324b042a 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -8408,8 +8408,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm,
virUUIDFormat(vm->def->uuid, uuidstr);
newxml = virDomainSnapshotDefFormat(
uuidstr, snapshot->def, caps, xmlopt,
- virDomainDefFormatConvertXMLFlags(QEMU_DOMAIN_FORMAT_LIVE_FLAGS),
- 1);
+ VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL);
if (newxml == NULL)
return -1;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index fe1b7801e9..7cfeed4479 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -16262,8 +16262,7 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
xml = virDomainSnapshotDefFormat(uuidstr, snap->def,
driver->caps, driver->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
+ virDomainSnapshotFormatConvertXMLFlags(flags));
cleanup:
virDomainObjEndAPI(&vm);
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index ce0df1f8e3..a6a67d42e2 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -6209,8 +6209,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
xml = virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->caps,
privconn->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
+ virDomainSnapshotFormatConvertXMLFlags(flags));
cleanup:
virDomainObjEndAPI(&vm);
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index d95fe7c7ae..1efd357b49 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -5373,7 +5373,7 @@ vboxSnapshotRedefine(virDomainPtr dom,
VIR_FREE(currentSnapshotXmlFilePath);
if (virAsprintf(¤tSnapshotXmlFilePath, "%s%s.xml",
machineLocationPath, snapshotMachineDesc->currentSnapshot) < 0)
goto cleanup;
- char *snapshotContent = virDomainSnapshotDefFormat(NULL, def, data->caps,
data->xmlopt, VIR_DOMAIN_DEF_FORMAT_SECURE, 0);
+ char *snapshotContent = virDomainSnapshotDefFormat(NULL, def, data->caps,
data->xmlopt, VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE);
if (snapshotContent == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unable to get snapshot content"));
@@ -6321,8 +6321,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr
snapshot,
virUUIDFormat(dom->uuid, uuidstr);
memcpy(def->dom->uuid, dom->uuid, VIR_UUID_BUFLEN);
ret = virDomainSnapshotDefFormat(uuidstr, def, data->caps, data->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
+ 0);
cleanup:
virDomainSnapshotDefFree(def);
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 2d2eaf88a6..066d617524 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -2291,8 +2291,7 @@ vzDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, unsigned
int flags)
xml = virDomainSnapshotDefFormat(uuidstr, snap->def,
privconn->driver->caps,
privconn->driver->xmlopt,
- virDomainDefFormatConvertXMLFlags(flags),
- 0);
+ virDomainSnapshotFormatConvertXMLFlags(flags));
cleanup:
virDomainSnapshotObjListFree(snapshots);
diff --git a/tests/domainsnapshotxml2xmltest.c b/tests/domainsnapshotxml2xmltest.c
index 2a07fe0789..9eb71780fc 100644
--- a/tests/domainsnapshotxml2xmltest.c
+++ b/tests/domainsnapshotxml2xmltest.c
@@ -78,13 +78,16 @@ testCompareXMLToXMLFiles(const char *inxml,
char *actual = NULL;
int ret = -1;
virDomainSnapshotDefPtr def = NULL;
- unsigned int flags = VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
+ unsigned int parseflags = VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
+ unsigned int formatflags = VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE;
- if (internal)
- flags |= VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL;
+ if (internal) {
+ parseflags |= VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL;
+ formatflags |= VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL;
+ }
if (redefine)
- flags |= VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE;
+ parseflags |= VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE;
if (virTestLoadFile(inxml, &inXmlData) < 0)
goto cleanup;
@@ -94,13 +97,12 @@ testCompareXMLToXMLFiles(const char *inxml,
if (!(def = virDomainSnapshotDefParseString(inXmlData, driver.caps,
driver.xmlopt,
- flags)))
+ parseflags)))
goto cleanup;
if (!(actual = virDomainSnapshotDefFormat(uuid, def, driver.caps,
driver.xmlopt,
- VIR_DOMAIN_DEF_FORMAT_SECURE,
- internal)))
+ formatflags)))
goto cleanup;
if (!redefine) {
--
2.20.1