On Thu, Jun 09, 2011 at 12:10:12PM -0500, Adam Litke wrote: > virDomainBlockPullAll and virDomainBlockPullAbort are handled automatically. > virDomainBlockPull and virDomainBlockPullInfo require manual overrides since > they return a custom type. > > * python/generator.py: reenable bindings for this entry point > * python/libvirt-override-api.xml python/libvirt-override.c: > manual overrides > > Signed-off-by: Adam Litke <agl@xxxxxxxxxx> > --- > python/generator.py | 5 +-- > python/libvirt-override-api.xml | 14 ++++++++++ > python/libvirt-override.c | 53 +++++++++++++++++++++++++++++++++++++++ > 3 files changed, 69 insertions(+), 3 deletions(-) > > diff --git a/python/generator.py b/python/generator.py > index 43e7414..be8419d 100755 > --- a/python/generator.py > +++ b/python/generator.py > @@ -178,8 +178,6 @@ def enum(type, name, value): > functions_failed = [] > functions_skipped = [ > "virConnectListDomains", > - 'virDomainBlockPull', > - 'virDomainGetBlockPullInfo', > ] > > skipped_modules = { > @@ -194,7 +192,6 @@ skipped_types = { > 'virConnectDomainEventIOErrorCallback': "No function types in python", > 'virConnectDomainEventGraphicsCallback': "No function types in python", > 'virEventAddHandleFunc': "No function types in python", > - 'virDomainBlockPullInfoPtr': "Not implemented yet", > } > > ####################################################################### > @@ -359,6 +356,8 @@ skip_impl = ( > 'virNodeDeviceListCaps', > 'virConnectBaselineCPU', > 'virDomainRevertToSnapshot', > + 'virDomainBlockPull', > + 'virDomainGetBlockPullInfo', > ) > > > diff --git a/python/libvirt-override-api.xml b/python/libvirt-override-api.xml > index ec08e69..4bdd5de 100644 > --- a/python/libvirt-override-api.xml > +++ b/python/libvirt-override-api.xml > @@ -314,5 +314,19 @@ > <arg name='flags' type='unsigned int' info='flags, curently unused'/> > <return type='int' info="0 on success, -1 on error"/> > </function> > + <function name='virDomainBlockPull' file='python'> > + <info>Initiate an incremental BlockPull for the given disk</info> > + <arg name='dom' type='virDomainPtr' info='pointer to the domain'/> > + <arg name='path' type='const char *' info='Fully-qualified filename of disk'/> > + <arg name='flags' type='unsigned int' info='fine-tuning flags, currently unused, pass 0.'/> > + <return type='virDomainBlockPullInfo' info='A dictionary containing progress information.' /> > + </function> > + <function name='virDomainGetBlockPullInfo' file='python'> > + <info>Get progress information for a background BlockPull operation</info> > + <arg name='dom' type='virDomainPtr' info='pointer to the domain'/> > + <arg name='path' type='const char *' info='Fully-qualified filename of disk'/> > + <arg name='flags' type='unsigned int' info='fine-tuning flags, currently unused, pass 0.'/> > + <return type='virDomainBlockPullInfo' info='A dictionary containing progress information.' /> > + </function> > </symbols> > </api> > diff --git a/python/libvirt-override.c b/python/libvirt-override.c > index 974decb..cbdbc54 100644 > --- a/python/libvirt-override.c > +++ b/python/libvirt-override.c > @@ -2382,6 +2382,57 @@ libvirt_virDomainGetJobInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { > return(py_retval); > } > > +static PyObject * > +libvirt_virDomainBlockPullImpl(PyObject *self ATTRIBUTE_UNUSED, > + PyObject *args, int infoOnly) { > + virDomainPtr domain; > + PyObject *pyobj_domain; > + const char *path; > + unsigned int flags; > + virDomainBlockPullInfo info; > + int c_ret; > + PyObject *ret; > + > + if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainStreamDiskInfo", > + &pyobj_domain, &path, &flags)) > + return(NULL); > + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); > + > +LIBVIRT_BEGIN_ALLOW_THREADS; > + if (infoOnly) > + c_ret = virDomainGetBlockPullInfo(domain, path, &info, flags); > + else > + c_ret = virDomainBlockPull(domain, path, &info, flags); > +LIBVIRT_END_ALLOW_THREADS; > + > + if (c_ret == -1) > + return VIR_PY_NONE; > + > + if ((ret = PyDict_New()) == NULL) > + return VIR_PY_NONE; > + > + PyDict_SetItem(ret, libvirt_constcharPtrWrap("cur"), > + libvirt_ulonglongWrap(info.cur)); > + PyDict_SetItem(ret, libvirt_constcharPtrWrap("end"), > + libvirt_ulonglongWrap(info.end)); > + > + return ret; > +} > + > +static PyObject * > +libvirt_virDomainBlockPull(PyObject *self ATTRIBUTE_UNUSED, > + PyObject *args) > +{ > + return libvirt_virDomainBlockPullImpl(self, args, 0); > +} > + > +static PyObject * > +libvirt_virDomainGetBlockPullInfo(PyObject *self ATTRIBUTE_UNUSED, > + PyObject *args) > +{ > + return libvirt_virDomainBlockPullImpl(self, args, 1); > +} > + > > /******************************************* > * Helper functions to avoid importing modules > @@ -3613,6 +3664,8 @@ static PyMethodDef libvirtMethods[] = { > {(char *) "virDomainGetJobInfo", libvirt_virDomainGetJobInfo, METH_VARARGS, NULL}, > {(char *) "virDomainSnapshotListNames", libvirt_virDomainSnapshotListNames, METH_VARARGS, NULL}, > {(char *) "virDomainRevertToSnapshot", libvirt_virDomainRevertToSnapshot, METH_VARARGS, NULL}, > + {(char *) "virDomainBlockPull", libvirt_virDomainBlockPull, METH_VARARGS, NULL}, > + {(char *) "virDomainGetBlockPullInfo", libvirt_virDomainGetBlockPullInfo, METH_VARARGS, NULL}, > {NULL, NULL, 0, NULL} > }; ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list