
On 11/20/2014 01:22 PM, Pavel Hrdina wrote:
On 11/18/2014 12:29 AM, Tomoki Sekiyama wrote:
Implement the function which returns a list of tuples, that contains members of virDomainFSInfo struct.
Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com> --- generator.py | 5 +++ libvirt-override-api.xml | 6 ++++ libvirt-override.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ sanitytest.py | 5 +++ 4 files changed, 85 insertions(+), 1 deletion(-)
diff --git a/generator.py b/generator.py index c66c6d4..39ba2f7 100755 --- a/generator.py +++ b/generator.py @@ -476,6 +476,7 @@ skip_impl = ( 'virNetworkGetDHCPLeases', 'virDomainBlockCopy', 'virNodeAllocPages', + 'virDomainGetFSInfo', )
lxc_skip_impl = ( @@ -586,6 +587,7 @@ skip_function = (
'virNetworkDHCPLeaseFree', # only useful in C, python code uses list 'virDomainStatsRecordListFree', # only useful in C, python uses dict + 'virDomainFSInfoFree', # only useful in C, python code uses list )
lxc_skip_function = ( @@ -1107,6 +1109,9 @@ def nameFixup(name, classe, type, file): elif name[0:20] == "virDomainGetCPUStats": func = name[9:] func = func[0:1].lower() + func[1:] + elif name[0:20] == "virDomainGetFSInfo":
There definitely must be name[0:18] as John pointed out.
+ func = name[12:] + func = func[0:2].lower() + func[2:] elif name[0:12] == "virDomainGet": func = name[12:] func = func[0:1].lower() + func[1:] diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index 4fe3c4d..2e807ba 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -658,5 +658,11 @@ <arg name='flags' type='unsigned int' info='an OR'ed set of virNodeAllocPagesFlags'/> <return type='int' info='the number of nodes successfully adjusted or -1 in case of an error'/> </function> + <function name="virDomainGetFSInfo" file='python'> + <info>Get a list of mapping informaiton for each mounted file systems within the specified guest and the disks.</info> + <arg name='domain' type='virDomainPtr' info='pointer to domain object'/> + <arg name='flags' type='unsigned int' info='unused, pass 0'/> + <return type='char *' info="list of mounted filesystems information"/> + </function> </symbols> </api> diff --git a/libvirt-override.c b/libvirt-override.c index 8895289..bd6321f 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -8266,6 +8266,73 @@ libvirt_virNodeAllocPages(PyObject *self ATTRIBUTE_UNUSED, } #endif /* LIBVIR_CHECK_VERSION(1, 2, 8) */
+#if LIBVIR_CHECK_VERSION(1, 2, 11) + +static PyObject * +libvirt_virDomainGetFSInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { + virDomainPtr domain; + PyObject *pyobj_domain; + unsigned int flags; + virDomainFSInfoPtr *fsinfo = NULL; + char **dev; + int c_retval, i; + PyObject *py_retval; + + if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainFSInfo", + &pyobj_domain, &flags)) + return NULL; + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainGetFSInfo(domain, &fsinfo, flags); + LIBVIRT_END_ALLOW_THREADS; + + if (c_retval < 0) + goto cleanup; + + /* convert to a Python list */ + if ((py_retval = PyList_New(c_retval)) == NULL) + goto cleanup;
The PyList_New on success return new reference ... [1]
+ + for (i = 0; i < c_retval; i++) { + virDomainFSInfoPtr fs = fsinfo[i]; + PyObject *info, *alias; + + if (fs == NULL) + goto cleanup; + info = PyTuple_New(4); + if (info == NULL)
Wrong indentation, use spaces instead of tabs.
+ goto cleanup; + PyList_SetItem(py_retval, i, info); + alias = PyList_New(0); + if (alias == NULL)
The same wrong indentation.
+ goto cleanup; + + PyTuple_SetItem(info, 0, libvirt_constcharPtrWrap(fs->mountpoint)); + PyTuple_SetItem(info, 1, libvirt_constcharPtrWrap(fs->name)); + PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(fs->type)); + PyTuple_SetItem(info, 3, alias); + + for (dev = fs->devAlias; dev && *dev; dev++) + if (PyList_Append(alias, libvirt_constcharPtrWrap(*dev)) < 0) + goto cleanup; + } + + for (i = 0; i < c_retval; i++) + virDomainFSInfoFree(fsinfo[i]); + VIR_FREE(fsinfo); + return py_retval; + + cleanup: + for (i = 0; i < c_retval; i++) + virDomainFSInfoFree(fsinfo[i]); + VIR_FREE(fsinfo); + Py_DECREF(py_retval);
[1] ... there you correctly dereference it, but you should use PY_XDECREF because the py_retval could be NULL.
+ return VIR_PY_NONE; +} + +#endif /* LIBVIR_CHECK_VERSION(1, 2, 11) */ +
/************************************************************************ * * * The registration stuff * @@ -8459,6 +8526,9 @@ static PyMethodDef libvirtMethods[] = { #if LIBVIR_CHECK_VERSION(1, 2, 9) {(char *) "virNodeAllocPages", libvirt_virNodeAllocPages, METH_VARARGS, NULL}, #endif /* LIBVIR_CHECK_VERSION(1, 2, 9) */ +#if LIBVIR_CHECK_VERSION(1, 2, 11) + {(char *) "virDomainGetFSInfo", libvirt_virDomainGetFSInfo, METH_VARARGS, NULL}, +#endif /* LIBVIR_CHECK_VERSION(1, 2, 11) */ {NULL, NULL, 0, NULL} };
diff --git a/sanitytest.py b/sanitytest.py index b161696..f5337fc 100644 --- a/sanitytest.py +++ b/sanitytest.py @@ -137,6 +137,9 @@ for cname in wantfunctions: if name[0:28] == "virDomainStatsRecordListFree": continue
+ if name[0:19] == "virDomainFSInfoFree": + continue + if name[0:21] == "virDomainListGetStats": name = "virConnectDomainListGetStats"
@@ -269,7 +272,7 @@ for name in sorted(basicklassmap): func = func[0:1].lower() + func[1:] if func[0:8] == "nWFilter": func = "nwfilter" + func[8:] - if func[0:8] == "fSFreeze" or func[0:6] == "fSThaw": + if func[0:8] == "fSFreeze" or func[0:6] == "fSThaw" or func[0:6] == "fSInfo": func = "fs" + func[2:]
if klass == "virNetwork":
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Returning VIR_PY_NONE is safe there as none of the used function sets the python exception and the error is handled in the python wrapper.
ACK
Pavel
The ACK is of course with the changes mentioned above. Pavel