mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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.
This commit is contained in:
parent
23d5e6f57a
commit
49ecff3eab
@ -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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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 (!node)
|
||||||
|
goto error;
|
||||||
|
|
||||||
if (relFile != NULL) {
|
def = virNodeDeviceDefParseNode(ctxt->doc, node, 0, NULL);
|
||||||
char *absFile = testBuildFilename(file, relFile);
|
if (!def)
|
||||||
VIR_FREE(relFile);
|
goto error;
|
||||||
|
|
||||||
if (!absFile) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("resolving device filename"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
def = virNodeDeviceDefParseFile(absFile, 0, NULL);
|
|
||||||
VIR_FREE(absFile);
|
|
||||||
if (!def)
|
|
||||||
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)
|
|||||||
|
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user