}
}
-static int testOpenVolumesForPool(xmlDocPtr xml,
- xmlXPathContextPtr ctxt,
- const char *file,
- virStoragePoolObjPtr pool,
- int poolidx) {
- char *vol_xpath;
- size_t i;
- int ret, func_ret = -1;
- xmlNodePtr *vols = NULL;
- virStorageVolDefPtr def = NULL;
-
- /* Find storage volumes */
- if (virAsprintf(&vol_xpath, "/node/pool[%d]/volume", poolidx) < 0)
- goto error;
-
- ret = virXPathNodeSet(vol_xpath, ctxt, &vols);
- VIR_FREE(vol_xpath);
- if (ret < 0) {
- goto error;
- }
-
- for (i = 0; i < ret; i++) {
- char *relFile = virXMLPropString(vols[i], "file");
- if (relFile != NULL) {
- char *absFile = testBuildFilename(file, relFile);
- VIR_FREE(relFile);
- if (!absFile) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("resolving volume filename"));
- goto error;
- }
-
- def = virStorageVolDefParseFile(pool->def, absFile);
- VIR_FREE(absFile);
- if (!def)
- goto error;
- } else {
- if ((def = virStorageVolDefParseNode(pool->def, xml,
- vols[i])) == NULL) {
- goto error;
- }
- }
-
- if (VIR_REALLOC_N(pool->volumes.objs,
- pool->volumes.count+1) < 0)
- goto error;
-
- if (def->target.path == NULL) {
- if (virAsprintf(&def->target.path, "%s/%s",
- pool->def->target.path,
- def->name) == -1)
- goto error;
- }
-
- if (!def->key && VIR_STRDUP(def->key, def->target.path) < 0)
- goto error;
-
- pool->def->allocation += def->allocation;
- pool->def->available = (pool->def->capacity -
- pool->def->allocation);
-
- pool->volumes.objs[pool->volumes.count++] = def;
- def = NULL;
- }
-
- func_ret = 0;
-error:
- virStorageVolDefFree(def);
- VIR_FREE(vols);
- return func_ret;
-}
-
-static int testOpenFromFile(virConnectPtr conn,
- const char *file) {
- size_t i;
- int ret;
- long l;
+static int
+testParseNodeInfo(virNodeInfoPtr nodeInfo, xmlXPathContextPtr ctxt)
+{
char *str;
- xmlDocPtr xml = NULL;
- xmlNodePtr *domains = NULL, *networks = NULL, *ifaces = NULL,
- *pools = NULL, *devs = NULL;
- xmlXPathContextPtr ctxt = NULL;
- virNodeInfoPtr nodeInfo;
- virNetworkObjPtr net;
- virInterfaceObjPtr iface;
- virDomainObjPtr dom;
- testConnPtr privconn;
- if (VIR_ALLOC(privconn) < 0)
- return VIR_DRV_OPEN_ERROR;
- if (virMutexInit(&privconn->lock) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("cannot initialize mutex"));
- VIR_FREE(privconn);
- return VIR_DRV_OPEN_ERROR;
- }
-
- testDriverLock(privconn);
- conn->privateData = privconn;
-
- if (!(privconn->domains = virDomainObjListNew()))
- goto error;
-
- if (!(privconn->caps = testBuildCapabilities(conn)))
- goto error;
-
- if (!(privconn->xmlopt = testBuildXMLConfig()))
- goto error;
-
- if (!(xml = virXMLParseFileCtxt(file, &ctxt))) {
- goto error;
- }
-
- if (!xmlStrEqual(ctxt->node->name, BAD_CAST "node")) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Root element is not 'node'"));
- goto error;
- }
-
- privconn->nextDomID = 1;
- privconn->numCells = 0;
- if (VIR_STRDUP(privconn->path, file) < 0)
- goto error;
- memmove(&privconn->nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo));
+ long l;
+ int ret;
- nodeInfo = &privconn->nodeInfo;
ret = virXPathLong("string(/node/cpu/nodes[1])", ctxt, &l);
if (ret == 0) {
nodeInfo->nodes = l;
goto error;
}
- nodeInfo->cpus = nodeInfo->cores * nodeInfo->threads * nodeInfo->sockets * nodeInfo->nodes;
+ nodeInfo->cpus = (nodeInfo->cores * nodeInfo->threads *
+ nodeInfo->sockets * nodeInfo->nodes);
ret = virXPathLong("string(/node/cpu/active[1])", ctxt, &l);
if (ret == 0) {
if (l < nodeInfo->cpus) {
goto error;
}
- ret = virXPathNodeSet("/node/domain", ctxt, &domains);
- if (ret < 0) {
+ return 0;
+error:
+ return -1;
+}
+
+static int
+testParseDomains(virConnectPtr conn,
+ testConnPtr privconn, const char *file,
+ xmlDocPtr doc, xmlXPathContextPtr ctxt)
+{
+ int num, ret = -1;
+ size_t i;
+ xmlNodePtr *nodes = NULL;
+ virDomainObjPtr obj;
+
+ num = virXPathNodeSet("/node/domain", ctxt, &nodes);
+ if (num < 0) {
goto error;
}
- for (i = 0; i < ret; i++) {
+ for (i = 0; i < num; i++) {
virDomainDefPtr def;
- char *relFile = virXMLPropString(domains[i], "file");
+ char *relFile = virXMLPropString(nodes[i], "file");
if (relFile != NULL) {
char *absFile = testBuildFilename(file, relFile);
VIR_FREE(relFile);
if (!def)
goto error;
} else {
- if ((def = virDomainDefParseNode(xml, domains[i],
+ if ((def = virDomainDefParseNode(doc, nodes[i],
privconn->caps, privconn->xmlopt,
1 << VIR_DOMAIN_VIRT_TEST,
VIR_DOMAIN_XML_INACTIVE)) == NULL)
}
if (testDomainGenerateIfnames(def) < 0 ||
- !(dom = virDomainObjListAdd(privconn->domains,
+ !(obj = virDomainObjListAdd(privconn->domains,
def,
privconn->xmlopt,
0, NULL))) {
goto error;
}
- dom->persistent = 1;
- if (testDomainStartState(conn, dom, VIR_DOMAIN_RUNNING_BOOTED) < 0) {
- virObjectUnlock(dom);
+ obj->persistent = 1;
+ if (testDomainStartState(conn, obj, VIR_DOMAIN_RUNNING_BOOTED) < 0) {
+ virObjectUnlock(obj);
goto error;
}
- virObjectUnlock(dom);
+ virObjectUnlock(obj);
}
- VIR_FREE(domains);
- ret = virXPathNodeSet("/node/network", ctxt, &networks);
- if (ret < 0) {
+ ret = 0;
+error:
+ VIR_FREE(nodes);
+ return ret;
+}
+
+static int
+testParseNetworks(testConnPtr privconn, const char *file,
+ xmlDocPtr doc, xmlXPathContextPtr ctxt)
+{
+ int num, ret = -1;
+ size_t i;
+ xmlNodePtr *nodes = NULL;
+ virNetworkObjPtr obj;
+
+ num = virXPathNodeSet("/node/network", ctxt, &nodes);
+ if (num < 0) {
goto error;
}
- for (i = 0; i < ret; i++) {
+
+ for (i = 0; i < num; i++) {
virNetworkDefPtr def;
- char *relFile = virXMLPropString(networks[i], "file");
+ char *relFile = virXMLPropString(nodes[i], "file");
if (relFile != NULL) {
char *absFile = testBuildFilename(file, relFile);
VIR_FREE(relFile);
if (!def)
goto error;
} else {
- if ((def = virNetworkDefParseNode(xml, networks[i])) == NULL)
+ if ((def = virNetworkDefParseNode(doc, nodes[i])) == NULL)
goto error;
}
- if (!(net = virNetworkAssignDef(&privconn->networks, def, false))) {
+
+ if (!(obj = virNetworkAssignDef(&privconn->networks, def, false))) {
virNetworkDefFree(def);
goto error;
}
- net->persistent = 1;
- net->active = 1;
- virNetworkObjUnlock(net);
+
+ obj->persistent = 1;
+ obj->active = 1;
+ virNetworkObjUnlock(obj);
}
- VIR_FREE(networks);
- /* Parse interface definitions */
- ret = virXPathNodeSet("/node/interface", ctxt, &ifaces);
- if (ret < 0) {
+ ret = 0;
+error:
+ VIR_FREE(nodes);
+ return ret;
+}
+
+static int
+testParseInterfaces(testConnPtr privconn, const char *file,
+ xmlDocPtr doc, xmlXPathContextPtr ctxt)
+{
+ int num, ret = -1;
+ size_t i;
+ xmlNodePtr *nodes = NULL;
+ virInterfaceObjPtr obj;
+
+ num = virXPathNodeSet("/node/interface", ctxt, &nodes);
+ if (num < 0) {
goto error;
}
- for (i = 0; i < ret; i++) {
+
+ for (i = 0; i < num; i++) {
virInterfaceDefPtr def;
- char *relFile = virXMLPropString(ifaces[i], "file");
+ char *relFile = virXMLPropString(nodes[i], "file");
if (relFile != NULL) {
char *absFile = testBuildFilename(file, relFile);
VIR_FREE(relFile);
if (!def)
goto error;
} else {
- if ((def = virInterfaceDefParseNode(xml, ifaces[i])) == NULL)
+ if ((def = virInterfaceDefParseNode(doc, nodes[i])) == NULL)
goto error;
}
- if (!(iface = virInterfaceAssignDef(&privconn->ifaces, def))) {
+ if (!(obj = virInterfaceAssignDef(&privconn->ifaces, def))) {
virInterfaceDefFree(def);
goto error;
}
- iface->active = 1;
- virInterfaceObjUnlock(iface);
+ obj->active = 1;
+ virInterfaceObjUnlock(obj);
+ }
+
+ ret = 0;
+error:
+ VIR_FREE(nodes);
+ return ret;
+}
+
+static int
+testOpenVolumesForPool(xmlDocPtr xml,
+ xmlXPathContextPtr ctxt,
+ const char *file,
+ virStoragePoolObjPtr pool,
+ int poolidx)
+{
+ char *vol_xpath;
+ size_t i;
+ int num, ret = -1;
+ xmlNodePtr *nodes = NULL;
+ virStorageVolDefPtr def = NULL;
+
+ /* Find storage volumes */
+ if (virAsprintf(&vol_xpath, "/node/pool[%d]/volume", poolidx) < 0)
+ goto error;
+
+ num = virXPathNodeSet(vol_xpath, ctxt, &nodes);
+ VIR_FREE(vol_xpath);
+ if (num < 0) {
+ goto error;
}
- VIR_FREE(ifaces);
- /* Parse Storage Pool list */
- ret = virXPathNodeSet("/node/pool", ctxt, &pools);
- if (ret < 0) {
+ for (i = 0; i < num; i++) {
+ char *relFile = virXMLPropString(nodes[i], "file");
+ if (relFile != NULL) {
+ char *absFile = testBuildFilename(file, relFile);
+ VIR_FREE(relFile);
+ if (!absFile) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("resolving volume filename"));
+ goto error;
+ }
+
+ def = virStorageVolDefParseFile(pool->def, absFile);
+ VIR_FREE(absFile);
+ if (!def)
+ goto error;
+ } else {
+ if ((def = virStorageVolDefParseNode(pool->def, xml,
+ nodes[i])) == NULL) {
+ goto error;
+ }
+ }
+
+ if (VIR_REALLOC_N(pool->volumes.objs,
+ pool->volumes.count+1) < 0)
+ goto error;
+
+ if (def->target.path == NULL) {
+ if (virAsprintf(&def->target.path, "%s/%s",
+ pool->def->target.path,
+ def->name) == -1)
+ goto error;
+ }
+
+ if (!def->key && VIR_STRDUP(def->key, def->target.path) < 0)
+ goto error;
+
+ pool->def->allocation += def->allocation;
+ pool->def->available = (pool->def->capacity -
+ pool->def->allocation);
+
+ pool->volumes.objs[pool->volumes.count++] = def;
+ def = NULL;
+ }
+
+ ret = 0;
+error:
+ virStorageVolDefFree(def);
+ VIR_FREE(nodes);
+ return ret;
+}
+
+static int
+testParseStorage(testConnPtr privconn, const char *file,
+ xmlDocPtr doc, xmlXPathContextPtr ctxt)
+{
+ int num, ret = -1;
+ size_t i;
+ xmlNodePtr *nodes = NULL;
+ virStoragePoolObjPtr obj;
+
+ num = virXPathNodeSet("/node/pool", ctxt, &nodes);
+ if (num < 0) {
goto error;
}
- for (i = 0; i < ret; i++) {
+
+ for (i = 0; i < num; i++) {
virStoragePoolDefPtr def;
- virStoragePoolObjPtr pool;
- char *relFile = virXMLPropString(pools[i], "file");
+ char *relFile = virXMLPropString(nodes[i], "file");
if (relFile != NULL) {
char *absFile = testBuildFilename(file, relFile);
VIR_FREE(relFile);
if (!def)
goto error;
} else {
- if ((def = virStoragePoolDefParseNode(xml,
- pools[i])) == NULL) {
+ if ((def = virStoragePoolDefParseNode(doc,
+ nodes[i])) == NULL) {
goto error;
}
}
- if (!(pool = virStoragePoolObjAssignDef(&privconn->pools,
+ if (!(obj = virStoragePoolObjAssignDef(&privconn->pools,
def))) {
virStoragePoolDefFree(def);
goto error;
}
- if (testStoragePoolObjSetDefaults(pool) == -1) {
- virStoragePoolObjUnlock(pool);
+ if (testStoragePoolObjSetDefaults(obj) == -1) {
+ virStoragePoolObjUnlock(obj);
goto error;
}
- pool->active = 1;
+ obj->active = 1;
/* Find storage volumes */
- if (testOpenVolumesForPool(xml, ctxt, file, pool, i+1) < 0) {
- virStoragePoolObjUnlock(pool);
+ if (testOpenVolumesForPool(doc, ctxt, file, obj, i+1) < 0) {
+ virStoragePoolObjUnlock(obj);
goto error;
}
- virStoragePoolObjUnlock(pool);
+ virStoragePoolObjUnlock(obj);
}
- VIR_FREE(pools);
- ret = virXPathNodeSet("/node/device", ctxt, &devs);
- if (ret < 0) {
+ ret = 0;
+error:
+ VIR_FREE(nodes);
+ return ret;
+}
+
+static int
+testParseNodedevs(testConnPtr privconn, const char *file,
+ xmlDocPtr doc, xmlXPathContextPtr ctxt)
+{
+ int num, ret = -1;
+ size_t i;
+ xmlNodePtr *nodes = NULL;
+ virNodeDeviceObjPtr obj;
+
+ num = virXPathNodeSet("/node/device", ctxt, &nodes);
+ if (num < 0) {
goto error;
}
- for (i = 0; i < ret; i++) {
+
+ for (i = 0; i < num; i++) {
virNodeDeviceDefPtr def;
- virNodeDeviceObjPtr dev;
- char *relFile = virXMLPropString(devs[i], "file");
+ char *relFile = virXMLPropString(nodes[i], "file");
if (relFile != NULL) {
char *absFile = testBuildFilename(file, relFile);
if (!def)
goto error;
} else {
- if ((def = virNodeDeviceDefParseNode(xml, devs[i], 0, NULL)) == NULL)
+ if ((def = virNodeDeviceDefParseNode(doc,
+ nodes[i], 0, NULL)) == NULL)
goto error;
}
- if (!(dev = virNodeDeviceAssignDef(&privconn->devs, def))) {
+
+ if (!(obj = virNodeDeviceAssignDef(&privconn->devs, def))) {
virNodeDeviceDefFree(def);
goto error;
}
- virNodeDeviceObjUnlock(dev);
+
+ virNodeDeviceObjUnlock(obj);
}
- VIR_FREE(devs);
+ ret = 0;
+error:
+ VIR_FREE(nodes);
+ return ret;
+}
+
+static int
+testOpenFromFile(virConnectPtr conn, const char *file)
+{
+ xmlDocPtr doc = NULL;
+ xmlXPathContextPtr ctxt = NULL;
+ testConnPtr privconn;
+
+ if (VIR_ALLOC(privconn) < 0)
+ return VIR_DRV_OPEN_ERROR;
+ if (virMutexInit(&privconn->lock) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("cannot initialize mutex"));
+ VIR_FREE(privconn);
+ return VIR_DRV_OPEN_ERROR;
+ }
+
+ testDriverLock(privconn);
+ conn->privateData = privconn;
+
+ if (!(privconn->domains = virDomainObjListNew()))
+ goto error;
+
+ if (!(privconn->caps = testBuildCapabilities(conn)))
+ goto error;
+
+ if (!(privconn->xmlopt = testBuildXMLConfig()))
+ goto error;
+
+ if (!(doc = virXMLParseFileCtxt(file, &ctxt))) {
+ goto error;
+ }
+
+ if (!xmlStrEqual(ctxt->node->name, BAD_CAST "node")) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("Root element is not 'node'"));
+ goto error;
+ }
+
+ privconn->nextDomID = 1;
+ privconn->numCells = 0;
+ if (VIR_STRDUP(privconn->path, file) < 0)
+ goto error;
+ memmove(&privconn->nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo));
+
+ if (testParseNodeInfo(&privconn->nodeInfo, ctxt) < 0)
+ goto error;
+ if (testParseDomains(conn, privconn, file, doc, ctxt) < 0)
+ goto error;
+ if (testParseNetworks(privconn, file, doc, ctxt) < 0)
+ goto error;
+ if (testParseInterfaces(privconn, file, doc, ctxt) < 0)
+ goto error;
+ if (testParseStorage(privconn, file, doc, ctxt) < 0)
+ goto error;
+ if (testParseNodedevs(privconn, file, doc, ctxt) < 0)
+ goto error;
xmlXPathFreeContext(ctxt);
- xmlFreeDoc(xml);
+ xmlFreeDoc(doc);
testDriverUnlock(privconn);
return 0;
error:
xmlXPathFreeContext(ctxt);
- xmlFreeDoc(xml);
- VIR_FREE(domains);
- VIR_FREE(networks);
- VIR_FREE(ifaces);
- VIR_FREE(pools);
- VIR_FREE(devs);
+ xmlFreeDoc(doc);
virObjectUnref(privconn->domains);
virNetworkObjListFree(&privconn->networks);
virInterfaceObjListFree(&privconn->ifaces);