mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
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:
parent
359b938b8b
commit
a33e20c734
@ -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
|
void
|
||||||
virInterfaceObjListDispose(void *obj)
|
virInterfaceObjListDispose(void *obj)
|
||||||
{
|
{
|
||||||
|
@ -82,4 +82,11 @@ virInterfaceObjListGetNames(virInterfaceObjListPtr interfaces,
|
|||||||
char **const names,
|
char **const names,
|
||||||
int maxnames);
|
int maxnames);
|
||||||
|
|
||||||
|
int
|
||||||
|
virInterfaceObjListExport(virConnectPtr conn,
|
||||||
|
virInterfaceObjListPtr ifaceobjs,
|
||||||
|
virInterfacePtr **ifaces,
|
||||||
|
virInterfaceObjListFilter filter,
|
||||||
|
unsigned int flags);
|
||||||
|
|
||||||
#endif /* __VIRINTERFACEOBJ_H__ */
|
#endif /* __VIRINTERFACEOBJ_H__ */
|
||||||
|
@ -962,6 +962,7 @@ virInterfaceObjGetDef;
|
|||||||
virInterfaceObjIsActive;
|
virInterfaceObjIsActive;
|
||||||
virInterfaceObjListAssignDef;
|
virInterfaceObjListAssignDef;
|
||||||
virInterfaceObjListClone;
|
virInterfaceObjListClone;
|
||||||
|
virInterfaceObjListExport;
|
||||||
virInterfaceObjListFindByMACString;
|
virInterfaceObjListFindByMACString;
|
||||||
virInterfaceObjListFindByName;
|
virInterfaceObjListFindByName;
|
||||||
virInterfaceObjListGetNames;
|
virInterfaceObjListGetNames;
|
||||||
|
@ -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
|
static virInterfacePtr
|
||||||
testInterfaceLookupByName(virConnectPtr conn,
|
testInterfaceLookupByName(virConnectPtr conn,
|
||||||
const char *name)
|
const char *name)
|
||||||
@ -6958,6 +6972,7 @@ static virInterfaceDriver testInterfaceDriver = {
|
|||||||
.connectListInterfaces = testConnectListInterfaces, /* 0.7.0 */
|
.connectListInterfaces = testConnectListInterfaces, /* 0.7.0 */
|
||||||
.connectNumOfDefinedInterfaces = testConnectNumOfDefinedInterfaces, /* 0.7.0 */
|
.connectNumOfDefinedInterfaces = testConnectNumOfDefinedInterfaces, /* 0.7.0 */
|
||||||
.connectListDefinedInterfaces = testConnectListDefinedInterfaces, /* 0.7.0 */
|
.connectListDefinedInterfaces = testConnectListDefinedInterfaces, /* 0.7.0 */
|
||||||
|
.connectListAllInterfaces = testConnectListAllInterfaces, /* 4.6.0 */
|
||||||
.interfaceLookupByName = testInterfaceLookupByName, /* 0.7.0 */
|
.interfaceLookupByName = testInterfaceLookupByName, /* 0.7.0 */
|
||||||
.interfaceLookupByMACString = testInterfaceLookupByMACString, /* 0.7.0 */
|
.interfaceLookupByMACString = testInterfaceLookupByMACString, /* 0.7.0 */
|
||||||
.interfaceGetXMLDesc = testInterfaceGetXMLDesc, /* 0.7.0 */
|
.interfaceGetXMLDesc = testInterfaceGetXMLDesc, /* 0.7.0 */
|
||||||
|
Loading…
Reference in New Issue
Block a user