From a33e20c734790a67f2918c131796190b5a4c4341 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Tue, 10 Jul 2018 15:01:45 -0400 Subject: [PATCH] test: Implement virConnectListAllInterfaces This adds some generic virinterfaceobj code, roughly matching what is used by other stateful drivers like network, storage, etc. Reviewed-by: John Ferlan Signed-off-by: Cole Robinson --- src/conf/virinterfaceobj.c | 106 +++++++++++++++++++++++++++++++++++++ src/conf/virinterfaceobj.h | 7 +++ src/libvirt_private.syms | 1 + src/test/test_driver.c | 15 ++++++ 4 files changed, 129 insertions(+) diff --git a/src/conf/virinterfaceobj.c b/src/conf/virinterfaceobj.c index a1d7346eb2..b0c4ca15a1 100644 --- a/src/conf/virinterfaceobj.c +++ b/src/conf/virinterfaceobj.c @@ -242,6 +242,112 @@ virInterfaceObjListFindByName(virInterfaceObjListPtr interfaces, } +#define MATCH(FLAG) (flags & (FLAG)) +static bool +virInterfaceObjMatch(virInterfaceObjPtr obj, + unsigned int flags) +{ + /* filter by active state */ + if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) && + !((MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) && + virInterfaceObjIsActive(obj)) || + (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) && + !virInterfaceObjIsActive(obj)))) + return false; + + return true; +} +#undef MATCH + + +struct virInterfaceObjListData { + virConnectPtr conn; + virInterfacePtr *ifaces; + virInterfaceObjListFilter filter; + unsigned int flags; + int nifaces; + bool error; +}; + +static int +virInterfaceObjListPopulate(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + struct virInterfaceObjListData *data = opaque; + virInterfaceObjPtr obj = payload; + virInterfacePtr iface = NULL; + + if (data->error) + return 0; + + virObjectLock(obj); + + if (data->filter && + !data->filter(data->conn, obj->def)) + goto cleanup; + + if (!virInterfaceObjMatch(obj, data->flags)) + goto cleanup; + + if (!data->ifaces) { + data->nifaces++; + goto cleanup; + } + + if (!(iface = virGetInterface(data->conn, obj->def->name, obj->def->mac))) { + data->error = true; + goto cleanup; + } + + data->ifaces[data->nifaces++] = iface; + + cleanup: + virObjectUnlock(obj); + return 0; +} + + +int +virInterfaceObjListExport(virConnectPtr conn, + virInterfaceObjListPtr ifaceobjs, + virInterfacePtr **ifaces, + virInterfaceObjListFilter filter, + unsigned int flags) +{ + int ret = -1; + struct virInterfaceObjListData data = { + .conn = conn, .ifaces = NULL, .filter = filter, .flags = flags, + .nifaces = 0, .error = false }; + + virObjectRWLockRead(ifaceobjs); + if (ifaces && VIR_ALLOC_N(data.ifaces, + virHashSize(ifaceobjs->objsName) + 1) < 0) + goto cleanup; + + virHashForEach(ifaceobjs->objsName, virInterfaceObjListPopulate, &data); + + if (data.error) + goto cleanup; + + if (data.ifaces) { + /* trim the array to the final size */ + ignore_value(VIR_REALLOC_N(data.ifaces, data.nifaces + 1)); + *ifaces = data.ifaces; + data.ifaces = NULL; + } + + ret = data.nifaces; + cleanup: + virObjectRWUnlock(ifaceobjs); + while (data.ifaces && data.nifaces) + virObjectUnref(data.ifaces[--data.nifaces]); + + VIR_FREE(data.ifaces); + return ret; +} + + void virInterfaceObjListDispose(void *obj) { diff --git a/src/conf/virinterfaceobj.h b/src/conf/virinterfaceobj.h index 799d38038f..33d2dda05d 100644 --- a/src/conf/virinterfaceobj.h +++ b/src/conf/virinterfaceobj.h @@ -82,4 +82,11 @@ virInterfaceObjListGetNames(virInterfaceObjListPtr interfaces, char **const names, int maxnames); +int +virInterfaceObjListExport(virConnectPtr conn, + virInterfaceObjListPtr ifaceobjs, + virInterfacePtr **ifaces, + virInterfaceObjListFilter filter, + unsigned int flags); + #endif /* __VIRINTERFACEOBJ_H__ */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ebf3979109..0a20eb661b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -962,6 +962,7 @@ virInterfaceObjGetDef; virInterfaceObjIsActive; virInterfaceObjListAssignDef; virInterfaceObjListClone; +virInterfaceObjListExport; virInterfaceObjListFindByMACString; virInterfaceObjListFindByName; virInterfaceObjListGetNames; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 7006422fd5..f3ed667d68 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3829,6 +3829,20 @@ testConnectListDefinedInterfaces(virConnectPtr conn, } +static int +testConnectListAllInterfaces(virConnectPtr conn, + virInterfacePtr **ifaces, + unsigned int flags) +{ + testDriverPtr privconn = conn->privateData; + + virCheckFlags(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE, -1); + + return virInterfaceObjListExport(conn, privconn->ifaces, ifaces, + NULL, flags); +} + + static virInterfacePtr testInterfaceLookupByName(virConnectPtr conn, const char *name) @@ -6958,6 +6972,7 @@ static virInterfaceDriver testInterfaceDriver = { .connectListInterfaces = testConnectListInterfaces, /* 0.7.0 */ .connectNumOfDefinedInterfaces = testConnectNumOfDefinedInterfaces, /* 0.7.0 */ .connectListDefinedInterfaces = testConnectListDefinedInterfaces, /* 0.7.0 */ + .connectListAllInterfaces = testConnectListAllInterfaces, /* 4.6.0 */ .interfaceLookupByName = testInterfaceLookupByName, /* 0.7.0 */ .interfaceLookupByMACString = testInterfaceLookupByMACString, /* 0.7.0 */ .interfaceGetXMLDesc = testInterfaceGetXMLDesc, /* 0.7.0 */