提交 49ecff3e 编写于 作者: C Cole Robinson

test: Unify object XML parsing

Right now things are split a bit between parsing from a relative file
path or parsing from inline XML. Unify it. This will simplify upcoming
bits.
上级 23d5e6f5
...@@ -687,6 +687,43 @@ static char *testBuildFilename(const char *relativeTo, ...@@ -687,6 +687,43 @@ static char *testBuildFilename(const char *relativeTo,
} }
} }
static xmlNodePtr
testParseXMLDocFromFile(xmlNodePtr node, const char *file, const char *type)
{
xmlNodePtr ret = NULL;
xmlDocPtr doc = NULL;
char *absFile = NULL;
char *relFile = virXMLPropString(node, "file");
if (relFile != NULL) {
absFile = testBuildFilename(file, relFile);
VIR_FREE(relFile);
if (!absFile) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("resolving %s filename"), type);
return NULL;
}
if (!(doc = virXMLParse(absFile, NULL, type)))
goto error;
ret = xmlCopyNode(xmlDocGetRootElement(doc), 1);
if (!ret) {
virReportOOMError();
goto error;
}
xmlReplaceNode(node, ret);
xmlFreeNode(node);
} else {
ret = node;
}
error:
xmlFreeDoc(doc);
VIR_FREE(absFile);
return ret;
}
static int static int
testParseNodeInfo(virNodeInfoPtr nodeInfo, xmlXPathContextPtr ctxt) testParseNodeInfo(virNodeInfoPtr nodeInfo, xmlXPathContextPtr ctxt)
{ {
...@@ -777,8 +814,9 @@ error: ...@@ -777,8 +814,9 @@ error:
} }
static int static int
testParseDomains(testConnPtr privconn, const char *file, testParseDomains(testConnPtr privconn,
xmlDocPtr doc, xmlXPathContextPtr ctxt) const char *file,
xmlXPathContextPtr ctxt)
{ {
int num, ret = -1; int num, ret = -1;
size_t i; size_t i;
...@@ -792,29 +830,16 @@ testParseDomains(testConnPtr privconn, const char *file, ...@@ -792,29 +830,16 @@ testParseDomains(testConnPtr privconn, const char *file,
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
virDomainDefPtr def; virDomainDefPtr def;
char *relFile = virXMLPropString(nodes[i], "file"); xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file, "domain");
if (relFile != NULL) { if (!node)
char *absFile = testBuildFilename(file, relFile); goto error;
VIR_FREE(relFile);
if (!absFile) { def = virDomainDefParseNode(ctxt->doc, node,
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", privconn->caps, privconn->xmlopt,
_("resolving domain filename")); 1 << VIR_DOMAIN_VIRT_TEST,
goto error; VIR_DOMAIN_XML_INACTIVE);
} if (!def)
def = virDomainDefParseFile(absFile, privconn->caps, goto error;
privconn->xmlopt,
1 << VIR_DOMAIN_VIRT_TEST,
VIR_DOMAIN_XML_INACTIVE);
VIR_FREE(absFile);
if (!def)
goto error;
} else {
if ((def = virDomainDefParseNode(doc, nodes[i],
privconn->caps, privconn->xmlopt,
1 << VIR_DOMAIN_VIRT_TEST,
VIR_DOMAIN_XML_INACTIVE)) == NULL)
goto error;
}
if (testDomainGenerateIfnames(def) < 0 || if (testDomainGenerateIfnames(def) < 0 ||
!(obj = virDomainObjListAdd(privconn->domains, !(obj = virDomainObjListAdd(privconn->domains,
...@@ -842,8 +867,9 @@ error: ...@@ -842,8 +867,9 @@ error:
} }
static int static int
testParseNetworks(testConnPtr privconn, const char *file, testParseNetworks(testConnPtr privconn,
xmlDocPtr doc, xmlXPathContextPtr ctxt) const char *file,
xmlXPathContextPtr ctxt)
{ {
int num, ret = -1; int num, ret = -1;
size_t i; size_t i;
...@@ -857,24 +883,13 @@ testParseNetworks(testConnPtr privconn, const char *file, ...@@ -857,24 +883,13 @@ testParseNetworks(testConnPtr privconn, const char *file,
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
virNetworkDefPtr def; virNetworkDefPtr def;
char *relFile = virXMLPropString(nodes[i], "file"); xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file, "network");
if (relFile != NULL) { if (!node)
char *absFile = testBuildFilename(file, relFile); goto error;
VIR_FREE(relFile);
if (!absFile) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("resolving network filename"));
goto error;
}
def = virNetworkDefParseFile(absFile); def = virNetworkDefParseNode(ctxt->doc, node);
VIR_FREE(absFile); if (!def)
if (!def) goto error;
goto error;
} else {
if ((def = virNetworkDefParseNode(doc, nodes[i])) == NULL)
goto error;
}
if (!(obj = virNetworkAssignDef(&privconn->networks, def, false))) { if (!(obj = virNetworkAssignDef(&privconn->networks, def, false))) {
virNetworkDefFree(def); virNetworkDefFree(def);
...@@ -893,8 +908,9 @@ error: ...@@ -893,8 +908,9 @@ error:
} }
static int static int
testParseInterfaces(testConnPtr privconn, const char *file, testParseInterfaces(testConnPtr privconn,
xmlDocPtr doc, xmlXPathContextPtr ctxt) const char *file,
xmlXPathContextPtr ctxt)
{ {
int num, ret = -1; int num, ret = -1;
size_t i; size_t i;
...@@ -908,24 +924,14 @@ testParseInterfaces(testConnPtr privconn, const char *file, ...@@ -908,24 +924,14 @@ testParseInterfaces(testConnPtr privconn, const char *file,
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
virInterfaceDefPtr def; virInterfaceDefPtr def;
char *relFile = virXMLPropString(nodes[i], "file"); xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
if (relFile != NULL) { "interface");
char *absFile = testBuildFilename(file, relFile); if (!node)
VIR_FREE(relFile); goto error;
if (!absFile) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("resolving interface filename"));
goto error;
}
def = virInterfaceDefParseFile(absFile); def = virInterfaceDefParseNode(ctxt->doc, node);
VIR_FREE(absFile); if (!def)
if (!def) goto error;
goto error;
} else {
if ((def = virInterfaceDefParseNode(doc, nodes[i])) == NULL)
goto error;
}
if (!(obj = virInterfaceAssignDef(&privconn->ifaces, def))) { if (!(obj = virInterfaceAssignDef(&privconn->ifaces, def))) {
virInterfaceDefFree(def); virInterfaceDefFree(def);
...@@ -943,9 +949,8 @@ error: ...@@ -943,9 +949,8 @@ error:
} }
static int static int
testOpenVolumesForPool(xmlDocPtr xml, testOpenVolumesForPool(const char *file,
xmlXPathContextPtr ctxt, xmlXPathContextPtr ctxt,
const char *file,
virStoragePoolObjPtr pool, virStoragePoolObjPtr pool,
int poolidx) int poolidx)
{ {
...@@ -966,26 +971,14 @@ testOpenVolumesForPool(xmlDocPtr xml, ...@@ -966,26 +971,14 @@ testOpenVolumesForPool(xmlDocPtr xml,
} }
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
char *relFile = virXMLPropString(nodes[i], "file"); xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
if (relFile != NULL) { "volume");
char *absFile = testBuildFilename(file, relFile); if (!node)
VIR_FREE(relFile); goto error;
if (!absFile) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("resolving volume filename"));
goto error;
}
def = virStorageVolDefParseFile(pool->def, absFile); def = virStorageVolDefParseNode(pool->def, ctxt->doc, node);
VIR_FREE(absFile); if (!def)
if (!def) goto error;
goto error;
} else {
if ((def = virStorageVolDefParseNode(pool->def, xml,
nodes[i])) == NULL) {
goto error;
}
}
if (VIR_REALLOC_N(pool->volumes.objs, if (VIR_REALLOC_N(pool->volumes.objs,
pool->volumes.count+1) < 0) pool->volumes.count+1) < 0)
...@@ -1017,8 +1010,9 @@ error: ...@@ -1017,8 +1010,9 @@ error:
} }
static int static int
testParseStorage(testConnPtr privconn, const char *file, testParseStorage(testConnPtr privconn,
xmlDocPtr doc, xmlXPathContextPtr ctxt) const char *file,
xmlXPathContextPtr ctxt)
{ {
int num, ret = -1; int num, ret = -1;
size_t i; size_t i;
...@@ -1032,26 +1026,14 @@ testParseStorage(testConnPtr privconn, const char *file, ...@@ -1032,26 +1026,14 @@ testParseStorage(testConnPtr privconn, const char *file,
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
virStoragePoolDefPtr def; virStoragePoolDefPtr def;
char *relFile = virXMLPropString(nodes[i], "file"); xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
if (relFile != NULL) { "pool");
char *absFile = testBuildFilename(file, relFile); if (!node)
VIR_FREE(relFile); goto error;
if (!absFile) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("resolving pool filename"));
goto error;
}
def = virStoragePoolDefParseFile(absFile); def = virStoragePoolDefParseNode(ctxt->doc, node);
VIR_FREE(absFile); if (!def)
if (!def) goto error;
goto error;
} else {
if ((def = virStoragePoolDefParseNode(doc,
nodes[i])) == NULL) {
goto error;
}
}
if (!(obj = virStoragePoolObjAssignDef(&privconn->pools, if (!(obj = virStoragePoolObjAssignDef(&privconn->pools,
def))) { def))) {
...@@ -1066,7 +1048,7 @@ testParseStorage(testConnPtr privconn, const char *file, ...@@ -1066,7 +1048,7 @@ testParseStorage(testConnPtr privconn, const char *file,
obj->active = 1; obj->active = 1;
/* Find storage volumes */ /* Find storage volumes */
if (testOpenVolumesForPool(doc, ctxt, file, obj, i+1) < 0) { if (testOpenVolumesForPool(file, ctxt, obj, i+1) < 0) {
virStoragePoolObjUnlock(obj); virStoragePoolObjUnlock(obj);
goto error; goto error;
} }
...@@ -1081,8 +1063,9 @@ error: ...@@ -1081,8 +1063,9 @@ error:
} }
static int static int
testParseNodedevs(testConnPtr privconn, const char *file, testParseNodedevs(testConnPtr privconn,
xmlDocPtr doc, xmlXPathContextPtr ctxt) const char *file,
xmlXPathContextPtr ctxt)
{ {
int num, ret = -1; int num, ret = -1;
size_t i; size_t i;
...@@ -1096,27 +1079,14 @@ testParseNodedevs(testConnPtr privconn, const char *file, ...@@ -1096,27 +1079,14 @@ testParseNodedevs(testConnPtr privconn, const char *file,
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
virNodeDeviceDefPtr def; virNodeDeviceDefPtr def;
char *relFile = virXMLPropString(nodes[i], "file"); xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
"nodedev");
if (relFile != NULL) { if (!node)
char *absFile = testBuildFilename(file, relFile); goto error;
VIR_FREE(relFile);
if (!absFile) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("resolving device filename"));
goto error;
}
def = virNodeDeviceDefParseFile(absFile, 0, NULL); def = virNodeDeviceDefParseNode(ctxt->doc, node, 0, NULL);
VIR_FREE(absFile); if (!def)
if (!def) goto error;
goto error;
} else {
if ((def = virNodeDeviceDefParseNode(doc,
nodes[i], 0, NULL)) == NULL)
goto error;
}
if (!(obj = virNodeDeviceAssignDef(&privconn->devs, def))) { if (!(obj = virNodeDeviceAssignDef(&privconn->devs, def))) {
virNodeDeviceDefFree(def); virNodeDeviceDefFree(def);
...@@ -1178,15 +1148,15 @@ testOpenFromFile(virConnectPtr conn, const char *file) ...@@ -1178,15 +1148,15 @@ testOpenFromFile(virConnectPtr conn, const char *file)
if (testParseNodeInfo(&privconn->nodeInfo, ctxt) < 0) if (testParseNodeInfo(&privconn->nodeInfo, ctxt) < 0)
goto error; goto error;
if (testParseDomains(privconn, file, doc, ctxt) < 0) if (testParseDomains(privconn, file, ctxt) < 0)
goto error; goto error;
if (testParseNetworks(privconn, file, doc, ctxt) < 0) if (testParseNetworks(privconn, file, ctxt) < 0)
goto error; goto error;
if (testParseInterfaces(privconn, file, doc, ctxt) < 0) if (testParseInterfaces(privconn, file, ctxt) < 0)
goto error; goto error;
if (testParseStorage(privconn, file, doc, ctxt) < 0) if (testParseStorage(privconn, file, ctxt) < 0)
goto error; goto error;
if (testParseNodedevs(privconn, file, doc, ctxt) < 0) if (testParseNodedevs(privconn, file, ctxt) < 0)
goto error; goto error;
xmlXPathFreeContext(ctxt); xmlXPathFreeContext(ctxt);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册