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 <jferlan@redhat.com>
Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2018-07-10 15:01:45 -04:00
parent 359b938b8b
commit a33e20c734
4 changed files with 129 additions and 0 deletions

View File

@ -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)
{

View File

@ -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__ */

View File

@ -962,6 +962,7 @@ virInterfaceObjGetDef;
virInterfaceObjIsActive;
virInterfaceObjListAssignDef;
virInterfaceObjListClone;
virInterfaceObjListExport;
virInterfaceObjListFindByMACString;
virInterfaceObjListFindByName;
virInterfaceObjListGetNames;

View File

@ -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 */