summaryrefslogtreecommitdiff
path: root/generator.py
Commit message (Collapse)AuthorAgeFilesLines
* generator: fix build fail with old xml libLuyao Huang2015-09-211-1/+1
| | | | | | | | | | | | | | | | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=1222795#c6 if build libvirt-python with some old xml lib (python-pyxml), build will fail and error like this: File "generator.py", line 139, in start if "string" in attrs: File "/usr/local/lib/python2.7/site-packages/_xmlplus/sax/xmlreader.py" \ , line 316, in __getitem__ return self._attrs[name] KeyError: 0 This is an old issue and have been mentioned in commit 3ae0a76d. There is no __contains__ in class AttributesImpl, python will use __getitem__ in this place, so we will get error. Let's use 'YYY in XXX.keys()' to avoid this issue. Signed-off-by: Luyao Huang <lhuang@redhat.com>
* Provide symbolic names for typed parametersJiri Denemark2015-06-081-0/+8
| | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=1222795 Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
* Sort tuples on both itemsGuido Günther2015-05-201-3/+3
| | | | | | | | In order to achieve reproducible builds[0] we want the items within enums always generated in the same order so sort on both items in the tuple. [0] https://wiki.debian.org/ReproducibleBuilds/About
* Simplify sortingGuido Günther2015-05-201-4/+1
| | | | funcs.keys() can't be None, only the empty array
* Sort dictionary keysGuido Günther2015-05-201-4/+4
| | | | | | | In order to achive reproducible builds[0] we want functions and enums always generated in the same order. [0] https://wiki.debian.org/ReproducibleBuilds/About
* Expose virDomainInterfacesAddresses to python bindingv1.2.14Pavel Hrdina2015-03-281-0/+2
| | | | | | | | | | | | | | | | | | | | | examples/Makefile.am: * Add new file domipaddrs.py examples/README: * Add documentation for the python example libvirt-override-api.xml: * Add new symbol for virDomainInterfacesAddresses libvirt-override.c: * Hand written python api Example: $ python examples/domipaddrs.py qemu:///system f18 Interface MAC address Protocol Address vnet0 52:54:00:20:70:3d ipv4 192.168.105.240/16 Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
* Rename virDomainGetIOThreadsInfo to virDomainGetIOThreadInfoJán Tomko2015-03-261-2/+2
|
* Rename virDomainIOThreadsInfoFree to virDomainIOThreadInfoFreeJán Tomko2015-03-261-1/+1
|
* Support virDomainPinIOThreadJohn Ferlan2015-03-111-0/+1
| | | | | | | | | | | | | | | | | | | | | | Support the libvirt_virDomainSetIOThreads method using code that mimics the existing libvirt_virDomainPinVcpuFlags method The following is a sample session assuming guest 'iothr-gst' has IOThreads configured (it's currently running, too) >>> import libvirt >>> con=libvirt.open("qemu:///system") >>> dom=con.lookupByName('iothr-gst') >>> dom.ioThreadsInfo() [(1, [False, False, True, False]), (2, [False, False, False, True]), (3, [True, True, True, True])] >>> cpumap=(True,True,True,False) >>> dom.pinIOThread(3,cpumap) 0 >>> print dom.ioThreadsInfo() [(1, [False, False, True, False]), (2, [False, False, False, True]), (3, [True, True, True, False])] >>> merge
* Support virDomainGetIOThreadsInfo and virDomainIOThreadsInfoFreeJohn Ferlan2015-03-111-0/+5
| | | | | | | | | | | | | | | | | | | | | | | Add support for the libvirt_virDomainGetIOThreadsInfo method. This code mostly follows the libvirt_virDomainGetVcpuPinInfo method, but also takes some from the libvirt_virNodeGetCPUMap method with respect to building the cpumap into the returned tuple rather than two separate tuples which vcpu pinning generates Assuming two domains, one with IOThreads defined (eg, 'iothr-gst') and one without ('noiothr-gst'), execute the following in an 'iothr.py' file: import libvirt con=libvirt.open("qemu:///system") dom=con.lookupByName('iothr-gst') print dom.ioThreadsInfo() dom2=con.lookupByName('noiothr-gst') print dom2.ioThreadsInfo() $ python iothr.py [(1, [False, False, True, False]), (2, [False, False, False, True]), (3, [True, True, True, True])] [] $
* build: make it easier to backport event idsEric Blake2015-01-151-2/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In some cases, it is very easy for downstream distros to backport enum values without requiring a .so bump. Keying the conditional code off of the upstream version where the enum value was added is not ideal, because downstream then has to patch that the feature is available in their build that still reports an earlier version number. For example, if RHEL 7 backports events from 1.2.11 into a build based on 1.2.8, building the python bindings would warn: libvirt-override.c: In function ‘libvirt_virConnectDomainEventRegisterAny’: libvirt-override.c:6653:5: warning: enumeration value ‘VIR_DOMAIN_EVENT_ID_TUNABLE’ not handled in switch [-Wswitch] switch ((virDomainEventID) eventID) { ^ libvirt-override.c:6653:5: warning: enumeration value ‘VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE’ not handled in switch [-Wswitch] The solution is simple - use feature-based probes instead of version probes. Since we already scrape the XML API document of whatever libvirt build we are binding, and that XML already documents any downstream enum additions, we can use those as the features for gating conditional compilation. * generator.py (enum): Track event id names. (buildStubs): Output define wrappers for events. * libvirt-override.c (libvirt_virConnectDomainEventBalloonChangeCallback) (libvirt_virConnectDomainEventPMSuspendDiskCallback) (libvirt_virConnectDomainEventDeviceRemovedCallback) (libvirt_virConnectDomainEventTunableCallback) (libvirt_virConnectDomainEventAgentLifecycleCallback) (libvirt_virConnectDomainEventRegisterAny): Use them. Signed-off-by: Eric Blake <eblake@redhat.com>
* Add c_pointer method to classes.v1.2.11Richard W.M. Jones2014-12-111-0/+32
| | | | | | | | | | | | | | This returns the raw C pointer to the underlying object, eg: conn = libvirt.open(None) print "0x%x" % conn.c_pointer() # returns virConnectPtr of the connection dom = conn.lookupByName("test") print "0x%x" % dom.c_pointer() # returns virDomainPtr of the domain The reason behind this is to allow us to transparently pass Python dom objects through the libguestfs Python API. https://bugzilla.redhat.com/show_bug.cgi?id=1075164
* override: Implement bindings for virDomainGetFSInfo as domain.fsInfoTomoki Sekiyama2014-11-241-0/+5
| | | | | | | Implement the function which returns a list of tuples, that contains members of virDomainFSInfo struct. Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
* fix libvirt headers listv1.2.10Dmitry Guryanov2014-10-281-8/+18
| | | | | | | | Since libvirt.h has been split out, generator.py should be fixed accordingly. So add full list of header files. Signed-off-by: Dmitry Guryanov <dguryanov@parallels.com>
* Fix rest of unsigned integer handlingPeter Krempa2014-10-221-1/+1
| | | | | As in the previous patch, fix all places where 'flags' is converted as a signed argument to unsigned including the python code generator.
* Implement new virNodeAllocPages APIMichal Privoznik2014-09-261-0/+1
| | | | Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
* generator: Free strings after libvirt_charPtrWrapMichal Privoznik2014-09-121-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=1140998 Up till bb3301ba the wrapper was freeing the passed strings for us. However that changed after the commit. So now we don't free any strings which results in memory leaks as reported upstream [1]: ==14265== 2,407 bytes in 1 blocks are definitely lost in loss record 1,457 of 1,550 ==14265== at 0x4C2845D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==14265== by 0x5C46624: xdr_string (in /usr/lib64/libc-2.17.so) ==14265== by 0xCFD9FCD: xdr_remote_nonnull_string (remote_protocol.c:31) ==14265== by 0xCFDC2C8: xdr_remote_domain_get_xml_desc_ret (remote_protocol.c:1617) ==14265== by 0xCFF0811: virNetMessageDecodePayload (virnetmessage.c:407) ==14265== by 0xCFE68FB: virNetClientProgramCall (virnetclientprogram.c:379) ==14265== by 0xCFBE8B1: callFull.isra.2 (remote_driver.c:6578) ==14265== by 0xCFC7F04: remoteDomainGetXMLDesc (remote_driver.c:6600) ==14265== by 0xCF8167C: virDomainGetXMLDesc (libvirt.c:4380) ==14265== by 0xCC2C4DF: libvirt_virDomainGetXMLDesc (libvirt.c:1141) ==14265== by 0x4F12B93: PyEval_EvalFrameEx (in /usr/lib64/libpython2.7.so.1.0) ==14265== by 0x4F141AC: PyEval_EvalCodeEx (in /usr/lib64/libpython2.7.so.1.0) The python documentation clearly advise us to call free() [2]. From an example in their docs: PyObject *res; char *buf = (char *) malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); ...Do some I/O operation involving buf... res = PyString_FromString(buf); free(buf); /* malloc'ed */ return res; Moreover, instead of using VIR_FREE() (which we are not exporting), I'll just go with bare free(). 1: https://www.redhat.com/archives/libvir-list/2014-September/msg00736.html 2: https://docs.python.org/2/c-api/memory.html Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
* Implement API bindings for virDomainBlockCopyv1.2.8Pavel Hrdina2014-09-021-0/+1
| | | | Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
* API: Implement bindings for virDomainListGetStatsPavel Hrdina2014-09-011-0/+1
| | | | | | | | Implement the function by returning a list of tuples instead the array of virDomainStatsRecords and store the typed parameters as dict. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
* API: Implement bindings for virConnectGetAllDomainStatsPeter Krempa2014-09-011-0/+1
| | | | | | | | Implement the function by returning a list of tuples instead the array of virDomainStatsRecords and store the typed parameters as dict. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
* API: Skip 'virDomainStatsRecordListFree'Peter Krempa2014-09-011-0/+1
| | | | | | | | The new API function doesn't make sense to be exported in python. The bindings will return native types instead of the struct array. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
* generator: resolve one level of enum referencePavel Hrdina2014-09-011-1/+15
| | | | | | | | | | | | | In the libvirt.h we have one enum defined by references from another enum and it leads in wrong order of definitons in python code. To prevent this we should resolve that references before we generate the python code. For now we have only one level of references so we will count with that in the generator but we should update it in the future to be more flexible. Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
* Implement new virNetworkGetDHCPLeases APIv1.2.6-rc2v1.2.6Nehal J Wani2014-06-271-0/+4
| | | | | | | | | | | | | | | | This API returns a list of DHCP leases for all network interfaces connected to the given virtual network or limited output just for one interface if mac is specified. Example Output: [{'iface': 'virbr3', 'ipaddr': '192.168.150.181', 'hostname': 'ubuntu14', 'expirytime': 1403737495L, 'prefix': 24, 'clientid': None, 'mac': '52:54:00:e8:73:eb', 'iaid': None, 'type': 0}, {'iface': 'virbr3', 'ipaddr': '2001:db8:ca2:2:1::bd', 'hostname': 'fedora20-test', 'expirytime': 1403738587L, 'prefix': 64, 'clientid': '00:04:b1:d8:86:42:e1:6a:aa:cf:d5:86:94:23:6f:94:04:cd', 'mac': '52:54:00:5b:40:98', 'iaid': '5980312', 'type': 1}] Signed-off-by: Peter Krempa <pkrempa@redhat.com>
* Implement new virNodeGetFreePages APIMichal Privoznik2014-06-201-0/+1
| | | | | | | | | | | | | | | | | | | | The API expose information on host's free pages counts. For easier access, in python this API returns a dictionary such as: In [4]: conn.getFreePages([2048,1*1024*1024], -1, 5) Out[4]: {-1: {2048: 114, 1048576: 4}, 0: {2048: 3, 1048576: 1}, 1: {2048: 100, 1048576: 1}, 2: {2048: 10, 1048576: 1}, 3: {2048: 1, 1048576: 1}} At the top level of the returned dictionary there's a pair of <NUMA node> and another dictionary that contains detailed information on each supported page size. The information then consists of fairs of <page size> and <count of free pages>. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
* Implement virDomain{Get,Set}Time APIsMichal Privoznik2014-05-201-0/+2
| | | | | | | | | While the setter can be generated automatically, the getter is not. However, it would be a lot easier if they both share the same logic: a python dictionary to represent the time: dict['seconds'] to represent seconds, and dict['nseconds'] to represent nanoseconds. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
* override: add virDomainFSFreeze and virDomainFSThaw APITomoki Sekiyama2014-05-161-0/+3
| | | | | | | | | | Add binding for the new virDomainFSFreeze and virDomainFSThaw functions added in libvirt 1.2.5. These require override since these take a list of mountpoints path string. The methods are named 'fsFreeze' and 'fsThaw'. Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
* qemu: support arbitrary monitor eventsEric Blake2014-03-251-8/+12
| | | | | | | | | | | | | | | | | | | | | | Wrap the new virConnectDomainQemuMonitorEventRegister function added in libvirt 1.2.3. This patch copies heavily from network events (commit 6ea5be0) and from event loop callbacks in libvirt-override.c, since in the libvirt_qemu module, we must expose top-level functions rather than class members. * generator.py (qemu_skip_function): Don't generate event code. (qemuBuildWrappers): Delay manual portion until after imports. * libvirt-qemu-override.py (qemuMonitorEventRegister) (qemuMonitorEventDeregister): New file. * libvirt-qemu-override.c (libvirt_qemu_virConnectDomainQemuMonitorEventFreeFunc) (libvirt_qemu_virConnectDomainQemuMonitorEventCallback) (libvirt_qemu_virConnectDomainQemuMonitorEventRegister) (libvirt_qemu_virConnectDomainQemuMonitorEventDeregister) (libvirt_qemu_lookupPythonFunc, getLibvirtQemuDictObject) (getLibvirtQemuModuleObject): New functions. Signed-off-by: Eric Blake <eblake@redhat.com>
* generator: Add virConnectDomainQemuMonitorEventCallback to skipped_typesMartin Kletzander2014-03-251-0/+1
| | | | Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
* generator: Skip exporting only sentinelsv1.2.2-rc2Martin Kletzander2014-02-201-5/+14
| | | | | | | | | | | | When enum type has '_LAST' in its name, but is not the last type in that enum, it's skipped even though it shouldn't be. Currently, this is the case for only VIR_NETWORK_UPDATE_COMMAND_ADD_LAST inside an enum virNetworkUpdateCommand. Also, since _LAST types can have other enums instead of values, that needs to be filtered out using a try-except when converting the value. Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
* Added python binding for the new network events APICédric Bosdonnat2013-12-111-0/+2
| | | | | | | The new network events code requires manual binding code to be written. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* generator: Sort enums and functions when generating codeDaniel P. Berrange2013-12-091-2/+8
| | | | | | | | To assist in diff comparisons between code generated with different versions of Python, do an explicit sort of all functions and enums. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* generator: Remove use of string.replace and string.find functionsDaniel P. Berrange2013-12-091-3/+3
| | | | | | | | Call the 'replace' and 'find' functions directly on the string variables, instead of via the 'string' module. Python3 only accepts the latter syntax Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* generator: Update to use sort() 'key' paramDaniel P. Berrange2013-12-091-22/+8
| | | | | | | The sort() method previously took either a comparator function or a key function. Only the latter is supported in Python3. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* generator: Remove use of 'has_key' functionDaniel P. Berrange2013-12-091-54/+54
| | | | | | | | | | | The code 'XXX.has_key(YYYY)' must be changed to be of the form 'YYY in XXXX' which works in Python2 and 3 As an added complication, if 'YYY in XXX' is used against an object overriding the '__getitem__' method it does not work in Python 2.4. Instead we must use 'YYY in XXX.keys()' Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Update exception catching in generated codeDoug Goldstein2013-12-051-4/+8
| | | | | | | | Use a syntax for exception handling that works in both Python 2 and Python 3. The new syntax is 'except Exception as e:' but this does not work in older Pythons so we use the most compatible way by just catching the exception and getting the type and the exception value after the fact.
* generator: Support exceptions in Python 2 and 3Doug Goldstein2013-12-051-2/+4
| | | | | Use a syntax for exception handling that works in both Python 2 and Python 3
* generator: Cast iterators to a list() explicitlyDaniel P. Berrange2013-12-041-19/+19
| | | | | | | In python3 various methods list 'dict.keys()' do not return a list, so we must explicitly cast the result. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Revert accidental change to exception handling syntaxDaniel P. Berrange2013-12-041-2/+2
| | | | | | | The previous commit changed the exception handling syntax to use 'as' instead of a ','. This doesn't work with python 2.4 Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* generator: Invoke print("...") instead of print "..."Daniel P. Berrange2013-12-041-21/+21
| | | | | | | The 'print' method must be called as a function in python3, ie with brackets. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* generator: Remove string.lower(XXX) with XXX.lower()Daniel P. Berrange2013-12-041-45/+45
| | | | | | | | | In python3 the string.lower() method doesn't exist, the lower() function can only be executed against a string variable directly. Python2 supported both approaches so this change is compatible Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* generator: Don't use 'list' as a variable nameDaniel P. Berrange2013-12-041-4/+4
| | | | | | | | In python3 if we use 'list' as a variable name it causes it to hide the corresponding 'list()' function from the entire function that holds the variable. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Skip copying manually written python for C APIs which don't existDaniel P. Berrange2013-11-281-1/+41
| | | | | | | | | | | | | | | | | | If the libvirt-override-virXXXX.py file has methods which call C APIs that don't exist in the version of libvirt built against we need to skip copying their code. eg for 0.9.13 libvirt we should not copy the 'listAllDomains' method. The way this works is that it breaks the override file into individual methods by looking for ' def '. It then collects the contents until the next method start, whereupon it looks for a libvirtmod.XXXXXX API call. It checks if the XXXXX part is present in the XML description we have, and if not, it discards the entire method. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Fix code for avoiding overrides of non-existant functionsDaniel P. Berrange2013-11-281-0/+6
| | | | | | | | | | | When reading/writing a global variable from inside a method it must be declared as a global, otherwise a local variable by the same name will be used. Special case the virConnectListDomainsID method which is bizarrely renamed for no obvious reason. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Deal with old filenames for events/error functionsDaniel P. Berrange2013-11-281-2/+5
| | | | | | | | | | Older libvirt has files named 'events' and 'virterror' rather than 'virevent' and 'virerror'. This is visible in the API XML files. We must look for both names to ensure we don't lose generation of methods with older versions of libvirt. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Add missing binding of security model/label APIsv1.2.0-rc2Daniel P. Berrange2013-11-271-3/+3
| | | | | | | | The virNodeGetSecurityModel, virDomainGetSecurityLabel and virDomainGetSecurityLabelList methods were disabled in the python binding for inexplicable reasons. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Avoid generating the methods in multiple classesDaniel P. Berrange2013-11-271-0/+2
| | | | | | | | | | | | | | | | | | | | | The python code generator tries to figure out what class a method should be in by looking at the list of arguments for any which are object types. Unfortunately missing break statements meant that methods which have multiple object arguments (eg migrate as a virDomainPtr followed by a virConnectPtr) got added to multiple classes. The following incorrect methods are removed by this change virStream.download (dup of virStorageVol.download) virStream.screenshot (dup of virDomain.screenshot) virStream.upload (dup of virStorageVol.upload) virConnect.migrate (dup of virDomain.migrate) virConnect.migrate2 (dup of virDomain.migrate2) virConnect.migrate3 (dup of virDomain.migrate3) virConnect.migrateToURI3 (dup of virDomain.migrateToURI3) Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Don't include virDomainSnapshotRef in python APIDaniel P. Berrange2013-11-271-1/+2
| | | | | | | The reference counting API is for internal use only. Attempts to use it from python application code will cause havoc. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Ensure API overrides only used if API existsDaniel P. Berrange2013-11-221-0/+15
| | | | | | | Entries in the -overrides.xml files should only be recorded if the API also exists in the main API XML file. Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
* Break generator.py to be called per moduleDoug Goldstein2013-11-221-12/+12
| | | | | | | Since we don't always want to build all the modules, and there might be more modules added in the future but we want to retain backwards compatibility with older libvirts, change generator.py to be called once per module instead of with all modules at once.
* Update generator for new code layoutDaniel P. Berrange2013-11-221-44/+25
| | | | | | | Change the generator.py to - Take XML API file names on command line - Generate data in build/ directory instead of cwd