[libvirt] [PATCH v3 8/8] test: Allow specifying domainsnapshot XML

Cole Robinson crobinso at redhat.com
Tue Oct 1 17:04:45 UTC 2013


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




More information about the libvir-list mailing list