From 37f24b06c0f96539f8964e0b41010f4ebe514f5f Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 20 Apr 2010 11:49:27 +0200 Subject: Fixup python binding for virDomainSnapshot APIs The generator code was totally wrong for the virDomainSnapshot APIs, not generating the wrapper class, and giving methods the wrong names * generator.py: Set metadata for virDomainSnapshot type & APIs * libvirt-override-api.xml, libvirt-override.c: Hand-code the virDomainSnapshotListNames glue layer --- generator.py | 27 ++++++++++++++++++++++++++- libvirt-override-api.xml | 6 ++++++ libvirt-override.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/generator.py b/generator.py index cb9f3d9..6f082e8 100755 --- a/generator.py +++ b/generator.py @@ -243,6 +243,9 @@ py_types = { 'const virStream *': ('O', "virStream", "virStreamPtr", "virStreamPtr"), 'virDomainSnapshotPtr': ('O', "virDomainSnapshot", "virDomainSnapshotPtr", "virDomainSnapshotPtr"), + 'const virDomainSnapshotPtr': ('O', "virDomainSnapshot", "virDomainSnapshotPtr", "virDomainSnapshotPtr"), + 'virDomainSnapshot *': ('O', "virDomainSnapshot", "virDomainSnapshotPtr", "virDomainSnapshotPtr"), + 'const virDomainSnapshot *': ('O', "virDomainSnapshot", "virDomainSnapshotPtr", "virDomainSnapshotPtr"), } py_return_types = { @@ -277,6 +280,7 @@ skip_impl = ( 'virConnectListDefinedStorageVols', 'virConnectListDefinedInterfaces', 'virConnectListNWFilters', + 'virDomainSnapshotListNames', 'virConnGetLastError', 'virGetLastError', 'virDomainGetInfo', @@ -643,6 +647,8 @@ classes_type = { "virStream *": ("._o", "virStream(self, _obj=%s)", "virStream"), "virConnectPtr": ("._o", "virConnect(_obj=%s)", "virConnect"), "virConnect *": ("._o", "virConnect(_obj=%s)", "virConnect"), + "virDomainSnapshotPtr": ("._o", "virDomainSnapshot(self,_obj=%s)", "virDomainSnapshot"), + "virDomainSnapshot *": ("._o", "virDomainSnapshot(self, _obj=%s)", "virDomainSnapshot"), } converter_type = { @@ -651,7 +657,7 @@ converter_type = { primary_classes = ["virDomain", "virNetwork", "virInterface", "virStoragePool", "virStorageVol", "virConnect", "virNodeDevice", "virSecret", - "virStream"] + "virStream", "virDomainSnapshot"] classes_ancestor = { } @@ -663,6 +669,7 @@ classes_destructors = { "virStorageVol": "virStorageVolFree", "virNodeDevice" : "virNodeDeviceFree", "virSecret": "virSecretFree", + "virDomainSnapshot": "virDomainSnapshotFree", # We hand-craft __del__ for this one #"virStream": "virStreamFree", } @@ -767,6 +774,24 @@ def nameFixup(name, classe, type, file): elif name[0:12] == "virDomainGet": func = name[12:] func = string.lower(func[0:1]) + func[1:] + elif name[0:29] == "virDomainSnapshotLookupByName": + func = name[9:] + func = string.lower(func[0:1]) + func[1:] + elif name[0:26] == "virDomainSnapshotListNames": + func = name[9:] + func = string.lower(func[0:1]) + func[1:] + elif name[0:20] == "virDomainSnapshotNum": + func = name[9:] + func = string.lower(func[0:1]) + func[1:] + elif name[0:26] == "virDomainSnapshotCreateXML": + func = name[9:] + func = string.lower(func[0:1]) + func[1:] + elif name[0:24] == "virDomainSnapshotCurrent": + func = name[9:] + func = string.lower(func[0:1]) + func[1:] + elif name[0:17] == "virDomainSnapshot": + func = name[17:] + func = string.lower(func[0:1]) + func[1:] elif name[0:9] == "virDomain": func = name[9:] func = string.lower(func[0:1]) + func[1:] diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index e95c46a..6f1bc04 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -243,5 +243,11 @@ + + collect the list of snapshots for the given domain + + + + diff --git a/libvirt-override.c b/libvirt-override.c index 02bc313..ce21f60 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -942,6 +942,51 @@ libvirt_virConnectListDefinedDomains(PyObject *self ATTRIBUTE_UNUSED, return(py_retval); } +static PyObject * +libvirt_virDomainSnapshotListNames(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + PyObject *py_retval; + char **names = NULL; + int c_retval, i; + virDomainPtr dom; + PyObject *pyobj_dom; + int flags; + + if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainSnapshotListNames", &pyobj_dom, &flags)) + return(NULL); + dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainSnapshotNum(dom, flags); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainSnapshotListNames(dom, names, c_retval, flags); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval < 0) { + free(names); + return VIR_PY_NONE; + } + } + py_retval = PyList_New(c_retval); + + if (names) { + for (i = 0;i < c_retval;i++) { + PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i])); + free(names[i]); + } + free(names); + } + + return(py_retval); +} + static PyObject * libvirt_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { PyObject *py_retval; @@ -3275,6 +3320,7 @@ static PyMethodDef libvirtMethods[] = { {(char *) "virConnectListDefinedInterfaces", libvirt_virConnectListDefinedInterfaces, METH_VARARGS, NULL}, {(char *) "virConnectBaselineCPU", libvirt_virConnectBaselineCPU, METH_VARARGS, NULL}, {(char *) "virDomainGetJobInfo", libvirt_virDomainGetJobInfo, METH_VARARGS, NULL}, + {(char *) "virDomainSnapshotListNames", libvirt_virDomainSnapshotListNames, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; -- cgit