Re: [libvirt] Re: [PATCH 6/6] host (node) device enumeration - python bindings

2008-10-22 Thread David Lively
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

2008-10-21 Thread David Lively
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