--- src/test.c | 392 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 391 insertions(+), 1 deletions(-) diff --git a/src/test.c b/src/test.c index 6f07462..098d235 100644 --- a/src/test.c +++ b/src/test.c @@ -41,6 +41,7 @@ #include "capabilities.h" #include "memory.h" #include "network_conf.h" +#include "interface_conf.h" #include "domain_conf.h" #include "domain_event.h" #include "event.h" @@ -72,6 +73,7 @@ struct _testConn { virNodeInfo nodeInfo; virDomainObjList domains; virNetworkObjList networks; + virInterfaceObjList ifaces; virStoragePoolObjList pools; int numCells; testCell cells[MAX_CELLS]; @@ -202,6 +204,17 @@ static const char *defaultNetworkXML = " </ip>" "</network>"; +static const char *defaultInterfaceXML = +"<interface type=\"ethernet\" name=\"eth1\">" +" <start mode=\"onboot\"/>" +" <mac address=\"aa:bb:cc:dd:ee:ff\"/>" +" <mtu size=\"1492\"/>" +" <protocol family=\"ipv4\">" +" <ip address=\"192.168.0.5\" prefix=\"24\"/>" +" <route gateway=\"192.168.0.1\"/>" +" </protocol>" +"</interface>"; + static const char *defaultPoolXML = "<pool type='dir'>" " <name>default-pool</name>" @@ -223,6 +236,8 @@ static int testOpenDefault(virConnectPtr conn) { virDomainObjPtr domobj = NULL; virNetworkDefPtr netdef = NULL; virNetworkObjPtr netobj = NULL; + virInterfaceDefPtr interfacedef = NULL; + virInterfaceObjPtr interfaceobj = NULL; virStoragePoolDefPtr pooldef = NULL; virStoragePoolObjPtr poolobj = NULL; @@ -286,6 +301,15 @@ static int testOpenDefault(virConnectPtr conn) { netobj->persistent = 1; virNetworkObjUnlock(netobj); + if (!(interfacedef = virInterfaceDefParseString(conn, defaultInterfaceXML))) + goto error; + if (!(interfaceobj = virInterfaceAssignDef(conn, &privconn->ifaces, interfacedef))) { + virInterfaceDefFree(interfacedef); + goto error; + } + interfaceobj->active = 1; + virInterfaceObjUnlock(interfaceobj); + if (!(pooldef = virStoragePoolDefParseString(conn, defaultPoolXML))) goto error; @@ -309,6 +333,7 @@ static int testOpenDefault(virConnectPtr conn) { error: virDomainObjListFree(&privconn->domains); virNetworkObjListFree(&privconn->networks); + virInterfaceObjListFree(&privconn->ifaces); virStoragePoolObjListFree(&privconn->pools); virCapabilitiesFree(privconn->caps); testDriverUnlock(privconn); @@ -429,10 +454,11 @@ static int testOpenFromFile(virConnectPtr conn, char *str; xmlDocPtr xml = NULL; xmlNodePtr root = NULL; - xmlNodePtr *domains = NULL, *networks = NULL, *pools = NULL; + xmlNodePtr *domains = NULL, *networks = NULL, *ifaces = NULL, *pools = NULL; xmlXPathContextPtr ctxt = NULL; virNodeInfoPtr nodeInfo; virNetworkObjPtr net; + virInterfaceObjPtr iface; virDomainObjPtr dom; testConnPtr privconn; if (VIR_ALLOC(privconn) < 0) { @@ -629,6 +655,39 @@ static int testOpenFromFile(virConnectPtr conn, } VIR_FREE(networks); + /* Parse interface definitions */ + ret = virXPathNodeSet(conn, "/node/interface", ctxt, &ifaces); + if (ret < 0) { + testError(NULL, VIR_ERR_XML_ERROR, "%s", _("node interface list")); + goto error; + } + for (i = 0 ; i < ret ; i++) { + virInterfaceDefPtr def; + char *relFile = virXMLPropString(ifaces[i], "file"); + if (relFile != NULL) { + char *absFile = testBuildFilename(file, relFile); + VIR_FREE(relFile); + if (!absFile) { + testError(NULL, VIR_ERR_INTERNAL_ERROR, "%s", _("resolving interface filename")); + goto error; + } + + def = virInterfaceDefParseFile(conn, absFile); + VIR_FREE(absFile); + if (!def) + goto error; + } else { + if ((def = virInterfaceDefParseNode(conn, xml, ifaces[i])) == NULL) + goto error; + } + if (!(iface = virInterfaceAssignDef(conn, &privconn->ifaces, def))) { + virInterfaceDefFree(def); + goto error; + } + virInterfaceObjUnlock(iface); + } + VIR_FREE(ifaces); + /* Parse Storage Pool list */ ret = virXPathNodeSet(conn, "/node/pool", ctxt, &pools); if (ret < 0) { @@ -692,11 +751,13 @@ static int testOpenFromFile(virConnectPtr conn, xmlFreeDoc(xml); VIR_FREE(domains); VIR_FREE(networks); + VIR_FREE(ifaces); VIR_FREE(pools); if (fd != -1) close(fd); virDomainObjListFree(&privconn->domains); virNetworkObjListFree(&privconn->networks); + virInterfaceObjListFree(&privconn->ifaces); virStoragePoolObjListFree(&privconn->pools); testDriverUnlock(privconn); VIR_FREE(privconn); @@ -765,6 +826,7 @@ static int testClose(virConnectPtr conn) virCapabilitiesFree(privconn->caps); virDomainObjListFree(&privconn->domains); virNetworkObjListFree(&privconn->networks); + virInterfaceObjListFree(&privconn->ifaces); virStoragePoolObjListFree(&privconn->pools); virDomainEventCallbackListFree(privconn->domainEventCallbacks); @@ -2365,6 +2427,314 @@ cleanup: /* + * Physical host interface routines + */ + +static virDrvOpenStatus testOpenInterface(virConnectPtr conn, + virConnectAuthPtr auth ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED) +{ + if (STRNEQ(conn->driver->name, "Test")) + return VIR_DRV_OPEN_DECLINED; + + conn->interfacePrivateData = conn->privateData; + return VIR_DRV_OPEN_SUCCESS; +} + +static int testCloseInterface(virConnectPtr conn) +{ + conn->interfacePrivateData = NULL; + return 0; +} + + +static int testNumOfInterfaces(virConnectPtr conn) +{ + testConnPtr privconn = conn->privateData; + int i, count = 0; + + testDriverLock(privconn); + for (i = 0 ; (i < privconn->ifaces.count); i++) { + virInterfaceObjLock(privconn->ifaces.objs[i]); + if (virInterfaceIsActive(privconn->ifaces.objs[i])) { + count++; + } + virInterfaceObjUnlock(privconn->ifaces.objs[i]); + } + testDriverUnlock(privconn); + return count; +} + +static int testListInterfaces(virConnectPtr conn, char **const names, int nnames) +{ + testConnPtr privconn = conn->privateData; + int n = 0, i; + + testDriverLock(privconn); + memset(names, 0, sizeof(*names)*nnames); + for (i = 0 ; (i < privconn->ifaces.count) && (n < nnames); i++) { + virInterfaceObjLock(privconn->ifaces.objs[i]); + if (virInterfaceIsActive(privconn->ifaces.objs[i])) { + if (!(names[n++] = strdup(privconn->ifaces.objs[i]->def->name))) { + virInterfaceObjUnlock(privconn->ifaces.objs[i]); + goto no_memory; + } + } + virInterfaceObjUnlock(privconn->ifaces.objs[i]); + } + testDriverUnlock(privconn); + + return n; + +no_memory: + virReportOOMError(conn); + for (n = 0 ; n < nnames ; n++) + VIR_FREE(names[n]); + testDriverUnlock(privconn); + return -1; +} + +static int testNumOfDefinedInterfaces(virConnectPtr conn) +{ + testConnPtr privconn = conn->privateData; + int i, count = 0; + + testDriverLock(privconn); + for (i = 0 ; i < privconn->ifaces.count; i++) { + virInterfaceObjLock(privconn->ifaces.objs[i]); + if (!virInterfaceIsActive(privconn->ifaces.objs[i])) { + count++; + } + virInterfaceObjUnlock(privconn->ifaces.objs[i]); + } + testDriverUnlock(privconn); + return count; +} + +static int testListDefinedInterfaces(virConnectPtr conn, char **const names, int nnames) +{ + testConnPtr privconn = conn->privateData; + int n = 0, i; + + testDriverLock(privconn); + memset(names, 0, sizeof(*names)*nnames); + for (i = 0 ; (i < privconn->ifaces.count) && (n < nnames); i++) { + virInterfaceObjLock(privconn->ifaces.objs[i]); + if (!virInterfaceIsActive(privconn->ifaces.objs[i])) { + if (!(names[n++] = strdup(privconn->ifaces.objs[i]->def->name))) { + virInterfaceObjUnlock(privconn->ifaces.objs[i]); + goto no_memory; + } + } + virInterfaceObjUnlock(privconn->ifaces.objs[i]); + } + testDriverUnlock(privconn); + + return n; + +no_memory: + virReportOOMError(conn); + for (n = 0 ; n < nnames ; n++) + VIR_FREE(names[n]); + testDriverUnlock(privconn); + return -1; +} + +static virInterfacePtr testLookupInterfaceByName(virConnectPtr conn, + const char *name) +{ + testConnPtr privconn = conn->privateData; + virInterfaceObjPtr iface; + virInterfacePtr ret = NULL; + + testDriverLock(privconn); + iface = virInterfaceFindByName(&privconn->ifaces, name); + testDriverUnlock(privconn); + + if (iface == NULL) { + testError (conn, VIR_ERR_NO_INTERFACE, NULL); + goto cleanup; + } + + ret = virGetInterface(conn, iface->def->name, iface->def->mac); + +cleanup: + if (iface) + virInterfaceObjUnlock(iface); + return ret; +} + +static virInterfacePtr testLookupInterfaceByMACString(virConnectPtr conn, + const char *mac) +{ + testConnPtr privconn = conn->privateData; + virInterfaceObjPtr iface; + int ifacect; + virInterfacePtr ret = NULL; + + testDriverLock(privconn); + ifacect = virInterfaceFindByMACString(&privconn->ifaces, mac, &iface, 1); + testDriverUnlock(privconn); + + if (ifacect == 0) { + testError (conn, VIR_ERR_NO_INTERFACE, NULL); + goto cleanup; + } + + if (ifacect > 1) { + testError (conn, VIR_ERR_MULTIPLE_INTERFACES, NULL); + goto cleanup; + } + + ret = virGetInterface(conn, iface->def->name, iface->def->mac); + +cleanup: + if (iface) + virInterfaceObjUnlock(iface); + return ret; +} + +static char *testInterfaceGetXMLDesc(virInterfacePtr iface, + unsigned int flags ATTRIBUTE_UNUSED) +{ + testConnPtr privconn = iface->conn->privateData; + virInterfaceObjPtr privinterface; + char *ret = NULL; + + testDriverLock(privconn); + privinterface = virInterfaceFindByName(&privconn->ifaces, + iface->name); + testDriverUnlock(privconn); + + if (privinterface == NULL) { + testError(iface->conn, VIR_ERR_NO_INTERFACE, __FUNCTION__); + goto cleanup; + } + + ret = virInterfaceDefFormat(iface->conn, privinterface->def); + +cleanup: + if (privinterface) + virInterfaceObjUnlock(privinterface); + return ret; +} + + +static virInterfacePtr testInterfaceDefineXML(virConnectPtr conn, const char *xmlStr, + unsigned int flags ATTRIBUTE_UNUSED) +{ + testConnPtr privconn = conn->privateData; + virInterfaceDefPtr def; + virInterfaceObjPtr iface = NULL; + virInterfacePtr ret = NULL; + + testDriverLock(privconn); + if ((def = virInterfaceDefParseString(conn, xmlStr)) == NULL) + goto cleanup; + + if ((iface = virInterfaceAssignDef(conn, &privconn->ifaces, def)) == NULL) + goto cleanup; + def = NULL; + + ret = virGetInterface(conn, iface->def->name, iface->def->mac); + +cleanup: + virInterfaceDefFree(def); + if (iface) + virInterfaceObjUnlock(iface); + testDriverUnlock(privconn); + return ret; +} + +static int testInterfaceUndefine(virInterfacePtr iface) +{ + testConnPtr privconn = iface->conn->privateData; + virInterfaceObjPtr privinterface; + int ret = -1; + + testDriverLock(privconn); + privinterface = virInterfaceFindByName(&privconn->ifaces, + iface->name); + + if (privinterface == NULL) { + testError (iface->conn, VIR_ERR_NO_INTERFACE, NULL); + goto cleanup; + } + + virInterfaceRemove(&privconn->ifaces, + privinterface); + ret = 0; + +cleanup: + testDriverUnlock(privconn); + return ret; +} + +static int testInterfaceCreate(virInterfacePtr iface, + unsigned int flags ATTRIBUTE_UNUSED) +{ + testConnPtr privconn = iface->conn->privateData; + virInterfaceObjPtr privinterface; + int ret = -1; + + testDriverLock(privconn); + privinterface = virInterfaceFindByName(&privconn->ifaces, + iface->name); + + if (privinterface == NULL) { + testError (iface->conn, VIR_ERR_NO_INTERFACE, NULL); + goto cleanup; + } + + if (privinterface->active != 0) { + testError (iface->conn, VIR_ERR_OPERATION_INVALID, NULL); + goto cleanup; + } + + privinterface->active = 1; + ret = 0; + +cleanup: + if (privinterface) + virInterfaceObjUnlock(privinterface); + testDriverUnlock(privconn); + return ret; +} + +static int testInterfaceDestroy(virInterfacePtr iface, + unsigned int flags ATTRIBUTE_UNUSED) +{ + testConnPtr privconn = iface->conn->privateData; + virInterfaceObjPtr privinterface; + int ret = -1; + + testDriverLock(privconn); + privinterface = virInterfaceFindByName(&privconn->ifaces, + iface->name); + + if (privinterface == NULL) { + testError (iface->conn, VIR_ERR_NO_INTERFACE, NULL); + goto cleanup; + } + + if (privinterface->active == 0) { + testError (iface->conn, VIR_ERR_OPERATION_INVALID, NULL); + goto cleanup; + } + + privinterface->active = 0; + ret = 0; + +cleanup: + if (privinterface) + virInterfaceObjUnlock(privinterface); + testDriverUnlock(privconn); + return ret; +} + + + +/* * Storage Driver routines */ @@ -3723,6 +4093,24 @@ static virNetworkDriver testNetworkDriver = { testNetworkSetAutostart, /* networkSetAutostart */ }; +static virInterfaceDriver testInterfaceDriver = { + "Test", /* name */ + testOpenInterface, /* open */ + testCloseInterface, /* close */ + testNumOfInterfaces, /* numOfInterfaces */ + testListInterfaces, /* listInterfaces */ + testNumOfDefinedInterfaces, /* numOfDefinedInterfaces */ + testListDefinedInterfaces, /* listDefinedInterfaces */ + testLookupInterfaceByName, /* interfaceLookupByName */ + testLookupInterfaceByMACString, /* interfaceLookupByMACString */ + testInterfaceGetXMLDesc, /* interfaceGetXMLDesc */ + testInterfaceDefineXML, /* interfaceDefineXML */ + testInterfaceUndefine, /* interfaceUndefine */ + testInterfaceCreate, /* interfaceCreate */ + testInterfaceDestroy, /* interfaceDestroy */ +}; + + static virStorageDriver testStorageDriver = { .name = "Test", .open = testStorageOpen, @@ -3782,6 +4170,8 @@ testRegister(void) return -1; if (virRegisterNetworkDriver(&testNetworkDriver) < 0) return -1; + if (virRegisterInterfaceDriver(&testInterfaceDriver) < 0) + return -1; if (virRegisterStorageDriver(&testStorageDriver) < 0) return -1; if (virRegisterDeviceMonitor(&testDevMonitor) < 0) -- 1.6.0.6 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list