Re: [libvirt] Re: [PATCH 6/6] host (node) device enumeration - python bindings
Ok, here are proper python bindings to the node device enumeration functions and objects. diff --git a/python/generator.py b/python/generator.py index c706b19..0186e6e 100755 --- a/python/generator.py +++ b/python/generator.py @@ -258,6 +258,11 @@ py_types = { 'const virConnectPtr': ('O', virConnect, virConnectPtr, virConnectPtr), 'virConnect *': ('O', virConnect, virConnectPtr, virConnectPtr), 'const virConnect *': ('O', virConnect, virConnectPtr, virConnectPtr), + +'virNodeDevicePtr': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), +'const virNodeDevicePtr': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), +'virNodeDevice *': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), +'const virNodeDevice *': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), } py_return_types = { @@ -315,6 +320,9 @@ skip_impl = ( 'virStoragePoolListVolumes', 'virDomainBlockPeek', 'virDomainMemoryPeek', +'virNodeListDevicesByCap', +'virNodeListDevices', +'virNodeDeviceListCaps', ) @@ -596,6 +604,8 @@ classes_type = { virStoragePool *: (._o, virStoragePool(self, _obj=%s), virStoragePool), virStorageVolPtr: (._o, virStorageVol(self, _obj=%s), virStorageVol), virStorageVol *: (._o, virStorageVol(self, _obj=%s), virStorageVol), +virNodeDevicePtr: (._o, virNodeDevice(self, _obj=%s), virNodeDevice), +virNodeDevice *: (._o, virNodeDevice(self, _obj=%s), virNodeDevice), virConnectPtr: (._o, virConnect(_obj=%s), virConnect), virConnect *: (._o, virConnect(_obj=%s), virConnect), } @@ -603,7 +613,8 @@ classes_type = { converter_type = { } -primary_classes = [virDomain, virNetwork, virStoragePool, virStorageVol, virConnect] +primary_classes = [virDomain, virNetwork, virStoragePool, virStorageVol, + virConnect, virNodeDevice ] classes_ancestor = { } @@ -613,6 +624,7 @@ classes_destructors = { virStoragePool: virStoragePoolFree, virStorageVol: virStorageVolFree, virConnect: virConnectClose, +virNodeDevice : virNodeDeviceFree } functions_noexcept = { @@ -622,6 +634,8 @@ functions_noexcept = { 'virStoragePoolGetName': True, 'virStorageVolGetName': True, 'virStorageVolGetkey': True, +'virNodeDeviceGetName': True, +'virNodeDeviceGetParent': True, } reference_keepers = { @@ -702,6 +716,13 @@ def nameFixup(name, classe, type, file): elif name[0:13] == virStorageVol: func = name[13:] func = string.lower(func[0:1]) + func[1:] +elif name[0:13] == virNodeDevice: +if name[13:16] == Get: +func = string.lower(name[16]) + name[17:] +elif name[13:19] == Lookup or name[13:] == Create: +func = string.lower(name[3]) + name[4:] +else: +func = string.lower(name[13]) + name[14:] elif name[0:7] == virNode: func = name[7:] func = string.lower(func[0:1]) + func[1:] @@ -954,7 +975,7 @@ def buildWrappers(): else: txt.write(Class %s()\n % (classname)) classes.write(class %s:\n % (classname)) -if classname in [ virDomain, virNetwork, virStoragePool, virStorageVol ]: +if classname in [ virDomain, virNetwork, virStoragePool, virStorageVol, virNodeDevice ]: classes.write(def __init__(self, conn, _obj=None):\n) else: classes.write(def __init__(self, _obj=None):\n) @@ -962,7 +983,7 @@ def buildWrappers(): list = reference_keepers[classname] for ref in list: classes.write(self.%s = None\n % ref[1]) -if classname in [ virDomain, virNetwork ]: +if classname in [ virDomain, virNetwork, virNodeDevice ]: classes.write(self._conn = conn\n) elif classname in [ virStorageVol, virStoragePool ]: classes.write(self._conn = conn\n + \ diff --git a/python/libvir.c b/python/libvir.c index 9cc0c81..7b2792e 100644 --- a/python/libvir.c +++ b/python/libvir.c @@ -1466,7 +1466,130 @@ libvirt_virStoragePoolLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *ar return(py_retval); } +static PyObject * +libvirt_virNodeListDevices(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { +PyObject *py_retval; +char **names = NULL; +int c_retval, i; +virConnectPtr conn; +PyObject *pyobj_conn; +unsigned int flags; + + +if (!PyArg_ParseTuple(args, (char *)Oi:virNodeListDevices, pyobj_conn, flags)) +return(NULL); +conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + +c_retval = virNodeNumOfDevices(conn, flags); +if (c_retval 0) +return VIR_PY_NONE; + +if (c_retval) { +names = malloc(sizeof(*names) * c_retval); +if (!names) +return VIR_PY_NONE; +c_retval = virNodeListDevices(conn, names, c_retval, flags);
[libvirt] Re: [PATCH 6/6] host (node) device enumeration - python bindings
This patch implements the python bindings, rather lamely. I'll submit a new version with a proper NodeDevice object soon ... diff --git a/python/generator.py b/python/generator.py index c706b19..a8fd969 100755 --- a/python/generator.py +++ b/python/generator.py @@ -258,6 +258,11 @@ py_types = { 'const virConnectPtr': ('O', virConnect, virConnectPtr, virConnectPtr), 'virConnect *': ('O', virConnect, virConnectPtr, virConnectPtr), 'const virConnect *': ('O', virConnect, virConnectPtr, virConnectPtr), + +'virNodeDevicePtr': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), +'const virNodeDevicePtr': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), +'virNodeDevice *': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), +'const virNodeDevice *': ('O', virNodeDevice, virNodeDevicePtr, virNodeDevicePtr), } py_return_types = { @@ -315,6 +320,8 @@ skip_impl = ( 'virStoragePoolListVolumes', 'virDomainBlockPeek', 'virDomainMemoryPeek', +'virNodeListDevicesByCap', +'virNodeListDevices', ) @@ -332,6 +339,10 @@ skip_function = ( 'virCopyLastError', # Python API is called virGetLastError instead 'virConnectOpenAuth', # Python C code is manually written 'virDefaultErrorFunc', # Python virErrorFuncHandler impl calls this from C +'virNodeDeviceGetName', +'virNodeDeviceGetParent', +'virNodeDeviceNumOfCaps', +'virNodeDeviceListCaps', ) @@ -613,6 +624,7 @@ classes_destructors = { virStoragePool: virStoragePoolFree, virStorageVol: virStorageVolFree, virConnect: virConnectClose, +virNodeDevice : virNodeDeviceFree } functions_noexcept = { diff --git a/python/libvir.c b/python/libvir.c index 9cc0c81..e03101d 100644 --- a/python/libvir.c +++ b/python/libvir.c @@ -1466,7 +1466,90 @@ libvirt_virStoragePoolLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *ar return(py_retval); } +static PyObject * +libvirt_virNodeListDevices(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { +PyObject *py_retval; +char **names = NULL; +int c_retval, i; +virConnectPtr conn; +PyObject *pyobj_conn; +unsigned int flags; + + +if (!PyArg_ParseTuple(args, (char *)Oi:virNodeListDevices, pyobj_conn, flags)) +return(NULL); +conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + +c_retval = virNodeNumOfDevices(conn, flags); +if (c_retval 0) +return VIR_PY_NONE; + +if (c_retval) { +names = malloc(sizeof(*names) * c_retval); +if (!names) +return VIR_PY_NONE; +c_retval = virNodeListDevices(conn, names, c_retval, flags); +if (c_retval 0) { +free(names); +return VIR_PY_NONE; +} +} +py_retval = PyList_New(c_retval); + +if (names) { +for (i = 0;i c_retval;i++) { +PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i])); +free(names[i]); +} +free(names); +} + +return(py_retval); +} +static PyObject * +libvirt_virNodeListDevicesByCap(PyObject *self ATTRIBUTE_UNUSED, +PyObject *args) { +PyObject *py_retval; +char **names = NULL; +int c_retval, i; +virConnectPtr conn; +PyObject *pyobj_conn; +char *cap; +unsigned int flags; + +if (!PyArg_ParseTuple(args, (char *)Ozi:virNodeListDevicesByCap, + pyobj_conn, cap, flags)) +return(NULL); +conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + +c_retval = virNodeNumOfDevicesByCap(conn, cap, flags); +if (c_retval 0) +return VIR_PY_NONE; + +if (c_retval) { +names = malloc(sizeof(*names) * c_retval); +if (!names) +return VIR_PY_NONE; +c_retval = virNodeListDevicesByCap(conn, cap, names, c_retval, flags); +if (c_retval 0) { +free(names); +return VIR_PY_NONE; +} +} +py_retval = PyList_New(c_retval); + +if (names) { +for (i = 0;i c_retval;i++) { +PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i])); +free(names[i]); +} +free(names); +} + +return(py_retval); +} / * * @@ -1511,6 +1594,8 @@ static PyMethodDef libvirtMethods[] = { {(char *) virStoragePoolGetUUID, libvirt_virStoragePoolGetUUID, METH_VARARGS, NULL}, {(char *) virStoragePoolGetUUIDString, libvirt_virStoragePoolGetUUIDString, METH_VARARGS, NULL}, {(char *) virStoragePoolLookupByUUID, libvirt_virStoragePoolLookupByUUID, METH_VARARGS, NULL}, +{(char *) virNodeListDevices, libvirt_virNodeListDevices, METH_VARARGS, NULL}, +{(char *) virNodeListDevicesByCap, libvirt_virNodeListDevicesByCap, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; diff --git a/python/libvirt-python-api.xml