mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
Add a test interface driver
* test.c: includes an interface driver to the test framework
This commit is contained in:
parent
d6fa6f3e92
commit
3edbc2c4a9
392
src/test.c
392
src/test.c
@ -41,6 +41,7 @@
|
|||||||
#include "capabilities.h"
|
#include "capabilities.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "network_conf.h"
|
#include "network_conf.h"
|
||||||
|
#include "interface_conf.h"
|
||||||
#include "domain_conf.h"
|
#include "domain_conf.h"
|
||||||
#include "domain_event.h"
|
#include "domain_event.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
@ -72,6 +73,7 @@ struct _testConn {
|
|||||||
virNodeInfo nodeInfo;
|
virNodeInfo nodeInfo;
|
||||||
virDomainObjList domains;
|
virDomainObjList domains;
|
||||||
virNetworkObjList networks;
|
virNetworkObjList networks;
|
||||||
|
virInterfaceObjList ifaces;
|
||||||
virStoragePoolObjList pools;
|
virStoragePoolObjList pools;
|
||||||
int numCells;
|
int numCells;
|
||||||
testCell cells[MAX_CELLS];
|
testCell cells[MAX_CELLS];
|
||||||
@ -202,6 +204,17 @@ static const char *defaultNetworkXML =
|
|||||||
" </ip>"
|
" </ip>"
|
||||||
"</network>";
|
"</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 =
|
static const char *defaultPoolXML =
|
||||||
"<pool type='dir'>"
|
"<pool type='dir'>"
|
||||||
" <name>default-pool</name>"
|
" <name>default-pool</name>"
|
||||||
@ -223,6 +236,8 @@ static int testOpenDefault(virConnectPtr conn) {
|
|||||||
virDomainObjPtr domobj = NULL;
|
virDomainObjPtr domobj = NULL;
|
||||||
virNetworkDefPtr netdef = NULL;
|
virNetworkDefPtr netdef = NULL;
|
||||||
virNetworkObjPtr netobj = NULL;
|
virNetworkObjPtr netobj = NULL;
|
||||||
|
virInterfaceDefPtr interfacedef = NULL;
|
||||||
|
virInterfaceObjPtr interfaceobj = NULL;
|
||||||
virStoragePoolDefPtr pooldef = NULL;
|
virStoragePoolDefPtr pooldef = NULL;
|
||||||
virStoragePoolObjPtr poolobj = NULL;
|
virStoragePoolObjPtr poolobj = NULL;
|
||||||
|
|
||||||
@ -286,6 +301,15 @@ static int testOpenDefault(virConnectPtr conn) {
|
|||||||
netobj->persistent = 1;
|
netobj->persistent = 1;
|
||||||
virNetworkObjUnlock(netobj);
|
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)))
|
if (!(pooldef = virStoragePoolDefParseString(conn, defaultPoolXML)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -309,6 +333,7 @@ static int testOpenDefault(virConnectPtr conn) {
|
|||||||
error:
|
error:
|
||||||
virDomainObjListFree(&privconn->domains);
|
virDomainObjListFree(&privconn->domains);
|
||||||
virNetworkObjListFree(&privconn->networks);
|
virNetworkObjListFree(&privconn->networks);
|
||||||
|
virInterfaceObjListFree(&privconn->ifaces);
|
||||||
virStoragePoolObjListFree(&privconn->pools);
|
virStoragePoolObjListFree(&privconn->pools);
|
||||||
virCapabilitiesFree(privconn->caps);
|
virCapabilitiesFree(privconn->caps);
|
||||||
testDriverUnlock(privconn);
|
testDriverUnlock(privconn);
|
||||||
@ -429,10 +454,11 @@ static int testOpenFromFile(virConnectPtr conn,
|
|||||||
char *str;
|
char *str;
|
||||||
xmlDocPtr xml = NULL;
|
xmlDocPtr xml = NULL;
|
||||||
xmlNodePtr root = NULL;
|
xmlNodePtr root = NULL;
|
||||||
xmlNodePtr *domains = NULL, *networks = NULL, *pools = NULL;
|
xmlNodePtr *domains = NULL, *networks = NULL, *ifaces = NULL, *pools = NULL;
|
||||||
xmlXPathContextPtr ctxt = NULL;
|
xmlXPathContextPtr ctxt = NULL;
|
||||||
virNodeInfoPtr nodeInfo;
|
virNodeInfoPtr nodeInfo;
|
||||||
virNetworkObjPtr net;
|
virNetworkObjPtr net;
|
||||||
|
virInterfaceObjPtr iface;
|
||||||
virDomainObjPtr dom;
|
virDomainObjPtr dom;
|
||||||
testConnPtr privconn;
|
testConnPtr privconn;
|
||||||
if (VIR_ALLOC(privconn) < 0) {
|
if (VIR_ALLOC(privconn) < 0) {
|
||||||
@ -629,6 +655,39 @@ static int testOpenFromFile(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
VIR_FREE(networks);
|
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 */
|
/* Parse Storage Pool list */
|
||||||
ret = virXPathNodeSet(conn, "/node/pool", ctxt, &pools);
|
ret = virXPathNodeSet(conn, "/node/pool", ctxt, &pools);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@ -692,11 +751,13 @@ static int testOpenFromFile(virConnectPtr conn,
|
|||||||
xmlFreeDoc(xml);
|
xmlFreeDoc(xml);
|
||||||
VIR_FREE(domains);
|
VIR_FREE(domains);
|
||||||
VIR_FREE(networks);
|
VIR_FREE(networks);
|
||||||
|
VIR_FREE(ifaces);
|
||||||
VIR_FREE(pools);
|
VIR_FREE(pools);
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
close(fd);
|
close(fd);
|
||||||
virDomainObjListFree(&privconn->domains);
|
virDomainObjListFree(&privconn->domains);
|
||||||
virNetworkObjListFree(&privconn->networks);
|
virNetworkObjListFree(&privconn->networks);
|
||||||
|
virInterfaceObjListFree(&privconn->ifaces);
|
||||||
virStoragePoolObjListFree(&privconn->pools);
|
virStoragePoolObjListFree(&privconn->pools);
|
||||||
testDriverUnlock(privconn);
|
testDriverUnlock(privconn);
|
||||||
VIR_FREE(privconn);
|
VIR_FREE(privconn);
|
||||||
@ -765,6 +826,7 @@ static int testClose(virConnectPtr conn)
|
|||||||
virCapabilitiesFree(privconn->caps);
|
virCapabilitiesFree(privconn->caps);
|
||||||
virDomainObjListFree(&privconn->domains);
|
virDomainObjListFree(&privconn->domains);
|
||||||
virNetworkObjListFree(&privconn->networks);
|
virNetworkObjListFree(&privconn->networks);
|
||||||
|
virInterfaceObjListFree(&privconn->ifaces);
|
||||||
virStoragePoolObjListFree(&privconn->pools);
|
virStoragePoolObjListFree(&privconn->pools);
|
||||||
|
|
||||||
virDomainEventCallbackListFree(privconn->domainEventCallbacks);
|
virDomainEventCallbackListFree(privconn->domainEventCallbacks);
|
||||||
@ -2364,6 +2426,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
|
* Storage Driver routines
|
||||||
*/
|
*/
|
||||||
@ -3723,6 +4093,24 @@ static virNetworkDriver testNetworkDriver = {
|
|||||||
testNetworkSetAutostart, /* networkSetAutostart */
|
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 = {
|
static virStorageDriver testStorageDriver = {
|
||||||
.name = "Test",
|
.name = "Test",
|
||||||
.open = testStorageOpen,
|
.open = testStorageOpen,
|
||||||
@ -3782,6 +4170,8 @@ testRegister(void)
|
|||||||
return -1;
|
return -1;
|
||||||
if (virRegisterNetworkDriver(&testNetworkDriver) < 0)
|
if (virRegisterNetworkDriver(&testNetworkDriver) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
if (virRegisterInterfaceDriver(&testInterfaceDriver) < 0)
|
||||||
|
return -1;
|
||||||
if (virRegisterStorageDriver(&testStorageDriver) < 0)
|
if (virRegisterStorageDriver(&testStorageDriver) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (virRegisterDeviceMonitor(&testDevMonitor) < 0)
|
if (virRegisterDeviceMonitor(&testDevMonitor) < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user