diff --git a/ChangeLog b/ChangeLog index 53972a54b9..ac2af04b07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Tue Jan 31 11:22:51 CET 2006 Daniel Veillard + + * python/*: update of the python bindings, fix names, add + missing features like list of domains and domain info extraction + +Tue Jan 31 11:21:56 CET 2006 Daniel Veillard + + * configure.in libvir.spec.in NEWS docs/*: commiting the state of 0.0.2 + release + Sun Jan 29 11:55:13 CET 2006 Daniel Veillard * NEWS docs/news.xsl: added stylesheet to generate NEWS file diff --git a/include/libvir.h b/include/libvir.h index ddba307ec6..850c617bb7 100644 --- a/include/libvir.h +++ b/include/libvir.h @@ -167,7 +167,7 @@ typedef enum { * version * 1,000,000 + minor * 1000 + micro */ -#define LIBVIR_VERSION_NUMBER 1 +#define LIBVIR_VERSION_NUMBER 2 int virGetVersion (unsigned long *libVer, const char *type, diff --git a/python/TODO b/python/TODO index e4e505a34a..f78c07b26a 100644 --- a/python/TODO +++ b/python/TODO @@ -5,4 +5,4 @@ Daniel Veillard -$date$ +$Date$ diff --git a/python/generator.py b/python/generator.py index b489b568d2..0c22482b77 100755 --- a/python/generator.py +++ b/python/generator.py @@ -202,6 +202,9 @@ def enum(type, name, value): # ####################################################################### +functions_failed = [] +functions_skipped = [] + skipped_modules = { } @@ -254,8 +257,8 @@ foreign_encoding_args = ( # Class methods which are written by hand in libvir.c but the Python-level # code is still automatically generated (so they are not in skip_function()). skip_impl = ( - 'xmlSaveFileTo', - 'xmlSaveFormatFileTo', + 'virConnectListDomainsID', + 'virDomainGetInfo', ) def skip_function(name): @@ -479,9 +482,11 @@ def buildStubs(): ret = print_function_wrapper(function, wrapper, export, include) if ret < 0: failed = failed + 1 + functions_failed.append(function) del functions[function] if ret == 0: skipped = skipped + 1 + functions_skipped.append(function) del functions[function] if ret == 1: nb_wrap = nb_wrap + 1 @@ -536,6 +541,10 @@ function_classes = {} function_classes["None"] = [] +function_post = { + 'virDomainDestroy': "self._o = None", +} + def nameFixup(name, classe, type, file): listname = classe + "List" ll = len(listname) @@ -557,6 +566,12 @@ def nameFixup(name, classe, type, file): func = string.lower(func[0:1]) + func[1:] else: func = name + if func == "iD": + func = "ID" + if func == "oSType": + func = "OSType" + if func == "xMLDesc": + func = "XMLDesc" return func @@ -836,6 +851,8 @@ def buildWrappers(): classes.write(classes_type[arg[1]][0]) n = n + 1 classes.write(")\n"); + if function_post.has_key(name): + classes.write(" %s\n" % (function_post[name])); if ret[0] != "void": if classes_type.has_key(ret[0]): # @@ -893,6 +910,14 @@ def buildWrappers(): classes.write("%s = %s\n" % (name,value)) classes.write("\n"); + if len(functions_skipped) != 0: + txt.write("\nFunctions skipped:\n") + for function in functions_skipped: + txt.write(" %s\n" % function) + if len(functions_failed) != 0: + txt.write("\nFunctions failed:\n") + for function in functions_failed: + txt.write(" %s\n" % function) txt.close() classes.close() diff --git a/python/libvir-python-api.xml b/python/libvir-python-api.xml index 45076f52a7..d90da8a27a 100644 --- a/python/libvir-python-api.xml +++ b/python/libvir-python-api.xml @@ -1,3 +1,15 @@ + + + Returns the list of the ID of the domains on the hypervisor + + + + + Extract information about a domain. Note that if the connection used to get the domain is limited only a partial set of the informations can be extracted. + + + + diff --git a/python/libvir.c b/python/libvir.c index 2f18660185..5956fdd09d 100644 --- a/python/libvir.c +++ b/python/libvir.c @@ -48,6 +48,58 @@ libvir_virConnectClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { return(py_retval); } +static PyObject * +libvir_virConnectListDomainsID(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + PyObject *py_retval; + int ids[500], c_retval, i; + virConnectPtr conn; + PyObject *pyobj_conn; + + + if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDomains", &pyobj_conn)) + return(NULL); + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + c_retval = virConnectListDomains(conn, &ids[0], 500); + if (c_retval < 0) { + Py_INCREF(Py_None); + return(Py_None); + } + py_retval = PyList_New(c_retval); + for (i = 0;i < c_retval;i++) { + PyList_SetItem(py_retval, i, libvir_intWrap(ids[i])); + } + return(py_retval); +} + +static PyObject * +libvir_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { + PyObject *py_retval; + int c_retval; + virDomainPtr domain; + PyObject *pyobj_domain; + virDomainInfo info; + + if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetInfo", &pyobj_domain)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + c_retval = virDomainGetInfo(domain, &info); + if (c_retval < 0) { + Py_INCREF(Py_None); + return(Py_None); + } + py_retval = PyList_New(5); + PyList_SetItem(py_retval, 0, libvir_intWrap((int) info.state)); + PyList_SetItem(py_retval, 1, libvir_longWrap((long) info.maxMem)); + PyList_SetItem(py_retval, 2, libvir_longWrap((long) info.memory)); + PyList_SetItem(py_retval, 3, libvir_intWrap((int) info.nrVirtCpu)); + PyList_SetItem(py_retval, 4, + libvir_longlongWrap((unsigned long long) info.cpuTime)); + return(py_retval); +} + /************************************************************************ * * * The registration stuff * @@ -57,6 +109,8 @@ static PyMethodDef libvirMethods[] = { #include "libvir-export.c" {(char *) "virDomainFree", libvir_virDomainFree, METH_VARARGS, NULL}, {(char *) "virConnectClose", libvir_virConnectClose, METH_VARARGS, NULL}, + {(char *) "virConnectListDomainsID", libvir_virConnectListDomainsID, METH_VARARGS, NULL}, + {(char *) "virDomainGetInfo", libvir_virDomainGetInfo, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; diff --git a/python/libvir_wrap.h b/python/libvir_wrap.h index 31771d7826..41400c06ac 100644 --- a/python/libvir_wrap.h +++ b/python/libvir_wrap.h @@ -40,6 +40,7 @@ typedef struct { PyObject * libvir_intWrap(int val); PyObject * libvir_longWrap(long val); +PyObject * libvir_longlongWrap(long long val); PyObject * libvir_charPtrWrap(char *str); PyObject * libvir_constcharPtrWrap(const char *str); PyObject * libvir_charPtrConstWrap(const char *str); diff --git a/python/types.c b/python/types.c index 1f71198d1b..3015c1d65a 100644 --- a/python/types.c +++ b/python/types.c @@ -33,6 +33,18 @@ libvir_longWrap(long val) return (ret); } +PyObject * +libvir_longlongWrap(long long val) +{ + PyObject *ret; + +#ifdef DEBUG + printf("libvir_longWrap: val = %ld\n", val); +#endif + ret = PyLong_FromUnsignedLongLong((unsigned long long) val); + return (ret); +} + PyObject * libvir_charPtrWrap(char *str) {