[libvirt] [PATCH 6/6] list: Expose virStoragePoolListAllVolumes to Python binding

Osier Yang jyang at redhat.com
Mon Sep 10 02:42:33 UTC 2012


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




More information about the libvir-list mailing list