On 2012年09月07日 21:49, Peter Krempa wrote:
On 09/04/12 17:32, Osier Yang wrote:
> The implementation is done manually as the generator does not support
> wrapping lists of C pointers into Python objects.
>
> python/libvirt-override-api.xml: Document
>
> python/libvirt-override-virStoragePool.py:
> * New file, includes implementation of listAllVolumes.
>
> python/libvirt-override.c: Implementation for the wrapper.
> ---
> python/libvirt-override-api.xml | 8 ++++-
> python/libvirt-override-virStoragePool.py | 11 ++++++
> python/libvirt-override.c | 50 +++++++++++++++++++++++++++++
> 3 files changed, 68 insertions(+), 1 deletions(-)
> create mode 100644 python/libvirt-override-virStoragePool.py
>
> diff --git a/python/libvirt-override-api.xml
> b/python/libvirt-override-api.xml
> index d16755c..8a228fb 100644
> --- a/python/libvirt-override-api.xml
> +++ b/python/libvirt-override-api.xml
> @@ -315,7 +315,13 @@
> <function name='virStoragePoolListVolumes' file='python'>
> <info>list the storage volumes, stores the pointers to the names in
> @names</info>
> <arg name='pool' type='virStoragePoolPtr' info='pointer to the
storage
> pool'/>
> - <return type='str *' info='the list of Names of None in case of
> error'/>
> + <return type='str *' info='the list of Names or None in case of
> error'/>
> + </function>
> + <function name='virStoragePoolListAllVolumes' file='python'>
> + <info>return list of storage volume objects</info>
> + <arg name='pool' type='virStoragePoolPtr' info='pointer to
the
> storage pool'/>
> + <arg name='flags' type='unsigned int' info='optional
flags'/>
> + <return type='volume *' info='the list of volumes or None in case
of
> error'/>
> </function>
> <function name='virStoragePoolGetInfo' file='python'>
> <info>Extract information about a storage pool. Note that if the
> connection used to get the domain is limited only a partial set of the
> information can be extracted.</info>
> diff --git a/python/libvirt-override-virStoragePool.py
> b/python/libvirt-override-virStoragePool.py
> new file mode 100644
> index 0000000..ffe160c
> --- /dev/null
> +++ b/python/libvirt-override-virStoragePool.py
Hm, I'm no python binding expert. Does this file get used automaticaly?
> @@ -0,0 +1,11 @@
> + def listAllVolumes(self, flags):
> + """List all storage volumes and returns a list of storage volume
> objects"""
> + ret = libvirtmod.virStoragePoolListAllVolumes(self._o, flags)
> + if ret is None:
> + raise libvirtError("virStoragePoolListAllVolumes() failed", conn=self)
> +
> + retlist = list()
> + for volptr in ret:
> + retlist.append(virStorageVol(self, _obj=volptr))
> +
> + return retlist
> diff --git a/python/libvirt-override.c b/python/libvirt-override.c
> index 1e3ad89..8b402b0 100644
> --- a/python/libvirt-override.c
> +++ b/python/libvirt-override.c
> @@ -3083,6 +3083,55 @@ libvirt_virStoragePoolListVolumes(PyObject
> *self ATTRIBUTE_UNUSED,
> }
>
> static PyObject *
> +libvirt_virStoragePoolListAllVolumes(PyObject *self ATTRIBUTE_UNUSED,
> + PyObject *args)
> +{
> + PyObject *py_retval = NULL;
> + PyObject *tmp = NULL;
> + virStoragePoolPtr pool;
> + virStorageVolPtr *vols = NULL;
> + int c_retval = 0;
> + int i;
> + unsigned int flags;
> + PyObject *pyobj_pool;
> +
> + if (!PyArg_ParseTuple(args, (char *)"Oi:virStoragePoolListAllVolumes",
> + &pyobj_pool, &flags))
> + return NULL;
> +
> + pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
> +
> + LIBVIRT_BEGIN_ALLOW_THREADS;
> + c_retval = virStoragePoolListAllVolumes(pool, &vols, flags);
> + LIBVIRT_END_ALLOW_THREADS;
> + if (c_retval < 0)
> + return VIR_PY_NONE;
> +
> + if (!(py_retval = PyList_New(c_retval)))
> + goto cleanup;
> +
> + for (i = 0; i < c_retval; i++) {
> + if (!(tmp = libvirt_virStorageVolPtrWrap(vols[i])) ||
> + PyList_SetItem(py_retval, i, tmp) < 0) {
> + Py_XDECREF(tmp);
> + Py_DECREF(py_retval);
> + py_retval = NULL;
> + goto cleanup;
> + }
> + /* python steals the pointer */
> + vols[i] = NULL;
> + }
> +
> +cleanup:
> + for (i = 0; i < c_retval; i++)
> + if (vols[i])
> + virStorageVolFree(vols[i]);
> + VIR_FREE(vols);
> + return py_retval;
> +}
> +
> +
> +static PyObject *
> libvirt_virStoragePoolGetAutostart(PyObject *self ATTRIBUTE_UNUSED,
> PyObject *args) {
> PyObject *py_retval;
> int c_retval, autostart;
> @@ -5927,6 +5976,7 @@ static PyMethodDef libvirtMethods[] = {
> {(char *) "virConnectListAllStoragePools",
> libvirt_virConnectListAllStoragePools, METH_VARARGS, NULL},
> {(char *) "virStoragePoolGetAutostart",
> libvirt_virStoragePoolGetAutostart, METH_VARARGS, NULL},
> {(char *) "virStoragePoolListVolumes",
> libvirt_virStoragePoolListVolumes, METH_VARARGS, NULL},
> + {(char *) "virStoragePoolListAllVolumes",
> libvirt_virStoragePoolListAllVolumes, METH_VARARGS, NULL},
> {(char *) "virStoragePoolGetInfo", libvirt_virStoragePoolGetInfo,
> METH_VARARGS, NULL},
> {(char *) "virStorageVolGetInfo", libvirt_virStorageVolGetInfo,
> METH_VARARGS, NULL},
> {(char *) "virStoragePoolGetUUID", libvirt_virStoragePoolGetUUID,
> METH_VARARGS, NULL},
>
ACK if the new python file is used automaticaly
Yes, it's used automaticaly, pushed the set with nits fixed.
Thanks!
Osier