On Mon, Mar 11, 2019 at 09:38:34PM -0500, Eric Blake wrote:
Change the return value of virDomainSnapshotObjLisParse() to return
the number of snapshots imported, and allow a return of 0 (the
original proposal of adding a flag to virDomainSnapshotCreateXML
required returning an arbitrary non-NULL snapshot, but with a new API
that returns a count, we are no longer constrained to a non-empty
list).
Change virDomainSnapshotObjListFormat()'s flags argument to be
the new public virDomainGetSnapshotsXMLFlags, since it is easy
to support both flag values.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
src/conf/snapshot_conf.c | 30 +++++++++++++++++-------------
1 file changed, 17 insertions(+), 13 deletions(-)
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index 8235d7c526..3f24a80f76 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -507,8 +507,10 @@ virDomainSnapshotRedefineValidate(virDomainSnapshotDefPtr def,
}
-/* Parse a <snapshots> XML entry into snapshots, which must start empty.
- * Any <domain> sub-elements of a <domainsnapshot> must match domain_uuid.
+/* Parse a <snapshots> XML entry into snapshots, which must start
+ * empty. Any <domain> sub-elements of a <domainsnapshot> must match
+ * domain_uuid. @flags is virDomainSnapshotParseFlags. Return the
Do we need to pass (and check) the flags here?
Given this series, it would also make sense to me to drop the flags
argument and just imply the ones that are needed for bulk parse.
+ * number of snapshots parsed, or -1 on error.
*/
int
virDomainSnapshotObjListParse(const char *xmlStr,
@@ -562,11 +564,6 @@ virDomainSnapshotObjListParse(const char *xmlStr,
if ((n = virXPathNodeSet("./domainsnapshot", ctxt, &nodes)) < 0)
goto cleanup;
- if (!n) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("expected at least one <domainsnapshot>
child"));
- goto cleanup;
- }
for (i = 0; i < n; i++) {
virDomainSnapshotDefPtr def;
@@ -601,7 +598,7 @@ virDomainSnapshotObjListParse(const char *xmlStr,
(*current_snap)->def->current = true;
}
- ret = 0;
+ ret = n;
cleanup:
if (ret < 0) {
/* There were no snapshots before this call; so on error, just
@@ -1025,8 +1022,9 @@ virDomainSnapshotFormatOne(void *payload,
}
-/* Format the XML for all snapshots in the list into buf. On error,
- * clear the buffer and return -1. */
+/* Format the XML for all snapshots in the list into buf. @flags is
+ * virDomainGetSnapshotsXMLFlags. On error, clear the buffer and
+ * return -1. */
int
virDomainSnapshotObjListFormat(virBufferPtr buf,
const char *uuidstr,
@@ -1041,17 +1039,23 @@ virDomainSnapshotObjListFormat(virBufferPtr buf,
.uuidstr = uuidstr,
.caps = caps,
.xmlopt = xmlopt,
- .flags = flags,
+ .flags = 0,
};
You can use virXMLFormatElement here:
VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER;
data.buf = &childBuf;
+ bool topological = flags &
VIR_DOMAIN_GET_SNAPSHOTS_XML_TOPOLOGICAL;
+ virCheckFlags(VIR_DOMAIN_GET_SNAPSHOTS_XML_SECURE |
+ VIR_DOMAIN_GET_SNAPSHOTS_XML_TOPOLOGICAL, -1);
+
+ if (flags & VIR_DOMAIN_GET_SNAPSHOTS_XML_SECURE)
+ data.flags |= VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE;
This:
virBufferAddLit(buf, "<snapshots");
if (current_snapshot)
virBufferEscapeString(buf, " current='%s'",
current_snapshot->def->name);
virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2);
- if (virDomainSnapshotForEach(snapshots, false, virDomainSnapshotFormatOne,
- &data) < 0) {
+ if (virDomainSnapshotForEach(snapshots, topological,
+ virDomainSnapshotFormatOne, &data) < 0) {
would become:
if (current_snapshot) {
virBufferEscapeString(&attrBuf, " current='%s'",
current_snapshot->def->name);
}
virBufferSetChildIndent(&childBuf, buf);
if (virDomainSnapshotForEach() < 0)
...
if (virXMLFormatElement(buf, "snapshots", &attrBuf, &childBuf) <
0) {
virBufferFreeAndReset(buf); /* as required by the function
documentation */
return -1;
}
With the benefit of outputting a non-pair tag for empty snapshot list.
virBufferFreeAndReset(buf);
return -1;
}
Reviewed-by: Ján Tomko <jtomko(a)redhat.com>
Jano