Richard W.M. Jones wrote:
Daniel P. Berrange wrote:On Wed, May 23, 2007 at 03:58:02PM +0100, Richard W.M. Jones wrote:This patch adds a Python binding for the virGetVersion call (called libvirt.getVersion).Looks good to me.Actually, it contains a subtle error. Improved patch coming up ...
The error was in the handling of the case where you pass None to the function. Previously that would pass a NULL type and non-NULL typeVer to the underlying C function, which the underlying C function would interpret as a request to get the version of the Xen driver.
Bad idea if libvirt is compiled --without-xen.The new version treats None as meaning that we just want to get the version of the main library.
The semantics of the new version are described in the Python documentation: + """Return a tuple containing the version of the library and + a version of the driver with the given name. + + If the name passed is None then only the first element of the + tuple (library version) is meaningful. The second element will + be zero. + + If the name passed refers to a non-existent driver, then you + will get the exception 'no support for hypervisor'. + + Versions are 1000000*major + 1000*minor + release.""" and shown in the example below: $ python Python 2.4.4 (#1, Oct 23 2006, 13:58:18) [GCC 4.1.1 20061011 (Red Hat 4.1.1-30)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import libvirt; >>> libvirt.getVersion (None); (2002, 0) >>> libvirt.getVersion ("Xen"); (2002, 3000001) >>> libvirt.getVersion ("QEMU"); (2002, 2002) >>> libvirt.getVersion ("not_here"); libvir: error : no support for hypervisor Traceback (most recent call last): File "<stdin>", line 1, in ?File "/home/rjones/local/lib/python2.4/site-packages/libvirt.py", line 102, in getVersion
if ret is None: raise libvirtError ("virGetVersion() failed") libvirt.libvirtError: virGetVersion() failed no support for hypervisor Rich. -- Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/ Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SL4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 03798903
Index: python/generator.py =================================================================== RCS file: /data/cvs/libvirt/python/generator.py,v retrieving revision 1.20 diff -u -r1.20 generator.py --- python/generator.py 16 Apr 2007 12:37:59 -0000 1.20 +++ python/generator.py 23 May 2007 15:44:38 -0000 @@ -287,6 +287,8 @@ return 1 if name == "vshRunConsole": return 1 + if name == "virGetVersion": + return 1 return 0 def print_function_wrapper(name, output, export, include): Index: python/libvir.c =================================================================== RCS file: /data/cvs/libvirt/python/libvir.c,v retrieving revision 1.21 diff -u -r1.21 libvir.c --- python/libvir.c 10 Apr 2007 23:15:58 -0000 1.21 +++ python/libvir.c 23 May 2007 15:44:38 -0000 @@ -179,6 +179,29 @@ ************************************************************************/ static PyObject * +libvirt_virGetVersion (PyObject *self ATTRIBUTE_UNUSED, PyObject *args) +{ + char *type; + unsigned long libVer, typeVer = 0; + int c_retval; + + if (!PyArg_ParseTuple (args, (char *) "z", &type)) + return NULL; + + LIBVIRT_BEGIN_ALLOW_THREADS; + if (type == NULL) + c_retval = virGetVersion (&libVer, NULL, NULL); + else + c_retval = virGetVersion (&libVer, type, &typeVer); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval == -1) { + Py_INCREF(Py_None); + return (Py_None); + } + return Py_BuildValue ((char *) "kk", libVer, typeVer); +} + +static PyObject * libvirt_virDomainFree(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { PyObject *py_retval; int c_retval; @@ -628,6 +651,7 @@ ************************************************************************/ static PyMethodDef libvirtMethods[] = { #include "libvirt-export.c" + {(char *) "virGetVersion", libvirt_virGetVersion, METH_VARARGS, NULL}, {(char *) "virDomainFree", libvirt_virDomainFree, METH_VARARGS, NULL}, {(char *) "virConnectClose", libvirt_virConnectClose, METH_VARARGS, NULL}, {(char *) "virConnectListDomainsID", libvirt_virConnectListDomainsID, METH_VARARGS, NULL}, @@ -664,3 +688,17 @@ initialized = 1; } + +/* + * vim: set tabstop=4: + * vim: set shiftwidth=4: + * vim: set expandtab: + */ +/* + * Local variables: + * indent-tabs-mode: nil + * c-indent-level: 4 + * c-basic-offset: 4 + * tab-width: 4 + * End: + */ Index: python/libvir.py =================================================================== RCS file: /data/cvs/libvirt/python/libvir.py,v retrieving revision 1.4 diff -u -r1.4 libvir.py --- python/libvir.py 16 Apr 2007 12:37:59 -0000 1.4 +++ python/libvir.py 23 May 2007 15:44:38 -0000 @@ -83,6 +83,26 @@ Returns 1 in case of success.""" return libvirtmod.virRegisterErrorHandler(f,ctx) +# +# Return library version. +# +def getVersion (name): + """Return a tuple containing the version of the library and + a version of the driver with the given name. + + If the name passed is None then only the first element of the + tuple (library version) is meaningful. The second element will + be zero. + + If the name passed refers to a non-existant driver, then you + will get the exception 'no support for hypervisor'. + + Versions are 1000000*major + 1000*minor + release.""" + ret = libvirtmod.virGetVersion (name); + if ret is None: raise libvirtError ("virGetVersion() failed") + return ret + + # WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING # # Everything before this line comes from libvir.py
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature