On 09/27/2013 02:13 AM, Michal Privoznik wrote: > On 25.09.2013 21:15, Cole Robinson wrote: >> The user can pass it as a <test:domainsnapshot> subelement of a <domain>. >> --- >> src/test/test_driver.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 98 insertions(+), 1 deletion(-) >> >> diff --git a/src/test/test_driver.c b/src/test/test_driver.c >> index 8a690fd..6b11e9c 100644 >> --- a/src/test/test_driver.c >> +++ b/src/test/test_driver.c >> @@ -162,12 +162,24 @@ struct _testDomainNamespaceDef { >> int runstate; >> bool transient; >> bool hasManagedSave; >> + >> + unsigned int num_snap_nodes; >> + xmlNodePtr *snap_nodes; >> }; >> >> static void >> testDomainDefNamespaceFree(void *data) >> { >> testDomainNamespaceDefPtr nsdata = data; >> + size_t i; >> + >> + if (!nsdata) >> + return; >> + >> + for (i = 0; i < nsdata->num_snap_nodes; i++) >> + xmlFreeNode(nsdata->snap_nodes[i]); >> + >> + VIR_FREE(nsdata->snap_nodes); >> VIR_FREE(nsdata); >> } >> >> @@ -178,7 +190,9 @@ testDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED, >> void **data) >> { >> testDomainNamespaceDefPtr nsdata = NULL; >> - int tmp; >> + xmlNodePtr *nodes = NULL; >> + int tmp, n; >> + size_t i; >> unsigned int tmpuint; >> >> if (xmlXPathRegisterNs(ctxt, BAD_CAST "test", >> @@ -192,6 +206,26 @@ testDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED, >> if (VIR_ALLOC(nsdata) < 0) >> return -1; >> >> + n = virXPathNodeSet("./test:domainsnapshot", ctxt, &nodes); >> + if (n < 0) >> + goto error; >> + >> + if (n && VIR_ALLOC_N(nsdata->snap_nodes, n) < 0) >> + goto error; >> + >> + nsdata->num_snap_nodes = 0; > > This line ^^^ is not needed. VIR_ALLOC (not the one in this context, but > a few lines above it) fills allocated memory with zeros. So > num_snap_nodes is zero at this point. For sure. > >> + for (i = 0; i < n; i++) { >> + xmlNodePtr newnode = xmlCopyNode(nodes[i], 1); >> + if (!newnode) { >> + virReportOOMError(); >> + goto error; >> + } >> + >> + nsdata->snap_nodes[nsdata->num_snap_nodes] = newnode; >> + nsdata->num_snap_nodes++; >> + } >> + VIR_FREE(nodes); >> + >> tmp = virXPathBoolean("boolean(./test:transient)", ctxt); >> if (tmp == -1) { >> virReportError(VIR_ERR_XML_ERROR, "%s", _("invalid transient")); >> @@ -237,6 +271,7 @@ testDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED, >> return 0; >> >> error: >> + VIR_FREE(nodes); >> testDomainDefNamespaceFree(nsdata); >> return -1; >> } >> @@ -934,6 +969,63 @@ error: >> } >> >> static int >> +testParseDomainSnapshots(testConnPtr privconn, >> + virDomainObjPtr domobj, >> + const char *file, >> + xmlXPathContextPtr ctxt) >> +{ >> + size_t i; >> + int ret = -1; >> + testDomainNamespaceDefPtr nsdata = domobj->def->namespaceData; >> + xmlNodePtr *nodes = nsdata->snap_nodes; >> + >> + for (i = 0; i < nsdata->num_snap_nodes; i++) { >> + virDomainSnapshotObjPtr snap; >> + virDomainSnapshotDefPtr def; >> + xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file, >> + "domainsnapshot"); >> + if (!node) >> + goto error; >> + >> + def = virDomainSnapshotDefParseNode(ctxt->doc, node, >> + privconn->caps, >> + privconn->xmlopt, >> + 1 << VIR_DOMAIN_VIRT_TEST, >> + VIR_DOMAIN_SNAPSHOT_PARSE_DISKS | >> + VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL | >> + VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE); >> + if (!def) >> + goto error; >> + >> + if (!(snap = virDomainSnapshotAssignDef(domobj->snapshots, def))) { >> + virDomainSnapshotDefFree(def); >> + goto error; >> + } >> + >> + if (def->current) { >> + if (domobj->current_snapshot) { >> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", >> + _("more than one snapshot claims to be active")); >> + goto error; >> + } >> + >> + domobj->current_snapshot = snap; >> + } >> + } >> + >> + if (virDomainSnapshotUpdateRelations(domobj->snapshots) < 0) { >> + virReportError(VIR_ERR_INTERNAL_ERROR, >> + _("Snapshots have inconsistent relations for " >> + "domain %s"), domobj->def->name); >> + goto error; >> + } >> + >> + ret = 0; >> +error: >> + return ret; >> +} >> + >> +static int >> testParseDomains(testConnPtr privconn, >> const char *file, >> xmlXPathContextPtr ctxt) >> @@ -971,6 +1063,11 @@ testParseDomains(testConnPtr privconn, >> goto error; >> } >> >> + if (testParseDomainSnapshots(privconn, obj, file, ctxt) < 0) { >> + virObjectUnlock(obj); >> + goto error; >> + } >> + >> nsdata = def->namespaceData; >> obj->persistent = !nsdata->transient; >> obj->hasManagedSave = nsdata->hasManagedSave; >> > > ACK > > Michal > Pushed with the suggested change. Thanks, Cole -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list