2009/12/17 Adam Litke <agl@xxxxxxxxxx>: > Enable virDomainMemoryStats in the python API. dom.memoryStats() will return a > dictionary containing the supported statistics. A dictionary is required > because the meaining of each quantity cannot be inferred from its index in a > list. > > Signed-off-by: Adam Litke <agl@xxxxxxxxxx> > To: libvirt list <libvir-list@xxxxxxxxxx> > Cc: Daniel Veillard <veillard@xxxxxxxxxx> > Cc: Daniel P. Berrange <berrange@xxxxxxxxxx> > --- > python/generator.py | 3 +- > python/libvirt-override-api.xml | 5 ++++ > python/libvirt-override.c | 43 +++++++++++++++++++++++++++++++++++++++ > 3 files changed, 49 insertions(+), 2 deletions(-) > > diff --git a/python/generator.py b/python/generator.py > index 06f1ff4..56f8925 100755 > --- a/python/generator.py > +++ b/python/generator.py > @@ -161,7 +161,6 @@ def enum(type, name, value): > functions_failed = [] > functions_skipped = [ > "virConnectListDomains", > - "virDomainMemoryStats" > ] > > skipped_modules = { > @@ -171,7 +170,6 @@ skipped_types = { > # 'int *': "usually a return type", > 'virConnectDomainEventCallback': "No function types in python", > 'virEventAddHandleFunc': "No function types in python", > - 'virDomainMemoryStatPtr': "Not implemented yet", > } > > ####################################################################### > @@ -283,6 +281,7 @@ skip_impl = ( > 'virNetworkGetAutostart', > 'virDomainBlockStats', > 'virDomainInterfaceStats', > + 'virDomainMemoryStats', > 'virNodeGetCellsFreeMemory', > 'virDomainGetSchedulerType', > 'virDomainGetSchedulerParameters', > diff --git a/python/libvirt-override-api.xml b/python/libvirt-override-api.xml > index 96958b5..6ae2742 100644 > --- a/python/libvirt-override-api.xml > +++ b/python/libvirt-override-api.xml > @@ -105,6 +105,11 @@ > <arg name='domain' type='virDomainPtr' info='a domain object'/> > <arg name='path' type='char *' info='the path for the interface device'/> > </function> > + <function name='virDomainMemoryStats' file='python'> > + <info>Extracts memory statistics for a domain</info> > + <return type='virDomainMemoryStats' info='a dictionary of statistics'/> > + <arg name='domain' type='virDomainPtr' info='a domain object'/> > + </function> > <function name="virNodeGetCellsFreeMemory" file='python'> > <info>Returns the available memory for a list of cells</info> > <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/> > diff --git a/python/libvirt-override.c b/python/libvirt-override.c > index 6c1e51b..8aa2dad 100644 > --- a/python/libvirt-override.c > +++ b/python/libvirt-override.c > @@ -120,6 +120,48 @@ libvirt_virDomainInterfaceStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) > return(info); > } > > +static PyObject * > +libvirt_virDomainMemoryStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { > + virDomainPtr domain; > + PyObject *pyobj_domain; > + unsigned int nr_stats, i; > + virDomainMemoryStatStruct stats[VIR_MEMSTAT_NR_TAGS]; > + PyObject *info; > + > + if (!PyArg_ParseTuple(args, (char *)"O:virDomainMemoryStats", &pyobj_domain)) > + return(NULL); > + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); > + > + nr_stats = virDomainMemoryStats(domain, stats, VIR_MEMSTAT_NR_TAGS, 0); > + if (nr_stats == -1) > + return VIR_PY_NONE; > + > + /* convert to a Python dictionary */ > + if ((info = PyDict_New()) == NULL) > + return VIR_PY_NONE; > + > + for (i = 0; i < nr_stats; i++) { > + if (stats[i].tag == VIR_MEMSTAT_SWAP_IN) > + PyDict_SetItem(info, libvirt_constcharPtrWrap("swap_in"), > + PyLong_FromUnsignedLongLong(stats[i].val)); > + if (stats[i].tag == VIR_MEMSTAT_SWAP_OUT) > + PyDict_SetItem(info, libvirt_constcharPtrWrap("swap_out"), > + PyLong_FromUnsignedLongLong(stats[i].val)); > + if (stats[i].tag == VIR_MEMSTAT_MAJOR_FAULT) > + PyDict_SetItem(info, libvirt_constcharPtrWrap("major_fault"), > + PyLong_FromUnsignedLongLong(stats[i].val)); > + if (stats[i].tag == VIR_MEMSTAT_MINOR_FAULT) > + PyDict_SetItem(info, libvirt_constcharPtrWrap("minor_fault"), > + PyLong_FromUnsignedLongLong(stats[i].val)); > + if (stats[i].tag == VIR_MEMSTAT_MEM_FREE) > + PyDict_SetItem(info, libvirt_constcharPtrWrap("free_memory"), > + PyLong_FromUnsignedLongLong(stats[i].val)); > + if (stats[i].tag == VIR_MEMSTAT_MEM_TOTAL) > + PyDict_SetItem(info, libvirt_constcharPtrWrap("total_memory"), > + PyLong_FromUnsignedLongLong(stats[i].val)); > + } > + return info; > +} You're using the old tags (VIR_MEMSTAT_*) and names (free_memory, total_memory) here. You could convert the adjacent if blocks into and if/else if block or a switch block. You're also silently ignoring unknown tags here, but that should be handled at the libvirt C API level if it should be handled at all. Matthias -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list