On Tue, May 10, 2011 at 03:39:03PM +0200, Jiri Denemark wrote: > This API is supposed to replace virDomainGetInfo when the only purpose > of calling it is getting current domain status. > --- > Notes: > Version 2: > - rebased > - unsigned int flags parameter > - updated version info in public.syms > > include/libvirt/libvirt.h.in | 56 +++++++++++++++++++++++++++++++++++++++ > python/generator.py | 1 + > python/libvirt-override-api.xml | 6 ++++ > python/libvirt-override.c | 30 +++++++++++++++++++++ > src/libvirt_public.syms | 5 +++ > 5 files changed, 98 insertions(+), 0 deletions(-) > > diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in > index 5783303..ee636c5 100644 > --- a/include/libvirt/libvirt.h.in > +++ b/include/libvirt/libvirt.h.in > @@ -89,6 +89,58 @@ typedef enum { > VIR_DOMAIN_CRASHED = 6 /* the domain is crashed */ > } virDomainState; > > +typedef enum { > + VIR_DOMAIN_NOSTATE_UNKNOWN = 0, > +} virDomainNostateReason; > + > +typedef enum { > + VIR_DOMAIN_RUNNING_UNKNOWN = 0, > + VIR_DOMAIN_RUNNING_BOOTED = 1, /* normal startup from boot */ > + VIR_DOMAIN_RUNNING_MIGRATED = 2, /* migrated from another host */ > + VIR_DOMAIN_RUNNING_RESTORED = 3, /* restored from a state file */ > + VIR_DOMAIN_RUNNING_FROM_SNAPSHOT = 4, /* restored from snapshot */ > + VIR_DOMAIN_RUNNING_UNPAUSED = 5, /* returned from paused state */ > + VIR_DOMAIN_RUNNING_MIGRATION_CANCELED = 6, /* returned from migration */ > + VIR_DOMAIN_RUNNING_SAVE_CANCELED = 7, /* returned from failed save process */ > +} virDomainRunningReason; > + > +typedef enum { > + VIR_DOMAIN_BLOCKED_UNKNOWN = 0, /* the reason is unknown */ > +} virDomainBlockedReason; > + > +typedef enum { > + VIR_DOMAIN_PAUSED_UNKNOWN = 0, /* the reason is unknown */ > + VIR_DOMAIN_PAUSED_USER = 1, /* paused on user request */ > + VIR_DOMAIN_PAUSED_MIGRATION = 2, /* paused for offline migration */ > + VIR_DOMAIN_PAUSED_SAVE = 3, /* paused for save */ > + VIR_DOMAIN_PAUSED_DUMP = 4, /* paused for offline core dump */ > + VIR_DOMAIN_PAUSED_IOERROR = 5, /* paused due to a disk I/O error */ > + VIR_DOMAIN_PAUSED_WATCHDOG = 6, /* paused due to a watchdog event */ > + VIR_DOMAIN_PAUSED_FROM_SNAPSHOT = 7, /* restored from a snapshot which was > + * taken while domain was paused */ > +} virDomainPausedReason; > + > +typedef enum { > + VIR_DOMAIN_SHUTDOWN_UNKNOWN = 0, /* the reason is unknown */ > + VIR_DOMAIN_SHUTDOWN_USER = 1, /* shutting down on user request */ > +} virDomainShutdownReason; > + > +typedef enum { > + VIR_DOMAIN_SHUTOFF_UNKNOWN = 0, /* the reason is unknown */ > + VIR_DOMAIN_SHUTOFF_SHUTDOWN = 1, /* normal shutdown */ > + VIR_DOMAIN_SHUTOFF_DESTROYED = 2, /* forced poweroff */ > + VIR_DOMAIN_SHUTOFF_CRASHED = 3, /* domain crashed */ > + VIR_DOMAIN_SHUTOFF_MIGRATED = 4, /* migrated to another host */ > + VIR_DOMAIN_SHUTOFF_SAVED = 5, /* saved to a file */ > + VIR_DOMAIN_SHUTOFF_FAILED = 6, /* domain failed to start */ > + VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT = 7, /* restored from a snapshot which was > + * taken while domain was shutoff */ > +} virDomainShutoffReason; > + > +typedef enum { > + VIR_DOMAIN_CRASHED_UNKNOWN = 0, /* crashed for unknown reason */ > +} virDomainCrashedReason; > + > /** > * virDomainInfoPtr: > * > @@ -674,6 +726,10 @@ int virDomainCoreDump (virDomainPtr domain, > */ > int virDomainGetInfo (virDomainPtr domain, > virDomainInfoPtr info); > +int virDomainGetState (virDomainPtr domain, > + int *state, > + int *reason, > + unsigned int flags); > > /* > * Return scheduler type in effect 'sedf', 'credit', 'linux' > diff --git a/python/generator.py b/python/generator.py > index 4fa4f65..b395caf 100755 > --- a/python/generator.py > +++ b/python/generator.py > @@ -293,6 +293,7 @@ skip_impl = ( > 'virConnGetLastError', > 'virGetLastError', > 'virDomainGetInfo', > + 'virDomainGetState', > 'virDomainGetBlockInfo', > 'virDomainGetJobInfo', > 'virNodeGetInfo', > diff --git a/python/libvirt-override-api.xml b/python/libvirt-override-api.xml > index 54deeb5..ec08e69 100644 > --- a/python/libvirt-override-api.xml > +++ b/python/libvirt-override-api.xml > @@ -48,6 +48,12 @@ > <return type='int *' info='the list of information or None in case of error'/> > <arg name='domain' type='virDomainPtr' info='a domain object'/> > </function> > + <function name='virDomainGetState' file='python'> > + <info>Extract domain state.</info> > + <return type='int *' info='the list containing state and reason or None in case of error'/> > + <arg name='domain' type='virDomainPtr' info='a domain object'/> > + <arg name='flags' type='unsigned int' info='additional flags'/> > + </function> > <function name='virDomainGetBlockInfo' file='python'> > <info>Extract information about a domain block device size</info> > <return type='int *' info='the list of information or None in case of error'/> > diff --git a/python/libvirt-override.c b/python/libvirt-override.c > index 4a9b432..11e1d0c 100644 > --- a/python/libvirt-override.c > +++ b/python/libvirt-override.c > @@ -1068,6 +1068,35 @@ libvirt_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { > } > > static PyObject * > +libvirt_virDomainGetState(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) > +{ > + PyObject *py_retval; > + int c_retval; > + virDomainPtr domain; > + PyObject *pyobj_domain; > + int state; > + int reason; > + unsigned int flags; > + > + if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetState", > + &pyobj_domain, &flags)) > + return NULL; > + > + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); > + > + LIBVIRT_BEGIN_ALLOW_THREADS; > + c_retval = virDomainGetState(domain, &state, &reason, flags); > + LIBVIRT_END_ALLOW_THREADS; > + if (c_retval < 0) > + return VIR_PY_NONE; > + > + py_retval = PyList_New(2); > + PyList_SetItem(py_retval, 0, libvirt_intWrap(state)); > + PyList_SetItem(py_retval, 1, libvirt_intWrap(reason)); > + return py_retval; > +} > + > +static PyObject * > libvirt_virDomainGetBlockInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { > PyObject *py_retval; > int c_retval; > @@ -3527,6 +3556,7 @@ static PyMethodDef libvirtMethods[] = { > {(char *) "virConnectDomainEventRegisterAny", libvirt_virConnectDomainEventRegisterAny, METH_VARARGS, NULL}, > {(char *) "virConnectDomainEventDeregisterAny", libvirt_virConnectDomainEventDeregisterAny, METH_VARARGS, NULL}, > {(char *) "virDomainGetInfo", libvirt_virDomainGetInfo, METH_VARARGS, NULL}, > + {(char *) "virDomainGetState", libvirt_virDomainGetState, METH_VARARGS, NULL}, > {(char *) "virDomainGetBlockInfo", libvirt_virDomainGetBlockInfo, METH_VARARGS, NULL}, > {(char *) "virNodeGetInfo", libvirt_virNodeGetInfo, METH_VARARGS, NULL}, > {(char *) "virDomainGetUUID", libvirt_virDomainGetUUID, METH_VARARGS, NULL}, > diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms > index b4aed41..a11e347 100644 > --- a/src/libvirt_public.syms > +++ b/src/libvirt_public.syms > @@ -436,4 +436,9 @@ LIBVIRT_0.9.0 { > virStorageVolUpload; > } LIBVIRT_0.8.8; > > +LIBVIRT_0.9.2 { > + global: > + virDomainGetState; > +} LIBVIRT_0.9.0; > + > # .... define new API here using predicted next version number .... ACK, but needs a rebase for the InjectNMI command 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