Devel
Threads by month
- ----- 2025 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
November 2013
- 101 participants
- 301 discussions

[libvirt] [PATCH 00/22] Misc refactors and cleanups leading to gluster snapshot support
by Peter Krempa 25 Nov '13
by Peter Krempa 25 Nov '13
25 Nov '13
Peter Krempa (22):
conf: Implement virStorageVolType enum helper functions
test: Implement fake storage pool driver in qemuxml2argv test
qemuxml2argv: Add test to verify correct usage of disk type="volume"
qemuxml2argv: Add test for disk type='volume' with iSCSI pools
qemu: Refactor qemuTranslatePool source
qemu: Split out formatting of network disk source URI
qemu: Simplify call pattern of qemuBuildDriveURIString
qemu: Use qemuBuildNetworkDriveURI to handle http/ftp and friends
qemu: Migrate sheepdog source generation into common function
qemu: Split out NBD command generation
qemu: Unify formatting of RBD sources
qemu: Refactor disk source string formatting
conf: Support disk source formatting without needing a
virDomainDiskDefPtr
conf: Clean up virDomainDiskSourceDefFormatInternal
conf: Split out seclabel formating code for disk source
conf: Export disk source formatter and parser
snapshot: conf: Use common parsing and formatting functions for source
snapshot: conf: Fix NULL dereference when <driver> element is empty
conf: Add functions to copy and free network disk source definitions
qemu: snapshot: Detect internal snapshots also for sheepdog and RBD
conf: Add helper do clear disk source authentication struct
qemu: Clear old translated pool source
src/conf/domain_conf.c | 261 ++++++---
src/conf/domain_conf.h | 25 +
src/conf/snapshot_conf.c | 56 +-
src/conf/snapshot_conf.h | 1 +
src/conf/storage_conf.c | 4 +
src/conf/storage_conf.h | 2 +
src/libvirt_private.syms | 6 +
src/qemu/qemu_command.c | 650 +++++++++++----------
src/qemu/qemu_command.h | 6 +
src/qemu/qemu_conf.c | 129 ++--
src/qemu/qemu_conf.h | 2 +
src/qemu/qemu_driver.c | 3 +-
.../qemuxml2argv-disk-source-pool-mode.args | 10 +
.../qemuxml2argv-disk-source-pool-mode.xml | 4 +-
.../qemuxml2argv-disk-source-pool.args | 8 +
.../qemuxml2argv-disk-source-pool.xml | 2 +-
tests/qemuxml2argvtest.c | 166 ++++++
17 files changed, 874 insertions(+), 461 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool-mode.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.args
--
1.8.4.3
2
23

[libvirt] [PATCH libvirt-python] Update README file contents and add HACKING file
by Daniel P. Berrange 25 Nov '13
by Daniel P. Berrange 25 Nov '13
25 Nov '13
From: "Daniel P. Berrange" <berrange(a)redhat.com>
The previous README file from the python code is more like a
HACKING file. Rename it and update the content. Then add a
basic README file
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
HACKING | 37 +++++++++++++++++++++++++++++++++++++
README | 41 +++++++++++++++++++++--------------------
2 files changed, 58 insertions(+), 20 deletions(-)
create mode 100644 HACKING
diff --git a/HACKING b/HACKING
new file mode 100644
index 0000000..b0f037f
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,37 @@
+ libvirt Python Bindings Hacking
+ ===============================
+
+Most of the libvirt python binding code is automatically generated
+using the script generator.py, and the API description that the
+libvirt library installs into /usr/share (or wherever the following
+command says.
+
+ $ pkg-config --variable libvirt_api libvirt
+ /usr/share/libvirt/api/libvirt-api.xml
+
+
+Some of the API descriptions in the primary XML files are not directlry
+usable by the code generator. Thus there are overrides in
+
+ - libvirt-override-api.xml
+ - libvirt-qemu-override-api.xml
+ - libvirt-lxc-override-api.xml
+
+For stuff which the genrator can't cope with at all there are some
+hand written source files
+
+ - libvirt-override.c - low level binding to libvirt.so
+ - libvirt-qemu-override.c - low level binding to libvirt-qemu.so
+ - libvirt-lxc-override.c - low level binding to libvirt-lxc.so
+
+ - libvirt-override.py - high level overrides in the global namespace
+ - libvirt-override-virConnect.py - high level overrides in
+ the virConnect class
+ - libvirt-override-virDomain.py - high level overrides in
+ the virDomain class
+ - libvirt-override-virDomainSnapshot.py - high level overrides in
+ the virDomainSnapshot class
+ - libvirt-override-virStoragePool.py - high level overrides in
+ the virStoragePool class
+ - libvirt-override-virStream.py - high level overrides in
+ the virStream class
diff --git a/README b/README
index 02d4cc4..cadd2e4 100644
--- a/README
+++ b/README
@@ -1,27 +1,28 @@
- libvirt Python Bindings README
- ==============================
+ Libvirt Python Binding README
+ =============================
-Most of the libvirt python binding code is automatically generated
-using the script generator.py, and the API description from
-docs/libvirt-api.xml
+This package provides a python binding to the libvirt.so,
+libvirt-qemu.so and libvirt-lxc.so library APIs.
+It is written to build against any version of libvirt that
+is 0.9.11 or newer.
-Manually written files:
+This code is distributed under the terms of the LGPL version
+2 or later.
- - libvirt-override.c: methods where the C binding needs to be hand crafted
- - libvirt-override.py: global methods where the C and python bindings have different args
- - libvirt-override-api.xml: methods where the auto-extracted API docs are not
- suitable for python auto-generator. Overriding this if the method is going
- into libvirt-override.c, but we still want auto-generated libvirt-override.py
- - libvirt-override-virConnect.py: virConnect class methods
- - typewrappers.h,.c: Python object wrappers for each libvirt C object
+The module can be built by following the normal python module
+build processs
+ python setup.py build
+ sudo python setup.py install
-Auto-generated files:
+or to install as non-root
- - libvirt.py: The main python binding. Comprises auto-generated code, along
- with contents from libvirt-override.py and libvirt-override-virConnect.py
- - libvirt.c, libvirt.h: The C glue layer for the python binding. Comprises
- auto-generated code, along with libvirt-override.c
- - libvirt-export.c: List of auto-generated C methods, included into
- the libvirt-override.c method table
+ python setup.py build
+ python setup.py install --user
+
+
+Patches for this code should be sent to the main libvirt
+development mailing list
+
+ http://libvirt.org/contact.html#email
--
1.8.3.1
2
1
I got annoyed at having to use both 'virsh vol-list $pool --details'
AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated
the volume correctly. Since two-thirds of the data present in
virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(),
this just adds the remaining piece of information, as:
<volume type='...'>
...
</volume>
* docs/formatstorage.html.in: Document new <volume type=...>.
* docs/schemas/storagevol.rng (vol): Add it to RelaxNG.
* src/conf/storage_conf.h (virStorageVolTypeToString): Declare.
* src/conf/storage_conf.c (virStorageVolTargetDefFormat): Output
the metatype.
(virStorageVolDefParseXML): Parse it, for unit tests.
* tests/storagevolxml2xmlout/vol-*.xml: Update tests to match.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
v1: https://www.redhat.com/archives/libvir-list/2013-November/msg00955.html
Since then, delay 'network-dir' until later in gluster series,
change XML to <volume type='file'> instead of <volume><type>file</type>,
and use 1.2.0 instead of 1.1.5
docs/formatstorage.html.in | 10 +++++++---
docs/schemas/storagevol.rng | 10 ++++++++++
src/conf/storage_conf.c | 19 ++++++++++++++++++-
src/conf/storage_conf.h | 1 +
tests/storagevolxml2xmlin/vol-logical-backing.xml | 2 +-
tests/storagevolxml2xmlin/vol-logical.xml | 2 +-
tests/storagevolxml2xmlin/vol-partition.xml | 2 +-
tests/storagevolxml2xmlin/vol-sheepdog.xml | 2 +-
tests/storagevolxml2xmlout/vol-file-backing.xml | 2 +-
tests/storagevolxml2xmlout/vol-file-naming.xml | 2 +-
tests/storagevolxml2xmlout/vol-file.xml | 2 +-
tests/storagevolxml2xmlout/vol-logical-backing.xml | 2 +-
tests/storagevolxml2xmlout/vol-logical.xml | 2 +-
tests/storagevolxml2xmlout/vol-partition.xml | 2 +-
tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml | 2 +-
tests/storagevolxml2xmlout/vol-qcow2-1.1.xml | 2 +-
tests/storagevolxml2xmlout/vol-qcow2-lazy.xml | 2 +-
tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml | 2 +-
tests/storagevolxml2xmlout/vol-qcow2.xml | 2 +-
tests/storagevolxml2xmlout/vol-sheepdog.xml | 2 +-
20 files changed, 52 insertions(+), 20 deletions(-)
diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in
index 90eeaa3..c90d7b1 100644
--- a/docs/formatstorage.html.in
+++ b/docs/formatstorage.html.in
@@ -283,14 +283,18 @@
<h2><a name="StorageVol">Storage volume XML</a></h2>
<p>
- A storage volume will be either a file or a device node.
- The storage volume XML format is available <span class="since">since 0.4.1</span>
+ A storage volume will generally be either a file or a device
+ node; <span class="since">since 1.2.0</span>, an optional
+ output-only attribute <code>type</code> lists the actual type
+ (file, block, dir, or network), which is also available
+ from <code>virStorageVolGetInfo()</code>. The storage volume
+ XML format is available <span class="since">since 0.4.1</span>
</p>
<h3><a name="StorageVolFirst">General metadata</a></h3>
<pre>
- <volume>
+ <volume type='file'>
<name>sparse.img</name>
<key>/var/lib/xen/images/sparse.img</key>
<allocation>0</allocation>
diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng
index e79bc35..f8081d9 100644
--- a/docs/schemas/storagevol.rng
+++ b/docs/schemas/storagevol.rng
@@ -13,6 +13,16 @@
<define name='vol'>
<element name='volume'>
+ <optional>
+ <attribute name='type'>
+ <choice>
+ <value>file</value>
+ <value>block</value>
+ <value>dir</value>
+ <value>network</value>
+ </choice>
+ </attribute>
+ </optional>
<interleave>
<element name='name'>
<ref name='volName'/>
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 8b378c2..0cd80c3 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -51,6 +51,10 @@
#define DEFAULT_POOL_PERM_MODE 0755
#define DEFAULT_VOL_PERM_MODE 0600
+VIR_ENUM_IMPL(virStorageVol,
+ VIR_STORAGE_VOL_LAST,
+ "file", "block", "dir", "network")
+
VIR_ENUM_IMPL(virStoragePool,
VIR_STORAGE_POOL_LAST,
"dir", "fs", "netfs",
@@ -1253,6 +1257,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
{
virStorageVolDefPtr ret;
virStorageVolOptionsPtr options;
+ char *type = NULL;
char *allocation = NULL;
char *capacity = NULL;
char *unit = NULL;
@@ -1278,6 +1283,16 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
/* Normally generated by pool refresh, but useful for unit tests */
ret->key = virXPathString("string(./key)", ctxt);
+ /* Technically overridden by pool refresh, but useful for unit tests */
+ type = virXPathString("string(./@type)", ctxt);
+ if (type) {
+ if ((ret->type = virStorageVolTypeFromString(type)) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("unknown volume type '%s'"), type);
+ goto error;
+ }
+ }
+
capacity = virXPathString("string(./capacity)", ctxt);
unit = virXPathString("string(./capacity/@unit)", ctxt);
if (capacity == NULL) {
@@ -1394,6 +1409,7 @@ cleanup:
VIR_FREE(allocation);
VIR_FREE(capacity);
VIR_FREE(unit);
+ VIR_FREE(type);
return ret;
error:
@@ -1563,7 +1579,8 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool,
if (options == NULL)
return NULL;
- virBufferAddLit(&buf, "<volume>\n");
+ virBufferAsprintf(&buf, "<volume type='%s'>\n",
+ virStorageVolTypeToString(def->type));
virBufferEscapeString(&buf, " <name>%s</name>\n", def->name);
virBufferEscapeString(&buf, " <key>%s</key>\n", def->key);
virBufferAddLit(&buf, " <source>\n");
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index f062bd8..c4dd403 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -116,6 +116,7 @@ struct _virStorageVolDefList {
virStorageVolDefPtr *objs;
};
+VIR_ENUM_DECL(virStorageVol)
enum virStoragePoolType {
VIR_STORAGE_POOL_DIR, /* Local directory */
diff --git a/tests/storagevolxml2xmlin/vol-logical-backing.xml b/tests/storagevolxml2xmlin/vol-logical-backing.xml
index b4141a5..38ff8c5 100644
--- a/tests/storagevolxml2xmlin/vol-logical-backing.xml
+++ b/tests/storagevolxml2xmlin/vol-logical-backing.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
<name>Swap</name>
<key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
<source>
diff --git a/tests/storagevolxml2xmlin/vol-logical.xml b/tests/storagevolxml2xmlin/vol-logical.xml
index cd4d3f7..46a607a 100644
--- a/tests/storagevolxml2xmlin/vol-logical.xml
+++ b/tests/storagevolxml2xmlin/vol-logical.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
<name>Swap</name>
<key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
<source>
diff --git a/tests/storagevolxml2xmlin/vol-partition.xml b/tests/storagevolxml2xmlin/vol-partition.xml
index 6990bb5..d810fff 100644
--- a/tests/storagevolxml2xmlin/vol-partition.xml
+++ b/tests/storagevolxml2xmlin/vol-partition.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
<name>sda1</name>
<key>/dev/sda1</key>
<source>
diff --git a/tests/storagevolxml2xmlin/vol-sheepdog.xml b/tests/storagevolxml2xmlin/vol-sheepdog.xml
index 49e221c..d6e920b 100644
--- a/tests/storagevolxml2xmlin/vol-sheepdog.xml
+++ b/tests/storagevolxml2xmlin/vol-sheepdog.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='network'>
<name>test2</name>
<source>
</source>
diff --git a/tests/storagevolxml2xmlout/vol-file-backing.xml b/tests/storagevolxml2xmlout/vol-file-backing.xml
index 8d2fb57..cd33bee 100644
--- a/tests/storagevolxml2xmlout/vol-file-backing.xml
+++ b/tests/storagevolxml2xmlout/vol-file-backing.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name>sparse.img</name>
<key>/var/lib/libvirt/images/sparse.img</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-file-naming.xml b/tests/storagevolxml2xmlout/vol-file-naming.xml
index 7022b02..e515502 100644
--- a/tests/storagevolxml2xmlout/vol-file-naming.xml
+++ b/tests/storagevolxml2xmlout/vol-file-naming.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name><sparse>.img</name>
<source>
</source>
diff --git a/tests/storagevolxml2xmlout/vol-file.xml b/tests/storagevolxml2xmlout/vol-file.xml
index b97dd50..2923188 100644
--- a/tests/storagevolxml2xmlout/vol-file.xml
+++ b/tests/storagevolxml2xmlout/vol-file.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name>sparse.img</name>
<source>
</source>
diff --git a/tests/storagevolxml2xmlout/vol-logical-backing.xml b/tests/storagevolxml2xmlout/vol-logical-backing.xml
index bf34b08..07fe277 100644
--- a/tests/storagevolxml2xmlout/vol-logical-backing.xml
+++ b/tests/storagevolxml2xmlout/vol-logical-backing.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
<name>Swap</name>
<key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-logical.xml b/tests/storagevolxml2xmlout/vol-logical.xml
index e9b4e4b..0df5cc0 100644
--- a/tests/storagevolxml2xmlout/vol-logical.xml
+++ b/tests/storagevolxml2xmlout/vol-logical.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
<name>Swap</name>
<key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-partition.xml b/tests/storagevolxml2xmlout/vol-partition.xml
index 9be1cf1..147899e 100644
--- a/tests/storagevolxml2xmlout/vol-partition.xml
+++ b/tests/storagevolxml2xmlout/vol-partition.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
<name>sda1</name>
<key>/dev/sda1</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
index fd3d606..1f799da 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name>OtherDemo.img</name>
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
index 99fb5ac..14f805f 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name>OtherDemo.img</name>
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
index 3708ea7..68a9756 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name>OtherDemo.img</name>
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
index f6a2e21..075dc69 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name>OtherDemo.img</name>
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2.xml b/tests/storagevolxml2xmlout/vol-qcow2.xml
index b9adcb4..31dc578 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
<name>OtherDemo.img</name>
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
diff --git a/tests/storagevolxml2xmlout/vol-sheepdog.xml b/tests/storagevolxml2xmlout/vol-sheepdog.xml
index bd5d6d8..e08e36c 100644
--- a/tests/storagevolxml2xmlout/vol-sheepdog.xml
+++ b/tests/storagevolxml2xmlout/vol-sheepdog.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='network'>
<name>test2</name>
<source>
</source>
--
1.8.3.1
3
3

25 Nov '13
From: "Daniel P. Berrange" <berrange(a)redhat.com>
The 'docs/examples' code was long ago removed and now the
python code was gone too, the custom 'tests' makefile target
serves no purpopse
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
Makefile.am | 3 ---
1 file changed, 3 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 957aa9f..d7ddd9d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -71,9 +71,6 @@ rpm: clean
check-local: all tests
-tests:
- @(cd docs/examples ; $(MAKE) MAKEFLAGS+=--silent tests)
-
cov: clean-cov
mkdir $(top_builddir)/coverage
$(LCOV) -c -o $(top_builddir)/coverage/libvirt.info.tmp \
--
1.8.3.1
2
1
I got annoyed at having to use both 'virsh vol-list $pool --details'
AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated
the volume correctly. Since two-thirds of the data present in
virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(),
this just adds the remaining piece of information.
* docs/formatstorage.html.in: Document new <target type=...>.
* docs/schemas/storagevol.rng (target, backingStore): Add it to
RelaxNG.
* src/conf/storage_conf.h (virStorageVolTypeToString): Declare.
* src/conf/storage_conf.c (virStorageVolTargetDefFormat): Output
the metatype.
* tests/storagevolxml2xmlout/vol-*.xml: Update tests to match.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
Depends on:
https://www.redhat.com/archives/libvir-list/2013-November/msg00948.html
docs/formatstorage.html.in | 5 +++++
docs/schemas/storagevol.rng | 15 +++++++++++++++
src/conf/storage_conf.c | 18 ++++++++++++++++++
src/conf/storage_conf.h | 1 +
tests/storagevolxml2xmlin/vol-logical-backing.xml | 1 +
tests/storagevolxml2xmlin/vol-logical.xml | 1 +
tests/storagevolxml2xmlin/vol-partition.xml | 1 +
tests/storagevolxml2xmlin/vol-sheepdog.xml | 1 +
tests/storagevolxml2xmlout/vol-file-backing.xml | 1 +
tests/storagevolxml2xmlout/vol-file-naming.xml | 1 +
tests/storagevolxml2xmlout/vol-file.xml | 1 +
tests/storagevolxml2xmlout/vol-logical-backing.xml | 1 +
tests/storagevolxml2xmlout/vol-logical.xml | 1 +
tests/storagevolxml2xmlout/vol-partition.xml | 1 +
tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml | 1 +
tests/storagevolxml2xmlout/vol-qcow2-1.1.xml | 1 +
tests/storagevolxml2xmlout/vol-qcow2-lazy.xml | 1 +
tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml | 1 +
tests/storagevolxml2xmlout/vol-qcow2.xml | 1 +
tests/storagevolxml2xmlout/vol-sheepdog.xml | 1 +
20 files changed, 55 insertions(+)
diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in
index 90eeaa3..5f277b4 100644
--- a/docs/formatstorage.html.in
+++ b/docs/formatstorage.html.in
@@ -293,6 +293,7 @@
<volume>
<name>sparse.img</name>
<key>/var/lib/xen/images/sparse.img</key>
+ <type>file</type>
<allocation>0</allocation>
<capacity unit="T">1</capacity>
...</pre>
@@ -305,6 +306,10 @@
<dd>Providing an identifier for the volume which is globally unique.
This cannot be set when creating a volume: it is always generated.
<span class="since">Since 0.4.1</span></dd>
+ <dt><code>type</code></dt>
+ <dd>Output-only; provides the volume type that is also available
+ from <code>virStorageVolGetInfo()</code>. <span class="since">Since
+ 1.1.5</span></dd>
<dt><code>allocation</code></dt>
<dd>Providing the total storage allocation for the volume. This
may be smaller than the logical capacity if the volume is sparsely
diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng
index e79bc35..96572c5 100644
--- a/docs/schemas/storagevol.rng
+++ b/docs/schemas/storagevol.rng
@@ -25,6 +25,9 @@
<optional>
<ref name='source'/>
</optional>
+ <optional>
+ <ref name='voltype'/>
+ </optional>
<ref name='sizing'/>
<ref name='target'/>
<optional>
@@ -34,6 +37,18 @@
</element>
</define>
+ <define name='voltype'>
+ <element name='type'>
+ <choice>
+ <value>file</value>
+ <value>block</value>
+ <value>dir</value>
+ <value>network</value>
+ <value>network-dir</value>
+ </choice>
+ </element>
+ </define>
+
<define name='sizing'>
<interleave>
<optional>
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 8b378c2..0d2932b 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -51,6 +51,10 @@
#define DEFAULT_POOL_PERM_MODE 0755
#define DEFAULT_VOL_PERM_MODE 0600
+VIR_ENUM_IMPL(virStorageVol,
+ VIR_STORAGE_VOL_LAST,
+ "file", "block", "dir", "network")
+
VIR_ENUM_IMPL(virStoragePool,
VIR_STORAGE_POOL_LAST,
"dir", "fs", "netfs",
@@ -1253,6 +1257,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
{
virStorageVolDefPtr ret;
virStorageVolOptionsPtr options;
+ char *type = NULL;
char *allocation = NULL;
char *capacity = NULL;
char *unit = NULL;
@@ -1278,6 +1283,16 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
/* Normally generated by pool refresh, but useful for unit tests */
ret->key = virXPathString("string(./key)", ctxt);
+ /* Technically overridden by pool refresh, but useful for unit tests */
+ type = virXPathString("string(./type)", ctxt);
+ if (type) {
+ if ((ret->type = virStorageVolTypeFromString(type)) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("unknown volume type '%s'"), type);
+ goto error;
+ }
+ }
+
capacity = virXPathString("string(./capacity)", ctxt);
unit = virXPathString("string(./capacity/@unit)", ctxt);
if (capacity == NULL) {
@@ -1394,6 +1409,7 @@ cleanup:
VIR_FREE(allocation);
VIR_FREE(capacity);
VIR_FREE(unit);
+ VIR_FREE(type);
return ret;
error:
@@ -1592,6 +1608,8 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool,
}
virBufferAddLit(&buf, " </source>\n");
+ virBufferAsprintf(&buf, " <type>%s</type>\n",
+ virStorageVolTypeToString(def->type));
virBufferAsprintf(&buf, " <capacity unit='bytes'>%llu</capacity>\n",
def->capacity);
virBufferAsprintf(&buf, " <allocation unit='bytes'>%llu</allocation>\n",
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index f062bd8..c4dd403 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -116,6 +116,7 @@ struct _virStorageVolDefList {
virStorageVolDefPtr *objs;
};
+VIR_ENUM_DECL(virStorageVol)
enum virStoragePoolType {
VIR_STORAGE_POOL_DIR, /* Local directory */
diff --git a/tests/storagevolxml2xmlin/vol-logical-backing.xml b/tests/storagevolxml2xmlin/vol-logical-backing.xml
index b4141a5..d1a7b61 100644
--- a/tests/storagevolxml2xmlin/vol-logical-backing.xml
+++ b/tests/storagevolxml2xmlin/vol-logical-backing.xml
@@ -6,6 +6,7 @@
<extent start='31440502784' end='33520877568'/>
</device>
</source>
+ <type>block</type>
<capacity>2080374784</capacity>
<allocation>2080374784</allocation>
<target>
diff --git a/tests/storagevolxml2xmlin/vol-logical.xml b/tests/storagevolxml2xmlin/vol-logical.xml
index cd4d3f7..f98ff76 100644
--- a/tests/storagevolxml2xmlin/vol-logical.xml
+++ b/tests/storagevolxml2xmlin/vol-logical.xml
@@ -6,6 +6,7 @@
<extent start='31440502784' end='33520877568'/>
</device>
</source>
+ <type>block</type>
<capacity>2080374784</capacity>
<allocation>2080374784</allocation>
<target>
diff --git a/tests/storagevolxml2xmlin/vol-partition.xml b/tests/storagevolxml2xmlin/vol-partition.xml
index 6990bb5..d699635 100644
--- a/tests/storagevolxml2xmlin/vol-partition.xml
+++ b/tests/storagevolxml2xmlin/vol-partition.xml
@@ -6,6 +6,7 @@
<extent start='32256' end='106928640'/>
</device>
</source>
+ <type>block</type>
<capacity>106896384</capacity>
<allocation>106896384</allocation>
<target>
diff --git a/tests/storagevolxml2xmlin/vol-sheepdog.xml b/tests/storagevolxml2xmlin/vol-sheepdog.xml
index 49e221c..64884b2 100644
--- a/tests/storagevolxml2xmlin/vol-sheepdog.xml
+++ b/tests/storagevolxml2xmlin/vol-sheepdog.xml
@@ -2,6 +2,7 @@
<name>test2</name>
<source>
</source>
+ <type>network</type>
<capacity unit='bytes'>1024</capacity>
<allocation unit='bytes'>0</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-file-backing.xml b/tests/storagevolxml2xmlout/vol-file-backing.xml
index 8d2fb57..ca0598d 100644
--- a/tests/storagevolxml2xmlout/vol-file-backing.xml
+++ b/tests/storagevolxml2xmlout/vol-file-backing.xml
@@ -3,6 +3,7 @@
<key>/var/lib/libvirt/images/sparse.img</key>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>10000000000</capacity>
<allocation unit='bytes'>0</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-file-naming.xml b/tests/storagevolxml2xmlout/vol-file-naming.xml
index 7022b02..4ca40ba 100644
--- a/tests/storagevolxml2xmlout/vol-file-naming.xml
+++ b/tests/storagevolxml2xmlout/vol-file-naming.xml
@@ -2,6 +2,7 @@
<name><sparse>.img</name>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>1099511627776</capacity>
<allocation unit='bytes'>0</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-file.xml b/tests/storagevolxml2xmlout/vol-file.xml
index b97dd50..05ffa49 100644
--- a/tests/storagevolxml2xmlout/vol-file.xml
+++ b/tests/storagevolxml2xmlout/vol-file.xml
@@ -2,6 +2,7 @@
<name>sparse.img</name>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>1099511627776</capacity>
<allocation unit='bytes'>0</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-logical-backing.xml b/tests/storagevolxml2xmlout/vol-logical-backing.xml
index bf34b08..5f52ee6 100644
--- a/tests/storagevolxml2xmlout/vol-logical-backing.xml
+++ b/tests/storagevolxml2xmlout/vol-logical-backing.xml
@@ -3,6 +3,7 @@
<key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
<source>
</source>
+ <type>block</type>
<capacity unit='bytes'>2080374784</capacity>
<allocation unit='bytes'>2080374784</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-logical.xml b/tests/storagevolxml2xmlout/vol-logical.xml
index e9b4e4b..f8ed510 100644
--- a/tests/storagevolxml2xmlout/vol-logical.xml
+++ b/tests/storagevolxml2xmlout/vol-logical.xml
@@ -3,6 +3,7 @@
<key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
<source>
</source>
+ <type>block</type>
<capacity unit='bytes'>2080374784</capacity>
<allocation unit='bytes'>2080374784</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-partition.xml b/tests/storagevolxml2xmlout/vol-partition.xml
index 9be1cf1..712b7b0 100644
--- a/tests/storagevolxml2xmlout/vol-partition.xml
+++ b/tests/storagevolxml2xmlout/vol-partition.xml
@@ -3,6 +3,7 @@
<key>/dev/sda1</key>
<source>
</source>
+ <type>block</type>
<capacity unit='bytes'>106896384</capacity>
<allocation unit='bytes'>106896384</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
index fd3d606..3447689 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
@@ -3,6 +3,7 @@
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>5368709120</capacity>
<allocation unit='bytes'>294912</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
index 99fb5ac..4157628 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
@@ -3,6 +3,7 @@
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>5368709120</capacity>
<allocation unit='bytes'>294912</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
index 3708ea7..7b29c02 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
@@ -3,6 +3,7 @@
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>5368709120</capacity>
<allocation unit='bytes'>294912</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
index f6a2e21..ebf79ed 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
@@ -3,6 +3,7 @@
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>5368709120</capacity>
<allocation unit='bytes'>294912</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2.xml b/tests/storagevolxml2xmlout/vol-qcow2.xml
index b9adcb4..75f0dcf 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2.xml
@@ -3,6 +3,7 @@
<key>/var/lib/libvirt/images/OtherDemo.img</key>
<source>
</source>
+ <type>file</type>
<capacity unit='bytes'>5368709120</capacity>
<allocation unit='bytes'>294912</allocation>
<target>
diff --git a/tests/storagevolxml2xmlout/vol-sheepdog.xml b/tests/storagevolxml2xmlout/vol-sheepdog.xml
index bd5d6d8..182c841 100644
--- a/tests/storagevolxml2xmlout/vol-sheepdog.xml
+++ b/tests/storagevolxml2xmlout/vol-sheepdog.xml
@@ -2,6 +2,7 @@
<name>test2</name>
<source>
</source>
+ <type>network</type>
<capacity unit='bytes'>1024</capacity>
<allocation unit='bytes'>0</allocation>
<target>
--
1.8.3.1
3
4

[libvirt] [PATCH] spec: Don't save/restore running VMs on libvirt-client update
by Jiri Denemark 25 Nov '13
by Jiri Denemark 25 Nov '13
25 Nov '13
The previous attempt (commit d65e0e1) removed just one of two
libvirt-guests restarts that happened on libvirt-client update. Let's
remove the last one too :-)
https://bugzilla.redhat.com/show_bug.cgi?id=962225
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
libvirt.spec.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index bbce8b5..d11b11f 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1706,7 +1706,7 @@ fi
/sbin/ldconfig
%if %{with_systemd}
%if %{with_systemd_macros}
- %systemd_postun_with_restart libvirt-guests.service
+ %systemd_postun libvirt-guests.service
%endif
%triggerun client -- libvirt < 0.9.4
%{_bindir}/systemd-sysv-convert --save libvirt-guests >/dev/null 2>&1 ||:
--
1.8.4.4
2
2
No other hits for:
git grep '1\.1\.5'
* libvirt-utils.h: Fix comment.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
Pushing under the trivial rule (and as a test that the new
python repo is set up correctly).
libvirt-utils.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libvirt-utils.h b/libvirt-utils.h
index 0517f9c..f55be7b 100644
--- a/libvirt-utils.h
+++ b/libvirt-utils.h
@@ -29,7 +29,7 @@
# endif
/**
- * libvirt.h provides this as of version 1.1.5, but we want to be able
+ * libvirt.h provides this as of version 1.2.0, but we want to be able
* to support older versions of libvirt so copy and paste the macro from
* libvirt.h
*/
--
1.8.3.1
1
0

[libvirt] [PATCH v4] virsh domxml-from-native to treat SCSI as the bus type for pseries by default
by Shivaprasad G Bhat 25 Nov '13
by Shivaprasad G Bhat 25 Nov '13
25 Nov '13
The bus type IDE being enum Zero, the bus type on pseries system appears as IDE for all the -hda/-cdrom and for disk drives with if="none" type. Pseries platform needs this to appear as SCSI instead of IDE. The ide being not supported, the explicit requests for ide devices will return an error.
Signed-off-by: Shivaprasad G Bhat <sbhat(a)linux.vnet.ibm.com>
---
src/qemu/qemu_command.c | 25 +++++++++++--
tests/qemuargv2xmltest.c | 1 +
.../qemuxml2argv-pseries-disk.args | 5 +++
.../qemuxml2argvdata/qemuxml2argv-pseries-disk.xml | 40 ++++++++++++++++++++
4 files changed, 67 insertions(+), 4 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 8dc7e43..01fe45b 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -10032,6 +10032,7 @@ error:
static virDomainDiskDefPtr
qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
const char *val,
+ virDomainDefPtr dom,
int nvirtiodisk,
bool old_style_ceph_args)
{
@@ -10055,7 +10056,11 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
if (VIR_ALLOC(def) < 0)
goto cleanup;
- def->bus = VIR_DOMAIN_DISK_BUS_IDE;
+ if (((dom->os.arch == VIR_ARCH_PPC64) &&
+ dom->os.machine && STREQ(dom->os.machine, "pseries")))
+ def->bus = VIR_DOMAIN_DISK_BUS_SCSI;
+ else
+ def->bus = VIR_DOMAIN_DISK_BUS_IDE;
def->device = VIR_DOMAIN_DISK_DEVICE_DISK;
def->type = VIR_DOMAIN_DISK_TYPE_FILE;
@@ -10140,9 +10145,15 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
def->type = VIR_DOMAIN_DISK_TYPE_FILE;
}
} else if (STREQ(keywords[i], "if")) {
- if (STREQ(values[i], "ide"))
+ if (STREQ(values[i], "ide")) {
def->bus = VIR_DOMAIN_DISK_BUS_IDE;
- else if (STREQ(values[i], "scsi"))
+ if (((dom->os.arch == VIR_ARCH_PPC64) &&
+ dom->os.machine && STREQ(dom->os.machine, "pseries"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("pseries systems do not support ide devices '%s'"), val);
+ goto error;
+ }
+ } else if (STREQ(values[i], "scsi"))
def->bus = VIR_DOMAIN_DISK_BUS_SCSI;
else if (STREQ(values[i], "virtio"))
def->bus = VIR_DOMAIN_DISK_BUS_VIRTIO;
@@ -11368,6 +11379,9 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
if (STREQ(arg, "-cdrom")) {
disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
+ if (((def->os.arch == VIR_ARCH_PPC64) &&
+ def->os.machine && STREQ(def->os.machine, "pseries")))
+ disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
if (VIR_STRDUP(disk->dst, "hdc") < 0)
goto error;
disk->readonly = true;
@@ -11381,6 +11395,9 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
else
disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
+ if (((def->os.arch == VIR_ARCH_PPC64) &&
+ def->os.machine && STREQ(def->os.machine, "pseries")))
+ disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
}
if (VIR_STRDUP(disk->dst, arg + 1) < 0)
goto error;
@@ -11672,7 +11689,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
}
} else if (STREQ(arg, "-drive")) {
WANT_VALUE();
- if (!(disk = qemuParseCommandLineDisk(xmlopt, val,
+ if (!(disk = qemuParseCommandLineDisk(xmlopt, val, def,
nvirtiodisk,
ceph_args != NULL)))
goto error;
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
index 6dd8bb0..0bf4c37 100644
--- a/tests/qemuargv2xmltest.c
+++ b/tests/qemuargv2xmltest.c
@@ -249,6 +249,7 @@ mymain(void)
DO_TEST("hyperv");
DO_TEST("pseries-nvram");
+ DO_TEST("pseries-disk");
DO_TEST("nosharepages");
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args
new file mode 100644
index 0000000..5fc0938
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.args
@@ -0,0 +1,5 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-ppc64 \
+-S -M pseries -m 512 -smp 1 \
+-no-acpi -boot c -usb \
+-boot c -hda /dev/HostVG/QEMUGuest1 -cdrom /root/boot.iso
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
new file mode 100644
index 0000000..dbbd6aa
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
@@ -0,0 +1,40 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>87eedafe-eedc-4336-8130-ed9fe5dc90c8</uuid>
+ <memory unit='KiB'>524288</memory>
+ <currentMemory unit='KiB'>524288</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ <disk type='block' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='scsi'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/root/boot.iso'/>
+ <target dev='hdc' bus='scsi'/>
+ <readonly/>
+ <address type='drive' controller='0' bus='0' target='0' unit='2'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='scsi' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <graphics type='sdl'/>
+ <video>
+ <model type='cirrus' vram='9216' heads='1'/>
+ </video>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
2
1
From: "Daniel P. Berrange" <berrange(a)redhat.com>
The python binding now lives in
http://libvirt.org/git/libvirt-python.git
that repo also provides an RPM which is upgrade compatible
with the old libvirt-python sub-RPM.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
.gitignore | 11 -
Makefile.am | 7 +-
autobuild.sh | 6 +-
cfg.mk | 7 +-
configure.ac | 86 -
examples/domain-events/events-python/event-test.py | 591 --
examples/python/Makefile.am | 21 -
examples/python/README | 33 -
examples/python/consolecallback.py | 88 -
examples/python/dominfo.py | 80 -
examples/python/domrestore.py | 36 -
examples/python/domsave.py | 40 -
examples/python/domstart.py | 50 -
examples/python/esxlist.py | 155 -
examples/python/topology.py | 45 -
libvirt.spec.in | 36 +-
m4/virt-compile-warnings.m4 | 8 -
mingw-libvirt.spec.in | 1 -
python/Makefile.am | 173 -
python/README | 27 -
python/generator.py | 1976 ------
python/libvirt-lxc-override-api.xml | 19 -
python/libvirt-lxc-override.c | 142 -
python/libvirt-override-api.xml | 613 --
python/libvirt-override-virConnect.py | 351 -
python/libvirt-override-virDomain.py | 49 -
python/libvirt-override-virDomainSnapshot.py | 19 -
python/libvirt-override-virStoragePool.py | 11 -
python/libvirt-override-virStream.py | 125 -
python/libvirt-override.c | 7379 --------------------
python/libvirt-override.py | 209 -
python/libvirt-qemu-override-api.xml | 20 -
python/libvirt-qemu-override.c | 154 -
python/sanitytest.py | 36 -
python/typewrappers.c | 524 --
python/typewrappers.h | 239 -
run.in | 9 -
37 files changed, 7 insertions(+), 13369 deletions(-)
delete mode 100644 examples/domain-events/events-python/event-test.py
delete mode 100644 examples/python/Makefile.am
delete mode 100644 examples/python/README
delete mode 100644 examples/python/consolecallback.py
delete mode 100755 examples/python/dominfo.py
delete mode 100755 examples/python/domrestore.py
delete mode 100755 examples/python/domsave.py
delete mode 100755 examples/python/domstart.py
delete mode 100755 examples/python/esxlist.py
delete mode 100755 examples/python/topology.py
delete mode 100644 python/Makefile.am
delete mode 100644 python/README
delete mode 100755 python/generator.py
delete mode 100644 python/libvirt-lxc-override-api.xml
delete mode 100644 python/libvirt-lxc-override.c
delete mode 100644 python/libvirt-override-api.xml
delete mode 100644 python/libvirt-override-virConnect.py
delete mode 100644 python/libvirt-override-virDomain.py
delete mode 100644 python/libvirt-override-virDomainSnapshot.py
delete mode 100644 python/libvirt-override-virStoragePool.py
delete mode 100644 python/libvirt-override-virStream.py
delete mode 100644 python/libvirt-override.c
delete mode 100644 python/libvirt-override.py
delete mode 100644 python/libvirt-qemu-override-api.xml
delete mode 100644 python/libvirt-qemu-override.c
delete mode 100644 python/sanitytest.py
delete mode 100644 python/typewrappers.c
delete mode 100644 python/typewrappers.h
diff --git a/.gitignore b/.gitignore
index 6b024e7..faabd33 100644
--- a/.gitignore
+++ b/.gitignore
@@ -91,17 +91,6 @@
/mkinstalldirs
/po/*
/proxy/
-/python/generated.stamp
-/python/generator.py.stamp
-/python/libvirt-export.c
-/python/libvirt-lxc-export.c
-/python/libvirt-lxc.[ch]
-/python/libvirt-qemu-export.c
-/python/libvirt-qemu.[ch]
-/python/libvirt.[ch]
-/python/libvirt.py
-/python/libvirt_lxc.py
-/python/libvirt_qemu.py
/run
/sc_*
/src/.*.stamp
diff --git a/Makefile.am b/Makefile.am
index 192a378..957aa9f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -20,8 +20,8 @@ LCOV = lcov
GENHTML = genhtml
SUBDIRS = . gnulib/lib include src daemon tools docs gnulib/tests \
- python tests po examples/domain-events/events-c examples/hellolibvirt \
- examples/dominfo examples/domsuspend examples/python examples/apparmor \
+ tests po examples/domain-events/events-c examples/hellolibvirt \
+ examples/dominfo examples/domsuspend examples/apparmor \
examples/xml/nwfilter examples/openauth examples/systemtap
ACLOCAL_AMFLAGS = -I m4
@@ -40,7 +40,6 @@ EXTRA_DIST = \
Makefile.nonreentrant \
autogen.sh \
cfg.mk \
- examples/domain-events/events-python \
run.in \
AUTHORS.in \
$(XML_EXAMPLES)
@@ -74,8 +73,6 @@ check-local: all tests
tests:
@(cd docs/examples ; $(MAKE) MAKEFLAGS+=--silent tests)
- @(if [ "$(pythondir)" != "" ] ; then cd python ; \
- $(MAKE) MAKEFLAGS+=--silent tests ; fi)
cov: clean-cov
mkdir $(top_builddir)/coverage
diff --git a/autobuild.sh b/autobuild.sh
index 3109b49..f682b51 100755
--- a/autobuild.sh
+++ b/autobuild.sh
@@ -86,8 +86,7 @@ if test -x /usr/bin/i686-w64-mingw32-gcc ; then
--prefix="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw" \
--enable-expensive-tests \
--enable-werror \
- --without-libvirtd \
- --without-python
+ --without-libvirtd
make
make install
@@ -107,8 +106,7 @@ if test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
--prefix="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw" \
--enable-expensive-tests \
--enable-werror \
- --without-libvirtd \
- --without-python
+ --without-libvirtd
make
make install
diff --git a/cfg.mk b/cfg.mk
index befd231..bd3dd48 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -958,14 +958,11 @@ exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
exclude_file_name_regexp--sc_prohibit_access_xok = ^src/util/virutil\.c$$
-exclude_file_name_regexp--sc_prohibit_always_true_header_tests = \
- ^python/(libvirt-(lxc-|qemu-)?override|typewrappers)\.c$$
-
exclude_file_name_regexp--sc_prohibit_asprintf = \
^(bootstrap.conf$$|src/util/virstring\.[ch]$$|examples/domain-events/events-c/event-test\.c$$|tests/vircgroupmock\.c$$)
exclude_file_name_regexp--sc_prohibit_strdup = \
- ^(docs/|examples/|python/|src/util/virstring\.c|tests/virnetserverclientmock.c$$)
+ ^(docs/|examples/|src/util/virstring\.c|tests/virnetserverclientmock.c$$)
exclude_file_name_regexp--sc_prohibit_close = \
(\.p[yl]$$|^docs/|^(src/util/virfile\.c|src/libvirt\.c|tests/vir(cgroup|pci)mock\.c)$$)
@@ -1033,7 +1030,7 @@ exclude_file_name_regexp--sc_prohibit_include_public_headers_quote = \
^src/internal\.h$$
exclude_file_name_regexp--sc_prohibit_include_public_headers_brackets = \
- ^(python/|tools/|examples/|include/libvirt/(virterror|libvirt-(qemu|lxc))\.h$$)
+ ^(tools/|examples/|include/libvirt/(virterror|libvirt-(qemu|lxc))\.h$$)
exclude_file_name_regexp--sc_prohibit_int_ijk = \
^(src/remote_protocol-structs|src/remote/remote_protocol.x|cfg.mk|include/)$
diff --git a/configure.ac b/configure.ac
index 6003871..044cf37 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2012,83 +2012,6 @@ fi
AM_CONDITIONAL([WITH_HYPERV], [test "$with_hyperv" = "yes"])
-dnl
-dnl check for python
-dnl
-
-AC_ARG_WITH([python],
- [AS_HELP_STRING([--with-python],
- [Build python bindings @<:@default=yes@:>@])],
- [],[with_python=yes])
-
-if test "$enable_shared:$with_python" = no:yes; then
- AC_MSG_WARN([Disabling shared libraries is incompatible with building Python extensions.])
- AC_MSG_WARN([Ignoring --with-python.])
- with_python=no
-fi
-
-PYTHON_VERSION=
-PYTHON_INCLUDES=
-if test "$with_python" != "no" ; then
- if test -x "$with_python/bin/python"
- then
- AC_MSG_NOTICE(Found python in $with_python/bin/python)
- PYTHON="$with_python/bin/python"
- with_python=yes
- else
- if test -x "$with_python"
- then
- AC_MSG_NOTICE(Found python in $with_python)
- PYTHON="$with_python"
- with_python=yes
- else
- if test -x "$PYTHON"
- then
- AC_MSG_NOTICE(Found python in environment PYTHON=$PYTHON)
- with_python=yes
- fi
- fi
- fi
-
- if test "$with_python" = "yes" ; then
- AM_PATH_PYTHON(,, [:])
-
- if test "$PYTHON" != : ; then
- PYTHON_CONFIG="$PYTHON-config"
-
- if test -x "$PYTHON_CONFIG"
- then
- PYTHON_INCLUDES=`$PYTHON_CONFIG --includes`
- else
- if test -r $PYTHON_EXEC_PREFIX/include/python$PYTHON_VERSION/Python.h
- then
- PYTHON_INCLUDES=-I$PYTHON_EXEC_PREFIX/include/python$PYTHON_VERSION
- else
- if test -r $prefix/include/python$PYTHON_VERSION/Python.h
- then
- PYTHON_INCLUDES=-I$prefix/include/python$PYTHON_VERSION
- else
- if test -r /usr/include/python$PYTHON_VERSION/Python.h
- then
- PYTHON_INCLUDES=-I/usr/include/python$PYTHON_VERSION
- else
- AC_MSG_ERROR([You must install python-devel to build Python bindings])
- fi
- fi
- fi
- fi
- else
- AC_MSG_ERROR([You must install python to build Python bindings])
- fi
- else
- AC_MSG_NOTICE([Could not find python in $with_python, disabling bindings])
- with_python=no
- fi
-fi
-AM_CONDITIONAL([WITH_PYTHON], [test "$with_python" = "yes"])
-AC_SUBST([PYTHON_VERSION])
-AC_SUBST([PYTHON_INCLUDES])
-
dnl Allow perl overrides
AC_PATH_PROG([PERL], [perl])
@@ -2227,7 +2150,6 @@ dnl Copied from libxml2 configure.in, but I removed mingw changes
dnl for now since I'm not supporting mingw at present. - RWMJ
CYGWIN_EXTRA_LDFLAGS=
CYGWIN_EXTRA_LIBADD=
-CYGWIN_EXTRA_PYTHON_LIBADD=
MINGW_EXTRA_LDFLAGS=
WIN32_EXTRA_CFLAGS=
dnl libvirt.syms is generated in builddir, but libvirt_qemu.syms is in git;
@@ -2241,10 +2163,6 @@ case "$host" in
CYGWIN_EXTRA_LDFLAGS="-no-undefined"
CYGWIN_EXTRA_LIBADD="${INTLLIBS}"
MSCOM_LIBS="-lole32 -loleaut32"
-
- if test "x$PYTHON_VERSION" != "x"; then
- CYGWIN_EXTRA_PYTHON_LIBADD="-L/usr/lib/python${PYTHON_VERSION}/config -lpython${PYTHON_VERSION}"
- fi
;;
*-*-mingw*)
MINGW_EXTRA_LDFLAGS="-no-undefined"
@@ -2279,7 +2197,6 @@ case "$host" in
esac
AC_SUBST([CYGWIN_EXTRA_LDFLAGS])
AC_SUBST([CYGWIN_EXTRA_LIBADD])
-AC_SUBST([CYGWIN_EXTRA_PYTHON_LIBADD])
AC_SUBST([MINGW_EXTRA_LDFLAGS])
AC_SUBST([WIN32_EXTRA_CFLAGS])
AC_SUBST([LIBVIRT_SYMBOL_FILE])
@@ -2613,7 +2530,6 @@ AC_CONFIG_FILES([\
libvirt.pc libvirt.spec mingw-libvirt.spec \
po/Makefile.in \
include/libvirt/Makefile include/libvirt/libvirt.h \
- python/Makefile \
daemon/Makefile \
tools/Makefile \
tests/Makefile \
@@ -2622,7 +2538,6 @@ AC_CONFIG_FILES([\
examples/domsuspend/Makefile \
examples/dominfo/Makefile \
examples/openauth/Makefile \
- examples/python/Makefile \
examples/hellolibvirt/Makefile \
examples/systemtap/Makefile \
examples/xml/nwfilter/Makefile])
@@ -2778,7 +2693,6 @@ AC_MSG_NOTICE([])
AC_MSG_NOTICE([ Debug: $enable_debug])
AC_MSG_NOTICE([ Use -Werror: $set_werror])
AC_MSG_NOTICE([ Warning Flags: $WARN_CFLAGS])
-AC_MSG_NOTICE([ Python: $with_python])
AC_MSG_NOTICE([ DTrace: $with_dtrace])
AC_MSG_NOTICE([ numad: $with_numad])
AC_MSG_NOTICE([ XML Catalog: $XML_CATALOG_FILE])
diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py
deleted file mode 100644
index 84f5259..0000000
--- a/examples/domain-events/events-python/event-test.py
+++ /dev/null
@@ -1,591 +0,0 @@
-#!/usr/bin/python -u
-#
-#
-#
-#################################################################################
-# Start off by implementing a general purpose event loop for anyones use
-#################################################################################
-
-import sys
-import getopt
-import os
-import libvirt
-import select
-import errno
-import time
-import threading
-
-# For the sake of demonstration, this example program includes
-# an implementation of a pure python event loop. Most applications
-# would be better off just using the default libvirt event loop
-# APIs, instead of implementing this in python. The exception is
-# where an application wants to integrate with an existing 3rd
-# party event loop impl
-#
-# Change this to 'False' to make the demo use the native
-# libvirt event loop impl
-use_pure_python_event_loop = True
-
-do_debug = False
-def debug(msg):
- global do_debug
- if do_debug:
- print msg
-
-#
-# This general purpose event loop will support waiting for file handle
-# I/O and errors events, as well as scheduling repeatable timers with
-# a fixed interval.
-#
-# It is a pure python implementation based around the poll() API
-#
-class virEventLoopPure:
- # This class contains the data we need to track for a
- # single file handle
- class virEventLoopPureHandle:
- def __init__(self, handle, fd, events, cb, opaque):
- self.handle = handle
- self.fd = fd
- self.events = events
- self.cb = cb
- self.opaque = opaque
-
- def get_id(self):
- return self.handle
-
- def get_fd(self):
- return self.fd
-
- def get_events(self):
- return self.events
-
- def set_events(self, events):
- self.events = events
-
- def dispatch(self, events):
- self.cb(self.handle,
- self.fd,
- events,
- self.opaque)
-
- # This class contains the data we need to track for a
- # single periodic timer
- class virEventLoopPureTimer:
- def __init__(self, timer, interval, cb, opaque):
- self.timer = timer
- self.interval = interval
- self.cb = cb
- self.opaque = opaque
- self.lastfired = 0
-
- def get_id(self):
- return self.timer
-
- def get_interval(self):
- return self.interval
-
- def set_interval(self, interval):
- self.interval = interval
-
- def get_last_fired(self):
- return self.lastfired
-
- def set_last_fired(self, now):
- self.lastfired = now
-
- def dispatch(self):
- self.cb(self.timer,
- self.opaque)
-
-
- def __init__(self):
- self.poll = select.poll()
- self.pipetrick = os.pipe()
- self.pendingWakeup = False
- self.runningPoll = False
- self.nextHandleID = 1
- self.nextTimerID = 1
- self.handles = []
- self.timers = []
- self.quit = False
-
- # The event loop can be used from multiple threads at once.
- # Specifically while the main thread is sleeping in poll()
- # waiting for events to occur, another thread may come along
- # and add/update/remove a file handle, or timer. When this
- # happens we need to interrupt the poll() sleep in the other
- # thread, so that it'll see the file handle / timer changes.
- #
- # Using OS level signals for this is very unreliable and
- # hard to implement correctly. Thus we use the real classic
- # "self pipe" trick. A anonymous pipe, with one end registered
- # with the event loop for input events. When we need to force
- # the main thread out of a poll() sleep, we simple write a
- # single byte of data to the other end of the pipe.
- debug("Self pipe watch %d write %d" %(self.pipetrick[0], self.pipetrick[1]))
- self.poll.register(self.pipetrick[0], select.POLLIN)
-
-
- # Calculate when the next timeout is due to occur, returning
- # the absolute timestamp for the next timeout, or 0 if there is
- # no timeout due
- def next_timeout(self):
- next = 0
- for t in self.timers:
- last = t.get_last_fired()
- interval = t.get_interval()
- if interval < 0:
- continue
- if next == 0 or (last + interval) < next:
- next = last + interval
-
- return next
-
- # Lookup a virEventLoopPureHandle object based on file descriptor
- def get_handle_by_fd(self, fd):
- for h in self.handles:
- if h.get_fd() == fd:
- return h
- return None
-
- # Lookup a virEventLoopPureHandle object based on its event loop ID
- def get_handle_by_id(self, handleID):
- for h in self.handles:
- if h.get_id() == handleID:
- return h
- return None
-
-
- # This is the heart of the event loop, performing one single
- # iteration. It asks when the next timeout is due, and then
- # calcuates the maximum amount of time it is able to sleep
- # for in poll() pending file handle events.
- #
- # It then goes into the poll() sleep.
- #
- # When poll() returns, there will zero or more file handle
- # events which need to be dispatched to registered callbacks
- # It may also be time to fire some periodic timers.
- #
- # Due to the coarse granularity of schedular timeslices, if
- # we ask for a sleep of 500ms in order to satisfy a timer, we
- # may return up to 1 schedular timeslice early. So even though
- # our sleep timeout was reached, the registered timer may not
- # technically be at its expiry point. This leads to us going
- # back around the loop with a crazy 5ms sleep. So when checking
- # if timeouts are due, we allow a margin of 20ms, to avoid
- # these pointless repeated tiny sleeps.
- def run_once(self):
- sleep = -1
- self.runningPoll = True
- try:
- next = self.next_timeout()
- debug("Next timeout due at %d" % next)
- if next > 0:
- now = int(time.time() * 1000)
- if now >= next:
- sleep = 0
- else:
- sleep = (next - now) / 1000.0
-
- debug("Poll with a sleep of %d" % sleep)
- events = self.poll.poll(sleep)
-
- # Dispatch any file handle events that occurred
- for (fd, revents) in events:
- # See if the events was from the self-pipe
- # telling us to wakup. if so, then discard
- # the data just continue
- if fd == self.pipetrick[0]:
- self.pendingWakeup = False
- data = os.read(fd, 1)
- continue
-
- h = self.get_handle_by_fd(fd)
- if h:
- debug("Dispatch fd %d handle %d events %d" % (fd, h.get_id(), revents))
- h.dispatch(self.events_from_poll(revents))
-
- now = int(time.time() * 1000)
- for t in self.timers:
- interval = t.get_interval()
- if interval < 0:
- continue
-
- want = t.get_last_fired() + interval
- # Deduct 20ms, since scheduler timeslice
- # means we could be ever so slightly early
- if now >= (want-20):
- debug("Dispatch timer %d now %s want %s" % (t.get_id(), str(now), str(want)))
- t.set_last_fired(now)
- t.dispatch()
-
- except (os.error, select.error), e:
- if e.args[0] != errno.EINTR:
- raise
- finally:
- self.runningPoll = False
-
-
- # Actually the event loop forever
- def run_loop(self):
- self.quit = False
- while not self.quit:
- self.run_once()
-
- def interrupt(self):
- if self.runningPoll and not self.pendingWakeup:
- self.pendingWakeup = True
- os.write(self.pipetrick[1], 'c')
-
-
- # Registers a new file handle 'fd', monitoring for 'events' (libvirt
- # event constants), firing the callback cb() when an event occurs.
- # Returns a unique integer identier for this handle, that should be
- # used to later update/remove it
- def add_handle(self, fd, events, cb, opaque):
- handleID = self.nextHandleID + 1
- self.nextHandleID = self.nextHandleID + 1
-
- h = self.virEventLoopPureHandle(handleID, fd, events, cb, opaque)
- self.handles.append(h)
-
- self.poll.register(fd, self.events_to_poll(events))
- self.interrupt()
-
- debug("Add handle %d fd %d events %d" % (handleID, fd, events))
-
- return handleID
-
- # Registers a new timer with periodic expiry at 'interval' ms,
- # firing cb() each time the timer expires. If 'interval' is -1,
- # then the timer is registered, but not enabled
- # Returns a unique integer identier for this handle, that should be
- # used to later update/remove it
- def add_timer(self, interval, cb, opaque):
- timerID = self.nextTimerID + 1
- self.nextTimerID = self.nextTimerID + 1
-
- h = self.virEventLoopPureTimer(timerID, interval, cb, opaque)
- self.timers.append(h)
- self.interrupt()
-
- debug("Add timer %d interval %d" % (timerID, interval))
-
- return timerID
-
- # Change the set of events to be monitored on the file handle
- def update_handle(self, handleID, events):
- h = self.get_handle_by_id(handleID)
- if h:
- h.set_events(events)
- self.poll.unregister(h.get_fd())
- self.poll.register(h.get_fd(), self.events_to_poll(events))
- self.interrupt()
-
- debug("Update handle %d fd %d events %d" % (handleID, h.get_fd(), events))
-
- # Change the periodic frequency of the timer
- def update_timer(self, timerID, interval):
- for h in self.timers:
- if h.get_id() == timerID:
- h.set_interval(interval)
- self.interrupt()
-
- debug("Update timer %d interval %d" % (timerID, interval))
- break
-
- # Stop monitoring for events on the file handle
- def remove_handle(self, handleID):
- handles = []
- for h in self.handles:
- if h.get_id() == handleID:
- self.poll.unregister(h.get_fd())
- debug("Remove handle %d fd %d" % (handleID, h.get_fd()))
- else:
- handles.append(h)
- self.handles = handles
- self.interrupt()
-
- # Stop firing the periodic timer
- def remove_timer(self, timerID):
- timers = []
- for h in self.timers:
- if h.get_id() != timerID:
- timers.append(h)
- debug("Remove timer %d" % timerID)
- self.timers = timers
- self.interrupt()
-
- # Convert from libvirt event constants, to poll() events constants
- def events_to_poll(self, events):
- ret = 0
- if events & libvirt.VIR_EVENT_HANDLE_READABLE:
- ret |= select.POLLIN
- if events & libvirt.VIR_EVENT_HANDLE_WRITABLE:
- ret |= select.POLLOUT
- if events & libvirt.VIR_EVENT_HANDLE_ERROR:
- ret |= select.POLLERR
- if events & libvirt.VIR_EVENT_HANDLE_HANGUP:
- ret |= select.POLLHUP
- return ret
-
- # Convert from poll() event constants, to libvirt events constants
- def events_from_poll(self, events):
- ret = 0
- if events & select.POLLIN:
- ret |= libvirt.VIR_EVENT_HANDLE_READABLE
- if events & select.POLLOUT:
- ret |= libvirt.VIR_EVENT_HANDLE_WRITABLE
- if events & select.POLLNVAL:
- ret |= libvirt.VIR_EVENT_HANDLE_ERROR
- if events & select.POLLERR:
- ret |= libvirt.VIR_EVENT_HANDLE_ERROR
- if events & select.POLLHUP:
- ret |= libvirt.VIR_EVENT_HANDLE_HANGUP
- return ret
-
-
-###########################################################################
-# Now glue an instance of the general event loop into libvirt's event loop
-###########################################################################
-
-# This single global instance of the event loop wil be used for
-# monitoring libvirt events
-eventLoop = virEventLoopPure()
-
-# This keeps track of what thread is running the event loop,
-# (if it is run in a background thread)
-eventLoopThread = None
-
-
-# These next set of 6 methods are the glue between the official
-# libvirt events API, and our particular impl of the event loop
-#
-# There is no reason why the 'virEventLoopPure' has to be used.
-# An application could easily may these 6 glue methods hook into
-# another event loop such as GLib's, or something like the python
-# Twisted event framework.
-
-def virEventAddHandleImpl(fd, events, cb, opaque):
- global eventLoop
- return eventLoop.add_handle(fd, events, cb, opaque)
-
-def virEventUpdateHandleImpl(handleID, events):
- global eventLoop
- return eventLoop.update_handle(handleID, events)
-
-def virEventRemoveHandleImpl(handleID):
- global eventLoop
- return eventLoop.remove_handle(handleID)
-
-def virEventAddTimerImpl(interval, cb, opaque):
- global eventLoop
- return eventLoop.add_timer(interval, cb, opaque)
-
-def virEventUpdateTimerImpl(timerID, interval):
- global eventLoop
- return eventLoop.update_timer(timerID, interval)
-
-def virEventRemoveTimerImpl(timerID):
- global eventLoop
- return eventLoop.remove_timer(timerID)
-
-# This tells libvirt what event loop implementation it
-# should use
-def virEventLoopPureRegister():
- libvirt.virEventRegisterImpl(virEventAddHandleImpl,
- virEventUpdateHandleImpl,
- virEventRemoveHandleImpl,
- virEventAddTimerImpl,
- virEventUpdateTimerImpl,
- virEventRemoveTimerImpl)
-
-# Directly run the event loop in the current thread
-def virEventLoopPureRun():
- global eventLoop
- eventLoop.run_loop()
-
-def virEventLoopNativeRun():
- while True:
- libvirt.virEventRunDefaultImpl()
-
-# Spawn a background thread to run the event loop
-def virEventLoopPureStart():
- global eventLoopThread
- virEventLoopPureRegister()
- eventLoopThread = threading.Thread(target=virEventLoopPureRun, name="libvirtEventLoop")
- eventLoopThread.setDaemon(True)
- eventLoopThread.start()
-
-def virEventLoopNativeStart():
- global eventLoopThread
- libvirt.virEventRegisterDefaultImpl()
- eventLoopThread = threading.Thread(target=virEventLoopNativeRun, name="libvirtEventLoop")
- eventLoopThread.setDaemon(True)
- eventLoopThread.start()
-
-
-##########################################################################
-# Everything that now follows is a simple demo of domain lifecycle events
-##########################################################################
-def eventToString(event):
- eventStrings = ( "Defined",
- "Undefined",
- "Started",
- "Suspended",
- "Resumed",
- "Stopped",
- "Shutdown",
- "PMSuspended",
- "Crashed" )
- return eventStrings[event]
-
-def detailToString(event, detail):
- eventStrings = (
- ( "Added", "Updated" ),
- ( "Removed", ),
- ( "Booted", "Migrated", "Restored", "Snapshot", "Wakeup" ),
- ( "Paused", "Migrated", "IOError", "Watchdog", "Restored", "Snapshot", "API error" ),
- ( "Unpaused", "Migrated", "Snapshot" ),
- ( "Shutdown", "Destroyed", "Crashed", "Migrated", "Saved", "Failed", "Snapshot"),
- ( "Finished", ),
- ( "Memory", "Disk" ),
- ( "Panicked", )
- )
- return eventStrings[event][detail]
-
-def myDomainEventCallback1 (conn, dom, event, detail, opaque):
- print "myDomainEventCallback1 EVENT: Domain %s(%s) %s %s" % (dom.name(), dom.ID(),
- eventToString(event),
- detailToString(event, detail))
-
-def myDomainEventCallback2 (conn, dom, event, detail, opaque):
- print "myDomainEventCallback2 EVENT: Domain %s(%s) %s %s" % (dom.name(), dom.ID(),
- eventToString(event),
- detailToString(event, detail))
-
-def myDomainEventRebootCallback(conn, dom, opaque):
- print "myDomainEventRebootCallback: Domain %s(%s)" % (dom.name(), dom.ID())
-
-def myDomainEventRTCChangeCallback(conn, dom, utcoffset, opaque):
- print "myDomainEventRTCChangeCallback: Domain %s(%s) %d" % (dom.name(), dom.ID(), utcoffset)
-
-def myDomainEventWatchdogCallback(conn, dom, action, opaque):
- print "myDomainEventWatchdogCallback: Domain %s(%s) %d" % (dom.name(), dom.ID(), action)
-
-def myDomainEventIOErrorCallback(conn, dom, srcpath, devalias, action, opaque):
- print "myDomainEventIOErrorCallback: Domain %s(%s) %s %s %d" % (dom.name(), dom.ID(), srcpath, devalias, action)
-
-def myDomainEventGraphicsCallback(conn, dom, phase, localAddr, remoteAddr, authScheme, subject, opaque):
- print "myDomainEventGraphicsCallback: Domain %s(%s) %d %s" % (dom.name(), dom.ID(), phase, authScheme)
-
-def myDomainEventDiskChangeCallback(conn, dom, oldSrcPath, newSrcPath, devAlias, reason, opaque):
- print "myDomainEventDiskChangeCallback: Domain %s(%s) disk change oldSrcPath: %s newSrcPath: %s devAlias: %s reason: %s" % (
- dom.name(), dom.ID(), oldSrcPath, newSrcPath, devAlias, reason)
-def myDomainEventTrayChangeCallback(conn, dom, devAlias, reason, opaque):
- print "myDomainEventTrayChangeCallback: Domain %s(%s) tray change devAlias: %s reason: %s" % (
- dom.name(), dom.ID(), devAlias, reason)
-def myDomainEventPMWakeupCallback(conn, dom, reason, opaque):
- print "myDomainEventPMWakeupCallback: Domain %s(%s) system pmwakeup" % (
- dom.name(), dom.ID())
-def myDomainEventPMSuspendCallback(conn, dom, reason, opaque):
- print "myDomainEventPMSuspendCallback: Domain %s(%s) system pmsuspend" % (
- dom.name(), dom.ID())
-def myDomainEventBalloonChangeCallback(conn, dom, actual, opaque):
- print "myDomainEventBalloonChangeCallback: Domain %s(%s) %d" % (dom.name(), dom.ID(), actual)
-def myDomainEventPMSuspendDiskCallback(conn, dom, reason, opaque):
- print "myDomainEventPMSuspendDiskCallback: Domain %s(%s) system pmsuspend_disk" % (
- dom.name(), dom.ID())
-def myDomainEventDeviceRemovedCallback(conn, dom, dev, opaque):
- print "myDomainEventDeviceRemovedCallback: Domain %s(%s) device removed: %s" % (
- dom.name(), dom.ID(), dev)
-
-run = True
-
-def myConnectionCloseCallback(conn, reason, opaque):
- reasonStrings = (
- "Error", "End-of-file", "Keepalive", "Client",
- )
- print "myConnectionCloseCallback: %s: %s" % (conn.getURI(), reasonStrings[reason])
- run = False
-
-def usage(out=sys.stderr):
- print >>out, "usage: "+os.path.basename(sys.argv[0])+" [-hdl] [uri]"
- print >>out, " uri will default to qemu:///system"
- print >>out, " --help, -h Print this help message"
- print >>out, " --debug, -d Print debug output"
- print >>out, " --loop, -l Toggle event-loop-implementation"
-
-def main():
- try:
- opts, args = getopt.getopt(sys.argv[1:], "hdl", ["help", "debug", "loop"])
- except getopt.GetoptError, err:
- # print help information and exit:
- print str(err) # will print something like "option -a not recognized"
- usage()
- sys.exit(2)
- for o, a in opts:
- if o in ("-h", "--help"):
- usage(sys.stdout)
- sys.exit()
- if o in ("-d", "--debug"):
- global do_debug
- do_debug = True
- if o in ("-l", "--loop"):
- global use_pure_python_event_loop
- use_pure_python_event_loop ^= True
-
- if len(args) >= 1:
- uri = args[0]
- else:
- uri = "qemu:///system"
-
- print "Using uri:" + uri
-
- # Run a background thread with the event loop
- if use_pure_python_event_loop:
- virEventLoopPureStart()
- else:
- virEventLoopNativeStart()
-
- vc = libvirt.openReadOnly(uri)
-
- # Close connection on exit (to test cleanup paths)
- old_exitfunc = getattr(sys, 'exitfunc', None)
- def exit():
- print "Closing " + str(vc)
- vc.close()
- if (old_exitfunc): old_exitfunc()
- sys.exitfunc = exit
-
- vc.registerCloseCallback(myConnectionCloseCallback, None)
-
- #Add 2 callbacks to prove this works with more than just one
- vc.domainEventRegister(myDomainEventCallback1,None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_LIFECYCLE, myDomainEventCallback2, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_REBOOT, myDomainEventRebootCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_RTC_CHANGE, myDomainEventRTCChangeCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_IO_ERROR, myDomainEventIOErrorCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG, myDomainEventWatchdogCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_TRAY_CHANGE, myDomainEventTrayChangeCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_PMWAKEUP, myDomainEventPMWakeupCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_PMSUSPEND, myDomainEventPMSuspendCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE, myDomainEventBalloonChangeCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK, myDomainEventPMSuspendDiskCallback, None)
- vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, myDomainEventDeviceRemovedCallback, None)
-
- vc.setKeepAlive(5, 3)
-
- # The rest of your app would go here normally, but for sake
- # of demo we'll just go to sleep. The other option is to
- # run the event loop in your main thread if your app is
- # totally event based.
- while run:
- time.sleep(1)
-
-
-if __name__ == "__main__":
- main()
diff --git a/examples/python/Makefile.am b/examples/python/Makefile.am
deleted file mode 100644
index 7823c20..0000000
--- a/examples/python/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-## Copyright (C) 2005-2013 Red Hat, Inc.
-##
-## This library is free software; you can redistribute it and/or
-## modify it under the terms of the GNU Lesser General Public
-## License as published by the Free Software Foundation; either
-## version 2.1 of the License, or (at your option) any later version.
-##
-## This library is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-## Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public
-## License along with this library. If not, see
-## <http://www.gnu.org/licenses/>.
-
-EXTRA_DIST= \
- README \
- consolecallback.py \
- topology.py \
- dominfo.py domrestore.py domsave.py domstart.py esxlist.py
diff --git a/examples/python/README b/examples/python/README
deleted file mode 100644
index f4db76c..0000000
--- a/examples/python/README
+++ /dev/null
@@ -1,33 +0,0 @@
-Some simple examples on how to use the Python API for libvirt
-
-The examples are:
-
-dominfo.py - print information about a running domU based on the results of
- virDomainGetInfo and virDomainGetXMLDesc
-domstart.py - create a domU from an XML description if the domU isn't
- running yet
-domsave.py - save all running domU's into a directory
-domrestore.py - restore domU's from their saved files in a directory
-esxlist.py - list active domains of an VMware ESX host and print some info.
- also demonstrates how to use the libvirt.openAuth() method
-
-The XML files in this directory are examples of the XML format that libvirt
-expects, and will have to be adapted for your setup. They are only needed
-for domstart.py
-
-
-Some additional notes for the esxlist.py example:
-
-You may see remote errors complaining about missing certificates:
-
- Cannot access CA certificate '/usr/local/etc/pki/CA/cacert.pem': No such file
- or directory
-
-This is expected, libvirt tries to find network and storage drivers for ESX,
-but those are not implemented yet (November 2009). While searching for this
-drivers, libvirt may try to start a local libvirtd instance, but fails because
-of the missing certificates. It'll warn about that:
-
- Failed to find the network: Is the daemon running?
-
-This is also expected and can be ignored.
diff --git a/examples/python/consolecallback.py b/examples/python/consolecallback.py
deleted file mode 100644
index d8e33a9..0000000
--- a/examples/python/consolecallback.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env python
-# consolecallback - provide a persistent console that survives guest reboots
-
-import sys, os, logging, libvirt, tty, termios, atexit
-
-def reset_term():
- termios.tcsetattr(0, termios.TCSADRAIN, attrs)
-
-def error_handler(unused, error):
- # The console stream errors on VM shutdown; we don't care
- if (error[0] == libvirt.VIR_ERR_RPC and
- error[1] == libvirt.VIR_FROM_STREAMS):
- return
- logging.warn(error)
-
-class Console(object):
- def __init__(self, uri, uuid):
- self.uri = uri
- self.uuid = uuid
- self.connection = libvirt.open(uri)
- self.domain = self.connection.lookupByUUIDString(uuid)
- self.state = self.domain.state(0)
- self.connection.domainEventRegister(lifecycle_callback, self)
- self.stream = None
- self.run_console = True
- logging.info("%s initial state %d, reason %d",
- self.uuid, self.state[0], self.state[1])
-
-def check_console(console):
- if (console.state[0] == libvirt.VIR_DOMAIN_RUNNING or
- console.state[0] == libvirt.VIR_DOMAIN_PAUSED):
- if console.stream is None:
- console.stream = console.connection.newStream(libvirt.VIR_STREAM_NONBLOCK)
- console.domain.openConsole(None, console.stream, 0)
- console.stream.eventAddCallback(libvirt.VIR_STREAM_EVENT_READABLE, stream_callback, console)
- else:
- if console.stream:
- console.stream.eventRemoveCallback()
- console.stream = None
-
- return console.run_console
-
-def stdin_callback(watch, fd, events, console):
- readbuf = os.read(fd, 1024)
- if readbuf.startswith(""):
- console.run_console = False
- return
- if console.stream:
- console.stream.send(readbuf)
-
-def stream_callback(stream, events, console):
- try:
- received_data = console.stream.recv(1024)
- except:
- return
- os.write(0, received_data)
-
-def lifecycle_callback (connection, domain, event, detail, console):
- console.state = console.domain.state(0)
- logging.info("%s transitioned to state %d, reason %d",
- console.uuid, console.state[0], console.state[1])
-
-# main
-if len(sys.argv) != 3:
- print "Usage:", sys.argv[0], "URI UUID"
- print "for example:", sys.argv[0], "'qemu:///system' '32ad945f-7e78-c33a-e96d-39f25e025d81'"
- sys.exit(1)
-
-uri = sys.argv[1]
-uuid = sys.argv[2]
-
-print "Escape character is ^]"
-logging.basicConfig(filename='msg.log', level=logging.DEBUG)
-logging.info("URI: %s", uri)
-logging.info("UUID: %s", uuid)
-
-libvirt.virEventRegisterDefaultImpl()
-libvirt.registerErrorHandler(error_handler, None)
-
-atexit.register(reset_term)
-attrs = termios.tcgetattr(0)
-tty.setraw(0)
-
-console = Console(uri, uuid)
-console.stdin_watch = libvirt.virEventAddHandle(0, libvirt.VIR_EVENT_HANDLE_READABLE, stdin_callback, console)
-
-while check_console(console):
- libvirt.virEventRunDefaultImpl()
diff --git a/examples/python/dominfo.py b/examples/python/dominfo.py
deleted file mode 100755
index bfa3ca3..0000000
--- a/examples/python/dominfo.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env python
-# dominfo - print some information about a domain
-
-import libvirt
-import sys
-import os
-import libxml2
-import pdb
-
-def usage():
- print 'Usage: %s DOMAIN' % sys.argv[0]
- print ' Print information about the domain DOMAIN'
-
-def print_section(title):
- print "\n%s" % title
- print "=" * 60
-
-def print_entry(key, value):
- print "%-10s %-10s" % (key, value)
-
-def print_xml(key, ctx, path):
- res = ctx.xpathEval(path)
- if res is None or len(res) == 0:
- value="Unknown"
- else:
- value = res[0].content
- print_entry(key, value)
- return value
-
-if len(sys.argv) != 2:
- usage()
- sys.exit(2)
-
-name = sys.argv[1]
-
-# Connect to libvirt
-conn = libvirt.openReadOnly(None)
-if conn is None:
- print 'Failed to open connection to the hypervisor'
- sys.exit(1)
-
-try:
- dom = conn.lookupByName(name)
- # Annoyiingly, libvirt prints its own error message here
-except libvirt.libvirtError:
- print "Domain %s is not running" % name
- sys.exit(0)
-
-info = dom.info()
-print_section("Domain info")
-print_entry("State:", info[0])
-print_entry("MaxMem:", info[1])
-print_entry("UsedMem:", info[2])
-print_entry("VCPUs:", info[3])
-
-# Read some info from the XML desc
-xmldesc = dom.XMLDesc(0)
-doc = libxml2.parseDoc(xmldesc)
-ctx = doc.xpathNewContext()
-print_section("Kernel")
-print_xml("Type:", ctx, "/domain/os/type")
-print_xml("Kernel:", ctx, "/domain/os/kernel")
-print_xml("initrd:", ctx, "/domain/os/initrd")
-print_xml("cmdline:", ctx, "/domain/os/cmdline")
-
-print_section("Devices")
-devs = ctx.xpathEval("/domain/devices/*")
-for d in devs:
- ctx.setContextNode(d)
- #pdb.set_trace()
- type = print_xml("Type:", ctx, "@type")
- if type == "file":
- print_xml("Source:", ctx, "source/@file")
- print_xml("Target:", ctx, "target/@dev")
- elif type == "block":
- print_xml("Source:", ctx, "source/@dev")
- print_xml("Target:", ctx, "target/@dev")
- elif type == "bridge":
- print_xml("Source:", ctx, "source/@bridge")
- print_xml("MAC Addr:", ctx, "mac/@address")
diff --git a/examples/python/domrestore.py b/examples/python/domrestore.py
deleted file mode 100755
index fffc90f..0000000
--- a/examples/python/domrestore.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-# domstart - make sure a given domU is running, if not start it
-
-import libvirt
-import sys
-import os
-import libxml2
-import pdb
-
-def usage():
- print 'Usage: %s DIR' % sys.argv[0]
- print ' Restore all the domains contained in DIR'
- print ' It is assumed that all files in DIR are'
- print ' images of domU\'s previously created with save'
-
-if len(sys.argv) != 2:
- usage()
- sys.exit(2)
-
-dir = sys.argv[1]
-imgs = os.listdir(dir)
-
-conn = libvirt.open(None)
-if conn is None:
- print 'Failed to open connection to the hypervisor'
- sys.exit(1)
-
-for img in imgs:
- file = os.path.join(dir, img)
- print "Restoring %s ... " % img,
- sys.stdout.flush()
- ret = conn.restore(file)
- if ret == 0:
- print "done"
- else:
- print "error %d" % ret
diff --git a/examples/python/domsave.py b/examples/python/domsave.py
deleted file mode 100755
index bac4536..0000000
--- a/examples/python/domsave.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env python
-# domstart - make sure a given domU is running, if not start it
-
-import libvirt
-import sys
-import os
-import libxml2
-import pdb
-
-def usage():
- print 'Usage: %s DIR' % sys.argv[0]
- print ' Save all currently running domU\'s into DIR'
- print ' DIR must exist and be writable by this process'
-
-if len(sys.argv) != 2:
- usage()
- sys.exit(2)
-
-dir = sys.argv[1]
-
-conn = libvirt.open(None)
-if conn is None:
- print 'Failed to open connection to the hypervisor'
- sys.exit(1)
-
-doms = conn.listDomainsID()
-for id in doms:
- if id == 0:
- continue
- dom = conn.lookupByID(id)
- print "Saving %s[%d] ... " % (dom.name(), id),
- sys.stdout.flush()
- path = os.path.join(dir, dom.name())
- ret = dom.save(path)
- if ret == 0:
- print "done"
- else:
- print "error %d" % ret
-
-#pdb.set_trace()
diff --git a/examples/python/domstart.py b/examples/python/domstart.py
deleted file mode 100755
index b14fad1..0000000
--- a/examples/python/domstart.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-# domstart - make sure a given domU is running, if not start it
-
-import libvirt
-import sys
-import os
-import libxml2
-import pdb
-
-# Parse the XML description of domU from FNAME
-# and return a tuple (name, xmldesc) where NAME
-# is the name of the domain, and xmldesc is the contetn of FNAME
-def read_domain(fname):
- fp = open(fname, "r")
- xmldesc = fp.read()
- fp.close()
-
- doc = libxml2.parseDoc(xmldesc)
- name = doc.xpathNewContext().xpathEval("/domain/name")[0].content
- return (name, xmldesc)
-
-def usage():
- print 'Usage: %s domain.xml' % sys.argv[0]
- print ' Check that the domain described by DOMAIN.XML is running'
- print ' If the domain is not running, create it'
- print ' DOMAIN.XML must be a XML description of the domain'
- print ' in libvirt\'s XML format'
-
-if len(sys.argv) != 2:
- usage()
- sys.exit(2)
-
-(name, xmldesc) = read_domain(sys.argv[1])
-
-conn = libvirt.open(None)
-if conn is None:
- print 'Failed to open connection to the hypervisor'
- sys.exit(1)
-
-try:
- dom = conn.lookupByName(name)
-except libvirt.libvirtError:
- print "Starting domain %s ... " % name,
- sys.stdout.flush()
- dom = conn.createLinux(xmldesc, 0)
- if dom is None:
- print "failed"
- sys.exit(1)
- else:
- print "done"
diff --git a/examples/python/esxlist.py b/examples/python/esxlist.py
deleted file mode 100755
index c55424f..0000000
--- a/examples/python/esxlist.py
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/usr/bin/env python
-# esxlist - list active domains of an ESX host and print some info.
-# also demonstrates how to use the libvirt.openAuth() method
-
-import libvirt
-import sys
-import os
-import libxml2
-import getpass
-
-
-def usage():
- print "Usage: %s HOSTNAME" % sys.argv[0]
- print " List active domains of HOSTNAME and print some info"
-
-
-# This is the callback method passed to libvirt.openAuth() (see below).
-#
-# The credentials argument is a list of credentials that libvirt (actually
-# the ESX driver) would like to request. An element of this list is itself a
-# list containing 5 items (4 inputs, 1 output):
-# - the credential type, e.g. libvirt.VIR_CRED_AUTHNAME
-# - a prompt to be displayed to the user
-# - a challenge, the ESX driver sets this to the hostname to allow automatic
-# distinction between requests for ESX and vCenter credentials
-# - a default result for the request
-# - a place to store the actual result for the request
-#
-# The user_data argument is the user data item of the auth argument (see below)
-# passed to libvirt.openAuth().
-def request_credentials(credentials, user_data):
- for credential in credentials:
- if credential[0] == libvirt.VIR_CRED_AUTHNAME:
- # prompt the user to input a authname. display the provided message
- credential[4] = raw_input(credential[1] + ": ")
-
- # if the user just hits enter raw_input() returns an empty string.
- # in this case return the default result through the last item of
- # the list
- if len(credential[4]) == 0:
- credential[4] = credential[3]
- elif credential[0] == libvirt.VIR_CRED_NOECHOPROMPT:
- # use the getpass module to prompt the user to input a password.
- # display the provided message and return the result through the
- # last item of the list
- credential[4] = getpass.getpass(credential[1] + ": ")
- else:
- return -1
-
- return 0
-
-
-def print_section(title):
- print "\n%s" % title
- print "=" * 60
-
-
-def print_entry(key, value):
- print "%-10s %-10s" % (key, value)
-
-
-def print_xml(key, ctx, path):
- res = ctx.xpathEval(path)
-
- if res is None or len(res) == 0:
- value = "Unknown"
- else:
- value = res[0].content
-
- print_entry(key, value)
-
- return value
-
-
-if len(sys.argv) != 2:
- usage()
- sys.exit(2)
-
-
-hostname = sys.argv[1]
-
-# Connect to libvirt
-uri = "esx://%s/?no_verify=1" % hostname
-
-# The auth argument is a list that contains 3 items:
-# - a list of supported credential types
-# - a callable that takes 2 arguments
-# - user data that will be passed to the callable as second argument
-#
-# In this example the supported credential types are VIR_CRED_AUTHNAME and
-# VIR_CRED_NOECHOPROMPT, the callable is the unbound method request_credentials
-# (see above) and the user data is None.
-#
-# libvirt (actually the ESX driver) will call the callable to request
-# credentials in order to log into the ESX host. The callable would also be
-# called if the connection URI would reference a vCenter to request credentials
-# in order to log into the vCenter
-auth = [[libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_NOECHOPROMPT],
- request_credentials, None]
-conn = libvirt.openAuth(uri, auth, 0)
-
-if conn is None:
- print "Failed to open connection to %s" % hostname
- sys.exit(1)
-
-state_names = { libvirt.VIR_DOMAIN_RUNNING : "running",
- libvirt.VIR_DOMAIN_BLOCKED : "idle",
- libvirt.VIR_DOMAIN_PAUSED : "paused",
- libvirt.VIR_DOMAIN_SHUTDOWN : "in shutdown",
- libvirt.VIR_DOMAIN_SHUTOFF : "shut off",
- libvirt.VIR_DOMAIN_CRASHED : "crashed",
- libvirt.VIR_DOMAIN_NOSTATE : "no state" }
-
-for id in conn.listDomainsID():
- domain = conn.lookupByID(id)
- info = domain.info()
-
- print_section("Domain " + domain.name())
- print_entry("ID:", id)
- print_entry("UUID:", domain.UUIDString())
- print_entry("State:", state_names[info[0]])
- print_entry("MaxMem:", info[1])
- print_entry("UsedMem:", info[2])
- print_entry("VCPUs:", info[3])
-
- # Read some info from the XML desc
- print_section("Devices of " + domain.name())
-
- xmldesc = domain.XMLDesc(0)
- doc = libxml2.parseDoc(xmldesc)
- ctx = doc.xpathNewContext()
- devs = ctx.xpathEval("/domain/devices/*")
- first = True
-
- for d in devs:
- ctx.setContextNode(d)
-
- if not first:
- print "------------------------------------------------------------"
- else:
- first = False
-
- print_entry("Device", d.name)
-
- type = print_xml("Type:", ctx, "@type")
-
- if type == "file":
- print_xml("Source:", ctx, "source/@file")
- print_xml("Target:", ctx, "target/@dev")
- elif type == "block":
- print_xml("Source:", ctx, "source/@dev")
- print_xml("Target:", ctx, "target/@dev")
- elif type == "bridge":
- print_xml("Source:", ctx, "source/@bridge")
- print_xml("MAC Addr:", ctx, "mac/@address")
diff --git a/examples/python/topology.py b/examples/python/topology.py
deleted file mode 100755
index 62effe3..0000000
--- a/examples/python/topology.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-# Parse topology information from the capabilities XML and use
-# them to calculate host topology
-#
-# Authors:
-# Amador Pahim <apahim(a)redhat.com>
-# Peter Krempa <pkrempa(a)redhat.com>
-
-import libvirt
-import sys
-from xml.dom import minidom
-
-try:
- conn = libvirt.openReadOnly(None)
-except libvirt.libvirtError:
- print 'Failed to connect to the hypervisor'
- sys.exit(1)
-
-try:
- capsXML = conn.getCapabilities()
-except libvirt.libvirtError:
- print 'Failed to request capabilities'
- sys.exit(1)
-
-caps = minidom.parseString(capsXML)
-host = caps.getElementsByTagName('host')[0]
-cells = host.getElementsByTagName('cells')[0]
-total_cpus = cells.getElementsByTagName('cpu').length
-
-socketIds = []
-siblingsIds = []
-
-socketIds = [ proc.getAttribute('socket_id')
- for proc in cells.getElementsByTagName('cpu')
- if proc.getAttribute('socket_id') not in socketIds ]
-
-siblingsIds = [ proc.getAttribute('siblings')
- for proc in cells.getElementsByTagName('cpu')
- if proc.getAttribute('siblings') not in siblingsIds ]
-
-print "Host topology"
-print "NUMA nodes:", cells.getAttribute('num')
-print " Sockets:", len(set(socketIds))
-print " Cores:", len(set(siblingsIds))
-print " Threads:", total_cpus
diff --git a/libvirt.spec.in b/libvirt.spec.in
index bbce8b5..5bc53a0 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -126,7 +126,6 @@
%define with_libssh2 0%{!?_without_libssh2:0}
# Non-server/HV driver defaults which are always enabled
-%define with_python 0%{!?_without_python:1}
%define with_sasl 0%{!?_without_sasl:1}
@@ -425,7 +424,6 @@ BuildRequires: gettext-devel
BuildRequires: libtool
BuildRequires: /usr/bin/pod2man
%endif
-BuildRequires: python-devel
%if %{with_systemd}
BuildRequires: systemd-units
%endif
@@ -1145,19 +1143,6 @@ Includes the Sanlock lock manager plugin for the QEMU
driver
%endif
-%if %{with_python}
-%package python
-Summary: Python bindings for the libvirt library
-Group: Development/Libraries
-Requires: %{name}-client = %{version}-%{release}
-
-%description python
-The libvirt-python package contains a module that permits applications
-written in the Python programming language to use the interface
-supplied by the libvirt library to use the virtualization capabilities
-of recent versions of Linux (and other OSes).
-%endif
-
%prep
%setup -q
@@ -1222,10 +1207,6 @@ of recent versions of Linux (and other OSes).
%define _without_polkit --without-polkit
%endif
-%if ! %{with_python}
- %define _without_python --without-python
-%endif
-
%if ! %{with_libvirtd}
%define _without_libvirtd --without-libvirtd
%endif
@@ -1378,7 +1359,6 @@ of recent versions of Linux (and other OSes).
%{?_without_sasl} \
%{?_without_avahi} \
%{?_without_polkit} \
- %{?_without_python} \
%{?_without_libvirtd} \
%{?_without_uml} \
%{?_without_phyp} \
@@ -1432,14 +1412,12 @@ rm -fr %{buildroot}
# on RHEL 5, thus we need to expand it here.
make install DESTDIR=%{?buildroot} SYSTEMD_UNIT_DIR=%{_unitdir}
-for i in domain-events/events-c dominfo domsuspend hellolibvirt openauth python xml/nwfilter systemtap
+for i in domain-events/events-c dominfo domsuspend hellolibvirt openauth xml/nwfilter systemtap
do
(cd examples/$i ; make clean ; rm -rf .deps .libs Makefile Makefile.in)
done
rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
rm -f $RPM_BUILD_ROOT%{_libdir}/*.a
-rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.la
-rm -f $RPM_BUILD_ROOT%{_libdir}/python*/site-packages/*.a
rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/lock-driver/*.la
rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/lock-driver/*.a
%if %{with_driver_modules}
@@ -2105,18 +2083,6 @@ exit 0
%doc examples/xml
%doc examples/systemtap
-%if %{with_python}
-%files python
-%defattr(-, root, root)
-
-%{_libdir}/python*/site-packages/libvirt.py*
-%{_libdir}/python*/site-packages/libvirt_qemu.py*
-%{_libdir}/python*/site-packages/libvirt_lxc.py*
-%{_libdir}/python*/site-packages/libvirtmod*
-%doc examples/python
-%doc examples/domain-events/events-python
-%endif
-
%changelog
* Mon Nov 4 2013 Daniel Veillard <veillard(a)redhat.com> - 1.1.4-1
- Add support for AArch64 architecture
diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4
index 8f905cc..1547e03 100644
--- a/m4/virt-compile-warnings.m4
+++ b/m4/virt-compile-warnings.m4
@@ -217,14 +217,6 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
#endif
])
- dnl Needed to keep compile quiet on python 2.4
- save_WARN_CFLAGS=$WARN_CFLAGS
- WARN_CFLAGS=
- gl_WARN_ADD([-Wno-redundant-decls])
- WARN_PYTHON_CFLAGS=$WARN_CFLAGS
- AC_SUBST(WARN_PYTHON_CFLAGS)
- WARN_CFLAGS=$save_WARN_CFLAGS
-
if test "$gl_cv_warn_c__Wlogical_op" = yes &&
test "$lv_cv_gcc_wlogical_op_broken" = yes; then
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP], 1,
diff --git a/mingw-libvirt.spec.in b/mingw-libvirt.spec.in
index e13407e..1734a48 100644
--- a/mingw-libvirt.spec.in
+++ b/mingw-libvirt.spec.in
@@ -146,7 +146,6 @@ autoreconf -if
--without-sasl \
--without-avahi \
--without-polkit \
- --without-python \
--without-libvirtd \
--without-uml \
%{?_without_phyp} \
diff --git a/python/Makefile.am b/python/Makefile.am
deleted file mode 100644
index c9c2a8b..0000000
--- a/python/Makefile.am
+++ /dev/null
@@ -1,173 +0,0 @@
-# Makefile for libvirt python library
-
-## Copyright (C) 2005-2013 Red Hat, Inc.
-##
-## This library is free software; you can redistribute it and/or
-## modify it under the terms of the GNU Lesser General Public
-## License as published by the Free Software Foundation; either
-## version 2.1 of the License, or (at your option) any later version.
-##
-## This library is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-## Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public
-## License along with this library. If not, see
-## <http://www.gnu.org/licenses/>.
-
-INCLUDES = \
- $(PYTHON_INCLUDES) \
- -I$(top_builddir)/gnulib/lib \
- -I$(top_srcdir)/gnulib/lib \
- -I$(top_srcdir) \
- -I$(top_builddir)/src \
- -I$(top_srcdir)/src \
- -I$(top_srcdir)/src/util \
- -I$(top_builddir)/include \
- -I$(top_srcdir)/include \
- $(GETTEXT_CPPFLAGS)
-
-AM_CFLAGS = $(WARN_CFLAGS)
-AM_LDFLAGS = \
- $(RELRO_LDFLAGS) \
- $(NO_INDIRECT_LDFLAGS) \
- $(NULL)
-
-CLASSES_EXTRA = \
- libvirt-override-virConnect.py \
- libvirt-override-virDomain.py \
- libvirt-override-virDomainSnapshot.py \
- libvirt-override-virStoragePool.py \
- libvirt-override-virStream.py
-
-EXTRA_DIST = \
- generator.py \
- typewrappers.c \
- typewrappers.h \
- libvirt-override.c \
- libvirt-override.py \
- libvirt-override-api.xml \
- libvirt-lxc-override.c \
- libvirt-lxc-override-api.xml \
- libvirt-qemu-override.c \
- libvirt-qemu-override-api.xml \
- sanitytest.py \
- $(CLASSES_EXTRA) \
- $(DOCS)
-
-if WITH_PYTHON
-mylibs = \
- $(top_builddir)/src/libvirt.la \
- $(top_builddir)/gnulib/lib/libgnu.la
-myqemulibs = \
- $(top_builddir)/src/libvirt-qemu.la \
- $(top_builddir)/gnulib/lib/libgnu.la
-mylxclibs = \
- $(top_builddir)/src/libvirt-lxc.la \
- $(top_builddir)/gnulib/lib/libgnu.la
-
-all-local: libvirt.py libvirt_qemu.py libvirt_lxc.py
-
-pyexec_LTLIBRARIES = libvirtmod.la libvirtmod_qemu.la libvirtmod_lxc.la
-
-libvirtmod_la_SOURCES = libvirt-override.c typewrappers.c
-nodist_libvirtmod_la_SOURCES = libvirt.c libvirt.h
-# Python <= 2.4 header files contain a redundant decl, hence we
-# need extra flags here
-libvirtmod_la_CFLAGS = $(WARN_CFLAGS) $(WARN_PYTHON_CFLAGS)
-
-libvirtmod_la_LDFLAGS = -module -avoid-version -shared \
- -L$(top_builddir)/src/.libs \
- $(AM_LDFLAGS) \
- $(CYGWIN_EXTRA_LDFLAGS)
-libvirtmod_la_LIBADD = $(mylibs) \
- $(CYGWIN_EXTRA_LIBADD) $(CYGWIN_EXTRA_PYTHON_LIBADD)
-
-libvirtmod_qemu_la_SOURCES = libvirt-qemu-override.c typewrappers.c
-nodist_libvirtmod_qemu_la_SOURCES = libvirt-qemu.c libvirt-qemu.h
-# Python <= 2.4 header files contain a redundant decl, hence we
-# need extra flags here
-libvirtmod_qemu_la_CFLAGS = $(WARN_PYTHON_CFLAGS)
-
-libvirtmod_qemu_la_LDFLAGS = -module -avoid-version -shared \
- -L$(top_builddir)/src/.libs \
- $(AM_LDFLAGS) \
- $(CYGWIN_EXTRA_LDFLAGS)
-libvirtmod_qemu_la_LIBADD = $(myqemulibs) \
- $(CYGWIN_EXTRA_LIBADD) $(CYGWIN_EXTRA_PYTHON_LIBADD)
-
-libvirtmod_lxc_la_SOURCES = libvirt-lxc-override.c typewrappers.c
-nodist_libvirtmod_lxc_la_SOURCES = libvirt-lxc.c libvirt-lxc.h
-# Python <= 2.4 header files contain a redundant decl, hence we
-# need extra flags here
-libvirtmod_lxc_la_CFLAGS = $(WARN_PYTHON_CFLAGS)
-
-libvirtmod_lxc_la_LDFLAGS = -module -avoid-version -shared \
- -L$(top_builddir)/src/.libs \
- $(AM_LDFLAGS) \
- $(CYGWIN_EXTRA_LDFLAGS)
-libvirtmod_lxc_la_LIBADD = $(mylxclibs) \
- $(CYGWIN_EXTRA_LIBADD) $(CYGWIN_EXTRA_PYTHON_LIBADD)
-
-GENERATE = generator.py
-API_DESC = $(top_srcdir)/docs/libvirt-api.xml \
- $(srcdir)/libvirt-override-api.xml
-GENERATED= libvirt-export.c \
- libvirt.c \
- libvirt.h \
- libvirt.py
-
-QEMU_API_DESC = $(top_srcdir)/docs/libvirt-qemu-api.xml \
- $(srcdir)/libvirt-qemu-override-api.xml
-QEMU_GENERATED= libvirt-qemu-export.c \
- libvirt-qemu.c \
- libvirt-qemu.h \
- libvirt_qemu.py
-
-LXC_API_DESC = $(top_srcdir)/docs/libvirt-lxc-api.xml \
- $(srcdir)/libvirt-lxc-override-api.xml
-LXC_GENERATED= libvirt-lxc-export.c \
- libvirt-lxc.c \
- libvirt-lxc.h \
- libvirt_lxc.py
-
-$(GENERATE).stamp: $(srcdir)/$(GENERATE) \
- $(API_DESC) \
- $(QEMU_API_DESC) \
- $(LXC_API_DESC) \
- $(CLASSES_EXTRA)
- $(AM_V_GEN)$(PYTHON) $(srcdir)/$(GENERATE) $(PYTHON) && \
- touch $@
-
-$(GENERATED) $(QEMU_GENERATED) $(LXC_GENERATED): $(GENERATE).stamp
-
-$(libvirtmod_la_OBJECTS): $(GENERATED)
-$(libvirtmod_qemu_la_OBJECTS): $(QEMU_GENERATED)
-$(libvirtmod_lxc_la_OBJECTS): $(LXC_GENERATED)
-
-check-local:
- $(AM_V_GEN)../run $(PYTHON) $(srcdir)/sanitytest.py
-
-install-data-local:
- $(mkinstalldirs) $(DESTDIR)$(pyexecdir)
- $(INSTALL) -m 0644 libvirt.py $(DESTDIR)$(pyexecdir)
- $(INSTALL) -m 0644 libvirt_lxc.py $(DESTDIR)$(pyexecdir)
- $(INSTALL) -m 0644 libvirt_qemu.py $(DESTDIR)$(pyexecdir)
-
-uninstall-local:
- rm -f $(DESTDIR)$(pyexecdir)/libvirt.py
- rm -f $(DESTDIR)$(pyexecdir)/libvirt_lxc.py
- rm -f $(DESTDIR)$(pyexecdir)/libvirt_qemu.py
-
-CLEANFILES= $(GENERATED) $(QEMU_GENERATED) $(LXC_GENERATED) $(GENERATE).stamp \
- *.pyc
-
-else ! WITH_PYTHON
-all:
-endif ! WITH_PYTHON
-
-dummy:
-
-tests test: all dummy
- -@(cd tests && $(MAKE) MAKEFLAGS+=--silent tests)
diff --git a/python/README b/python/README
deleted file mode 100644
index 02d4cc4..0000000
--- a/python/README
+++ /dev/null
@@ -1,27 +0,0 @@
- libvirt Python Bindings README
- ==============================
-
-Most of the libvirt python binding code is automatically generated
-using the script generator.py, and the API description from
-docs/libvirt-api.xml
-
-
-Manually written files:
-
- - libvirt-override.c: methods where the C binding needs to be hand crafted
- - libvirt-override.py: global methods where the C and python bindings have different args
- - libvirt-override-api.xml: methods where the auto-extracted API docs are not
- suitable for python auto-generator. Overriding this if the method is going
- into libvirt-override.c, but we still want auto-generated libvirt-override.py
- - libvirt-override-virConnect.py: virConnect class methods
- - typewrappers.h,.c: Python object wrappers for each libvirt C object
-
-
-Auto-generated files:
-
- - libvirt.py: The main python binding. Comprises auto-generated code, along
- with contents from libvirt-override.py and libvirt-override-virConnect.py
- - libvirt.c, libvirt.h: The C glue layer for the python binding. Comprises
- auto-generated code, along with libvirt-override.c
- - libvirt-export.c: List of auto-generated C methods, included into
- the libvirt-override.c method table
diff --git a/python/generator.py b/python/generator.py
deleted file mode 100755
index 20f5dff..0000000
--- a/python/generator.py
+++ /dev/null
@@ -1,1976 +0,0 @@
-#!/usr/bin/python -u
-#
-# generate python wrappers from the XML API description
-#
-
-functions = {}
-lxc_functions = {}
-qemu_functions = {}
-enums = {} # { enumType: { enumConstant: enumValue } }
-lxc_enums = {} # { enumType: { enumConstant: enumValue } }
-qemu_enums = {} # { enumType: { enumConstant: enumValue } }
-
-import os
-import sys
-import string
-import re
-
-quiet=True
-
-if __name__ == "__main__":
- # launched as a script
- srcPref = os.path.dirname(sys.argv[0])
- if len(sys.argv) > 1:
- python = sys.argv[1]
- else:
- print "Python binary not specified"
- sys.exit(1)
-else:
- # imported
- srcPref = os.path.dirname(__file__)
-
-#######################################################################
-#
-# That part if purely the API acquisition phase from the
-# libvirt API description
-#
-#######################################################################
-import os
-import xml.sax
-
-debug = 0
-
-def getparser():
- # Attach parser to an unmarshalling object. return both objects.
- target = docParser()
- parser = xml.sax.make_parser()
- parser.setContentHandler(target)
- return parser, target
-
-class docParser(xml.sax.handler.ContentHandler):
- def __init__(self):
- self._methodname = None
- self._data = []
- self.in_function = 0
-
- self.startElement = self.start
- self.endElement = self.end
- self.characters = self.data
-
- def close(self):
- if debug:
- print "close"
-
- def getmethodname(self):
- return self._methodname
-
- def data(self, text):
- if debug:
- print "data %s" % text
- self._data.append(text)
-
- def cdata(self, text):
- if debug:
- print "data %s" % text
- self._data.append(text)
-
- def start(self, tag, attrs):
- if debug:
- print "start %s, %s" % (tag, attrs)
- if tag == 'function':
- self._data = []
- self.in_function = 1
- self.function = None
- self.function_cond = None
- self.function_args = []
- self.function_descr = None
- self.function_return = None
- self.function_file = None
- self.function_module= None
- if attrs.has_key('name'):
- self.function = attrs['name']
- if attrs.has_key('file'):
- self.function_file = attrs['file']
- if attrs.has_key('module'):
- self.function_module= attrs['module']
- elif tag == 'cond':
- self._data = []
- elif tag == 'info':
- self._data = []
- elif tag == 'arg':
- if self.in_function == 1:
- self.function_arg_name = None
- self.function_arg_type = None
- self.function_arg_info = None
- if attrs.has_key('name'):
- self.function_arg_name = attrs['name']
- if self.function_arg_name == 'from':
- self.function_arg_name = 'frm'
- if attrs.has_key('type'):
- self.function_arg_type = attrs['type']
- if attrs.has_key('info'):
- self.function_arg_info = attrs['info']
- elif tag == 'return':
- if self.in_function == 1:
- self.function_return_type = None
- self.function_return_info = None
- self.function_return_field = None
- if attrs.has_key('type'):
- self.function_return_type = attrs['type']
- if attrs.has_key('info'):
- self.function_return_info = attrs['info']
- if attrs.has_key('field'):
- self.function_return_field = attrs['field']
- elif tag == 'enum':
- # enums come from header files, hence virterror.h
- if (attrs['file'] == "libvirt" or
- attrs['file'] == "virterror"):
- enum(attrs['type'],attrs['name'],attrs['value'])
- elif attrs['file'] == "libvirt-lxc":
- lxc_enum(attrs['type'],attrs['name'],attrs['value'])
- elif attrs['file'] == "libvirt-qemu":
- qemu_enum(attrs['type'],attrs['name'],attrs['value'])
-
- def end(self, tag):
- if debug:
- print "end %s" % tag
- if tag == 'function':
- # fuctions come from source files, hence 'virerror.c'
- if self.function is not None:
- if (self.function_module == "libvirt" or
- self.function_module == "virevent" or
- self.function_module == "virerror"):
- function(self.function, self.function_descr,
- self.function_return, self.function_args,
- self.function_file, self.function_module,
- self.function_cond)
- elif self.function_module == "libvirt-lxc":
- lxc_function(self.function, self.function_descr,
- self.function_return, self.function_args,
- self.function_file, self.function_module,
- self.function_cond)
- elif self.function_module == "libvirt-qemu":
- qemu_function(self.function, self.function_descr,
- self.function_return, self.function_args,
- self.function_file, self.function_module,
- self.function_cond)
- elif self.function_file == "python":
- function(self.function, self.function_descr,
- self.function_return, self.function_args,
- self.function_file, self.function_module,
- self.function_cond)
- elif self.function_file == "python-lxc":
- lxc_function(self.function, self.function_descr,
- self.function_return, self.function_args,
- self.function_file, self.function_module,
- self.function_cond)
- elif self.function_file == "python-qemu":
- qemu_function(self.function, self.function_descr,
- self.function_return, self.function_args,
- self.function_file, self.function_module,
- self.function_cond)
- self.in_function = 0
- elif tag == 'arg':
- if self.in_function == 1:
- self.function_args.append([self.function_arg_name,
- self.function_arg_type,
- self.function_arg_info])
- elif tag == 'return':
- if self.in_function == 1:
- self.function_return = [self.function_return_type,
- self.function_return_info,
- self.function_return_field]
- elif tag == 'info':
- str = ''
- for c in self._data:
- str = str + c
- if self.in_function == 1:
- self.function_descr = str
- elif tag == 'cond':
- str = ''
- for c in self._data:
- str = str + c
- if self.in_function == 1:
- self.function_cond = str
-
-
-def function(name, desc, ret, args, file, module, cond):
- functions[name] = (desc, ret, args, file, module, cond)
-
-def qemu_function(name, desc, ret, args, file, module, cond):
- qemu_functions[name] = (desc, ret, args, file, module, cond)
-
-def lxc_function(name, desc, ret, args, file, module, cond):
- lxc_functions[name] = (desc, ret, args, file, module, cond)
-
-def enum(type, name, value):
- if not enums.has_key(type):
- enums[type] = {}
- if value == 'VIR_TYPED_PARAM_INT':
- value = 1
- elif value == 'VIR_TYPED_PARAM_UINT':
- value = 2
- elif value == 'VIR_TYPED_PARAM_LLONG':
- value = 3
- elif value == 'VIR_TYPED_PARAM_ULLONG':
- value = 4
- elif value == 'VIR_TYPED_PARAM_DOUBLE':
- value = 5
- elif value == 'VIR_TYPED_PARAM_BOOLEAN':
- value = 6
- elif value == 'VIR_DOMAIN_AFFECT_CURRENT':
- value = 0
- elif value == 'VIR_DOMAIN_AFFECT_LIVE':
- value = 1
- elif value == 'VIR_DOMAIN_AFFECT_CONFIG':
- value = 2
- if name[-5:] != '_LAST':
- enums[type][name] = value
-
-def lxc_enum(type, name, value):
- if not lxc_enums.has_key(type):
- lxc_enums[type] = {}
- lxc_enums[type][name] = value
-
-def qemu_enum(type, name, value):
- if not qemu_enums.has_key(type):
- qemu_enums[type] = {}
- qemu_enums[type][name] = value
-
-
-#######################################################################
-#
-# Some filtering rukes to drop functions/types which should not
-# be exposed as-is on the Python interface
-#
-#######################################################################
-
-functions_failed = []
-lxc_functions_failed = []
-qemu_functions_failed = []
-functions_skipped = [
- "virConnectListDomains",
-]
-lxc_functions_skipped = []
-qemu_functions_skipped = []
-
-skipped_modules = {
-}
-
-skipped_types = {
-# 'int *': "usually a return type",
- 'virConnectDomainEventCallback': "No function types in python",
- 'virConnectDomainEventGenericCallback': "No function types in python",
- 'virConnectDomainEventRTCChangeCallback': "No function types in python",
- 'virConnectDomainEventWatchdogCallback': "No function types in python",
- 'virConnectDomainEventIOErrorCallback': "No function types in python",
- 'virConnectDomainEventGraphicsCallback': "No function types in python",
- 'virStreamEventCallback': "No function types in python",
- 'virEventHandleCallback': "No function types in python",
- 'virEventTimeoutCallback': "No function types in python",
- 'virDomainBlockJobInfoPtr': "Not implemented yet",
-}
-
-#######################################################################
-#
-# Table of remapping to/from the python type or class to the C
-# counterpart.
-#
-#######################################################################
-
-py_types = {
- 'void': (None, None, None, None),
- 'int': ('i', None, "int", "int"),
- 'long': ('l', None, "long", "long"),
- 'double': ('d', None, "double", "double"),
- 'unsigned int': ('i', None, "int", "int"),
- 'unsigned long': ('l', None, "long", "long"),
- 'long long': ('L', None, "longlong", "long long"),
- 'unsigned long long': ('L', None, "longlong", "long long"),
- 'unsigned char *': ('z', None, "charPtr", "char *"),
- 'char *': ('z', None, "charPtr", "char *"),
- 'const char *': ('z', None, "constcharPtr", "const char *"),
- 'size_t': ('n', None, "size_t", "size_t"),
-
- 'virDomainPtr': ('O', "virDomain", "virDomainPtr", "virDomainPtr"),
- 'virDomain *': ('O', "virDomain", "virDomainPtr", "virDomainPtr"),
- 'const virDomain *': ('O', "virDomain", "virDomainPtr", "virDomainPtr"),
-
- 'virNetworkPtr': ('O', "virNetwork", "virNetworkPtr", "virNetworkPtr"),
- 'virNetwork *': ('O', "virNetwork", "virNetworkPtr", "virNetworkPtr"),
- 'const virNetwork *': ('O', "virNetwork", "virNetworkPtr", "virNetworkPtr"),
-
- 'virInterfacePtr': ('O', "virInterface", "virInterfacePtr", "virInterfacePtr"),
- 'virInterface *': ('O', "virInterface", "virInterfacePtr", "virInterfacePtr"),
- 'const virInterface *': ('O', "virInterface", "virInterfacePtr", "virInterfacePtr"),
-
- 'virStoragePoolPtr': ('O', "virStoragePool", "virStoragePoolPtr", "virStoragePoolPtr"),
- 'virStoragePool *': ('O', "virStoragePool", "virStoragePoolPtr", "virStoragePoolPtr"),
- 'const virStoragePool *': ('O', "virStoragePool", "virStoragePoolPtr", "virStoragePoolPtr"),
-
- 'virStorageVolPtr': ('O', "virStorageVol", "virStorageVolPtr", "virStorageVolPtr"),
- 'virStorageVol *': ('O', "virStorageVol", "virStorageVolPtr", "virStorageVolPtr"),
- 'const virStorageVol *': ('O', "virStorageVol", "virStorageVolPtr", "virStorageVolPtr"),
-
- 'virConnectPtr': ('O', "virConnect", "virConnectPtr", "virConnectPtr"),
- 'virConnect *': ('O', "virConnect", "virConnectPtr", "virConnectPtr"),
- 'const virConnect *': ('O', "virConnect", "virConnectPtr", "virConnectPtr"),
-
- 'virNodeDevicePtr': ('O', "virNodeDevice", "virNodeDevicePtr", "virNodeDevicePtr"),
- 'virNodeDevice *': ('O', "virNodeDevice", "virNodeDevicePtr", "virNodeDevicePtr"),
- 'const virNodeDevice *': ('O', "virNodeDevice", "virNodeDevicePtr", "virNodeDevicePtr"),
-
- 'virSecretPtr': ('O', "virSecret", "virSecretPtr", "virSecretPtr"),
- 'virSecret *': ('O', "virSecret", "virSecretPtr", "virSecretPtr"),
- 'const virSecret *': ('O', "virSecret", "virSecretPtr", "virSecretPtr"),
-
- 'virNWFilterPtr': ('O', "virNWFilter", "virNWFilterPtr", "virNWFilterPtr"),
- 'virNWFilter *': ('O', "virNWFilter", "virNWFilterPtr", "virNWFilterPtr"),
- 'const virNWFilter *': ('O', "virNWFilter", "virNWFilterPtr", "virNWFilterPtr"),
-
- 'virStreamPtr': ('O', "virStream", "virStreamPtr", "virStreamPtr"),
- 'virStream *': ('O', "virStream", "virStreamPtr", "virStreamPtr"),
- 'const virStream *': ('O', "virStream", "virStreamPtr", "virStreamPtr"),
-
- 'virDomainSnapshotPtr': ('O', "virDomainSnapshot", "virDomainSnapshotPtr", "virDomainSnapshotPtr"),
- 'virDomainSnapshot *': ('O', "virDomainSnapshot", "virDomainSnapshotPtr", "virDomainSnapshotPtr"),
- 'const virDomainSnapshot *': ('O', "virDomainSnapshot", "virDomainSnapshotPtr", "virDomainSnapshotPtr"),
-}
-
-py_return_types = {
-}
-
-unknown_types = {}
-
-foreign_encoding_args = (
-)
-
-#######################################################################
-#
-# This part writes the C <-> Python stubs libvirt.[ch] and
-# the table libvirt-export.c to add when registrering the Python module
-#
-#######################################################################
-
-# Class methods which are written by hand in libvirt.c but the Python-level
-# code is still automatically generated (so they are not in skip_function()).
-skip_impl = (
- 'virConnectGetVersion',
- 'virConnectGetLibVersion',
- 'virConnectListDomainsID',
- 'virConnectListDefinedDomains',
- 'virConnectListNetworks',
- 'virConnectListDefinedNetworks',
- 'virConnectListSecrets',
- 'virConnectListInterfaces',
- 'virConnectListStoragePools',
- 'virConnectListDefinedStoragePools',
- 'virConnectListStorageVols',
- 'virConnectListDefinedStorageVols',
- 'virConnectListDefinedInterfaces',
- 'virConnectListNWFilters',
- 'virDomainSnapshotListNames',
- 'virDomainSnapshotListChildrenNames',
- 'virConnGetLastError',
- 'virGetLastError',
- 'virDomainGetInfo',
- 'virDomainGetState',
- 'virDomainGetControlInfo',
- 'virDomainGetBlockInfo',
- 'virDomainGetJobInfo',
- 'virDomainGetJobStats',
- 'virNodeGetInfo',
- 'virDomainGetUUID',
- 'virDomainGetUUIDString',
- 'virDomainLookupByUUID',
- 'virNetworkGetUUID',
- 'virNetworkGetUUIDString',
- 'virNetworkLookupByUUID',
- 'virDomainGetAutostart',
- 'virNetworkGetAutostart',
- 'virDomainBlockStats',
- 'virDomainInterfaceStats',
- 'virDomainMemoryStats',
- 'virNodeGetCellsFreeMemory',
- 'virDomainGetSchedulerType',
- 'virDomainGetSchedulerParameters',
- 'virDomainGetSchedulerParametersFlags',
- 'virDomainSetSchedulerParameters',
- 'virDomainSetSchedulerParametersFlags',
- 'virDomainSetBlkioParameters',
- 'virDomainGetBlkioParameters',
- 'virDomainSetMemoryParameters',
- 'virDomainGetMemoryParameters',
- 'virDomainSetNumaParameters',
- 'virDomainGetNumaParameters',
- 'virDomainGetVcpus',
- 'virDomainPinVcpu',
- 'virDomainPinVcpuFlags',
- 'virDomainGetVcpuPinInfo',
- 'virDomainGetEmulatorPinInfo',
- 'virDomainPinEmulator',
- 'virSecretGetValue',
- 'virSecretSetValue',
- 'virSecretGetUUID',
- 'virSecretGetUUIDString',
- 'virSecretLookupByUUID',
- 'virNWFilterGetUUID',
- 'virNWFilterGetUUIDString',
- 'virNWFilterLookupByUUID',
- 'virStoragePoolGetUUID',
- 'virStoragePoolGetUUIDString',
- 'virStoragePoolLookupByUUID',
- 'virStoragePoolGetInfo',
- 'virStorageVolGetInfo',
- 'virStoragePoolGetAutostart',
- 'virStoragePoolListVolumes',
- 'virDomainBlockPeek',
- 'virDomainMemoryPeek',
- 'virEventRegisterImpl',
- 'virNodeListDevices',
- 'virNodeDeviceListCaps',
- 'virConnectBaselineCPU',
- 'virDomainRevertToSnapshot',
- 'virDomainSendKey',
- 'virNodeGetCPUStats',
- 'virNodeGetMemoryStats',
- 'virDomainGetBlockJobInfo',
- 'virDomainMigrateGetCompressionCache',
- 'virDomainMigrateGetMaxSpeed',
- 'virDomainBlockStatsFlags',
- 'virDomainSetBlockIoTune',
- 'virDomainGetBlockIoTune',
- 'virDomainSetInterfaceParameters',
- 'virDomainGetInterfaceParameters',
- 'virDomainGetCPUStats',
- 'virDomainGetDiskErrors',
- 'virNodeGetMemoryParameters',
- 'virNodeSetMemoryParameters',
- 'virNodeGetCPUMap',
- 'virDomainMigrate3',
- 'virDomainMigrateToURI3',
- 'virConnectGetCPUModelNames',
-)
-
-lxc_skip_impl = (
- 'virDomainLxcOpenNamespace',
-)
-
-qemu_skip_impl = (
- 'virDomainQemuMonitorCommand',
- 'virDomainQemuAgentCommand',
-)
-
-
-# These are functions which the generator skips completly - no python
-# or C code is generated. Generally should not be used for any more
-# functions than those already listed
-skip_function = (
- 'virConnectListDomains', # Python API is called virConectListDomainsID for unknown reasons
- 'virConnSetErrorFunc', # Not used in Python API XXX is this a bug ?
- 'virResetError', # Not used in Python API XXX is this a bug ?
- 'virGetVersion', # Python C code is manually written
- 'virSetErrorFunc', # Python API is called virRegisterErrorHandler for unknown reasons
- 'virConnCopyLastError', # Python API is called virConnGetLastError instead
- 'virCopyLastError', # Python API is called virGetLastError instead
- 'virConnectOpenAuth', # Python C code is manually written
- 'virDefaultErrorFunc', # Python virErrorFuncHandler impl calls this from C
- 'virDomainGetSecurityLabel', # Needs investigation...
- 'virDomainGetSecurityLabelList', # Needs investigation...
- 'virNodeGetSecurityModel', # Needs investigation...
- 'virConnectDomainEventRegister', # overridden in virConnect.py
- 'virConnectDomainEventDeregister', # overridden in virConnect.py
- 'virConnectDomainEventRegisterAny', # overridden in virConnect.py
- 'virConnectDomainEventDeregisterAny', # overridden in virConnect.py
- 'virSaveLastError', # We have our own python error wrapper
- 'virFreeError', # Only needed if we use virSaveLastError
- 'virConnectListAllDomains', # overridden in virConnect.py
- 'virDomainListAllSnapshots', # overridden in virDomain.py
- 'virDomainSnapshotListAllChildren', # overridden in virDomainSnapshot.py
- 'virConnectListAllStoragePools', # overridden in virConnect.py
- 'virStoragePoolListAllVolumes', # overridden in virStoragePool.py
- 'virConnectListAllNetworks', # overridden in virConnect.py
- 'virConnectListAllInterfaces', # overridden in virConnect.py
- 'virConnectListAllNodeDevices', # overridden in virConnect.py
- 'virConnectListAllNWFilters', # overridden in virConnect.py
- 'virConnectListAllSecrets', # overridden in virConnect.py
-
- 'virStreamRecvAll', # Pure python libvirt-override-virStream.py
- 'virStreamSendAll', # Pure python libvirt-override-virStream.py
- 'virStreamRecv', # overridden in libvirt-override-virStream.py
- 'virStreamSend', # overridden in libvirt-override-virStream.py
-
- 'virConnectUnregisterCloseCallback', # overridden in virConnect.py
- 'virConnectRegisterCloseCallback', # overridden in virConnect.py
-
- 'virDomainCreateXMLWithFiles', # overridden in virConnect.py
- 'virDomainCreateWithFiles', # overridden in virDomain.py
-
- # 'Ref' functions have no use for bindings users.
- "virConnectRef",
- "virDomainRef",
- "virInterfaceRef",
- "virNetworkRef",
- "virNodeDeviceRef",
- "virSecretRef",
- "virNWFilterRef",
- "virStoragePoolRef",
- "virStorageVolRef",
- 'virStreamRef',
-
- # This functions shouldn't be called via the bindings (and even the docs
- # contain an explicit warning to that effect). The equivalent should be
- # implemented in pure python for each class
- "virDomainGetConnect",
- "virInterfaceGetConnect",
- "virNetworkGetConnect",
- "virSecretGetConnect",
- "virNWFilterGetConnect",
- "virStoragePoolGetConnect",
- "virStorageVolGetConnect",
- "virDomainSnapshotGetConnect",
- "virDomainSnapshotGetDomain",
-
- # only useful in C code, python code uses dict for typed parameters
- "virTypedParamsAddBoolean",
- "virTypedParamsAddDouble",
- "virTypedParamsAddFromString",
- "virTypedParamsAddInt",
- "virTypedParamsAddLLong",
- "virTypedParamsAddString",
- "virTypedParamsAddUInt",
- "virTypedParamsAddULLong",
- "virTypedParamsClear",
- "virTypedParamsFree",
- "virTypedParamsGet",
- "virTypedParamsGetBoolean",
- "virTypedParamsGetDouble",
- "virTypedParamsGetInt",
- "virTypedParamsGetLLong",
- "virTypedParamsGetString",
- "virTypedParamsGetUInt",
- "virTypedParamsGetULLong",
-)
-
-lxc_skip_function = (
- "virDomainLxcEnterNamespace",
- "virDomainLxcEnterSecurityLabel",
-)
-qemu_skip_function = (
- #"virDomainQemuAttach",
-)
-
-# Generate C code, but skip python impl
-function_skip_python_impl = (
- "virStreamFree", # Needed in custom virStream __del__, but free shouldn't
- # be exposed in bindings
-)
-
-lxc_function_skip_python_impl = ()
-qemu_function_skip_python_impl = ()
-
-function_skip_index_one = (
- "virDomainRevertToSnapshot",
-)
-
-def print_function_wrapper(module, name, output, export, include):
- global py_types
- global unknown_types
- global functions
- global lxc_functions
- global qemu_functions
- global skipped_modules
- global function_skip_python_impl
-
- try:
- if module == "libvirt":
- (desc, ret, args, file, mod, cond) = functions[name]
- if module == "libvirt-lxc":
- (desc, ret, args, file, mod, cond) = lxc_functions[name]
- if module == "libvirt-qemu":
- (desc, ret, args, file, mod, cond) = qemu_functions[name]
- except:
- print "failed to get function %s infos" % name
- return
-
- if skipped_modules.has_key(module):
- return 0
-
- if module == "libvirt":
- if name in skip_function:
- return 0
- if name in skip_impl:
- # Don't delete the function entry in the caller.
- return 1
- elif module == "libvirt-lxc":
- if name in lxc_skip_function:
- return 0
- if name in lxc_skip_impl:
- # Don't delete the function entry in the caller.
- return 1
- elif module == "libvirt-qemu":
- if name in qemu_skip_function:
- return 0
- if name in qemu_skip_impl:
- # Don't delete the function entry in the caller.
- return 1
-
- c_call = ""
- format=""
- format_args=""
- c_args=""
- c_return=""
- c_convert=""
- num_bufs=0
- for arg in args:
- # This should be correct
- if arg[1][0:6] == "const ":
- arg[1] = arg[1][6:]
- c_args = c_args + " %s %s;\n" % (arg[1], arg[0])
- if py_types.has_key(arg[1]):
- (f, t, n, c) = py_types[arg[1]]
- if (f == 'z') and (name in foreign_encoding_args) and (num_bufs == 0):
- f = 't#'
- if f is not None:
- format = format + f
- if t is not None:
- format_args = format_args + ", &pyobj_%s" % (arg[0])
- c_args = c_args + " PyObject *pyobj_%s;\n" % (arg[0])
- c_convert = c_convert + \
- " %s = (%s) Py%s_Get(pyobj_%s);\n" % (arg[0],
- arg[1], t, arg[0])
- else:
- format_args = format_args + ", &%s" % (arg[0])
- if f == 't#':
- format_args = format_args + ", &py_buffsize%d" % num_bufs
- c_args = c_args + " int py_buffsize%d;\n" % num_bufs
- num_bufs = num_bufs + 1
- if c_call != "":
- c_call = c_call + ", "
- c_call = c_call + "%s" % (arg[0])
- else:
- if skipped_types.has_key(arg[1]):
- return 0
- if unknown_types.has_key(arg[1]):
- lst = unknown_types[arg[1]]
- lst.append(name)
- else:
- unknown_types[arg[1]] = [name]
- return -1
- if format != "":
- format = format + ":%s" % (name)
-
- if ret[0] == 'void':
- if file == "python_accessor":
- if args[1][1] == "char *":
- c_call = "\n VIR_FREE(%s->%s);\n" % (
- args[0][0], args[1][0], args[0][0], args[1][0])
- c_call = c_call + " %s->%s = (%s)strdup((const xmlChar *)%s);\n" % (args[0][0],
- args[1][0], args[1][1], args[1][0])
- else:
- c_call = "\n %s->%s = %s;\n" % (args[0][0], args[1][0],
- args[1][0])
- else:
- c_call = "\n %s(%s);\n" % (name, c_call)
- ret_convert = " Py_INCREF(Py_None);\n return Py_None;\n"
- elif py_types.has_key(ret[0]):
- (f, t, n, c) = py_types[ret[0]]
- c_return = " %s c_retval;\n" % (ret[0])
- if file == "python_accessor" and ret[2] is not None:
- c_call = "\n c_retval = %s->%s;\n" % (args[0][0], ret[2])
- else:
- c_call = "\n c_retval = %s(%s);\n" % (name, c_call)
- ret_convert = " py_retval = libvirt_%sWrap((%s) c_retval);\n" % (n,c)
- ret_convert = ret_convert + " return py_retval;\n"
- elif py_return_types.has_key(ret[0]):
- (f, t, n, c) = py_return_types[ret[0]]
- c_return = " %s c_retval;\n" % (ret[0])
- c_call = "\n c_retval = %s(%s);\n" % (name, c_call)
- ret_convert = " py_retval = libvirt_%sWrap((%s) c_retval);\n" % (n,c)
- ret_convert = ret_convert + " return py_retval;\n"
- else:
- if skipped_types.has_key(ret[0]):
- return 0
- if unknown_types.has_key(ret[0]):
- lst = unknown_types[ret[0]]
- lst.append(name)
- else:
- unknown_types[ret[0]] = [name]
- return -1
-
- if cond is not None and cond != "":
- include.write("#if %s\n" % cond)
- export.write("#if %s\n" % cond)
- output.write("#if %s\n" % cond)
-
- include.write("PyObject * ")
- if module == "libvirt":
- include.write("libvirt_%s(PyObject *self, PyObject *args);\n" % (name))
- export.write(" { (char *)\"%s\", libvirt_%s, METH_VARARGS, NULL },\n" %
- (name, name))
- elif module == "libvirt-lxc":
- include.write("libvirt_lxc_%s(PyObject *self, PyObject *args);\n" % (name))
- export.write(" { (char *)\"%s\", libvirt_lxc_%s, METH_VARARGS, NULL },\n" %
- (name, name))
- elif module == "libvirt-qemu":
- include.write("libvirt_qemu_%s(PyObject *self, PyObject *args);\n" % (name))
- export.write(" { (char *)\"%s\", libvirt_qemu_%s, METH_VARARGS, NULL },\n" %
- (name, name))
-
- if file == "python":
- # Those have been manually generated
- if cond is not None and cond != "":
- include.write("#endif\n")
- export.write("#endif\n")
- output.write("#endif\n")
- return 1
- if file == "python_accessor" and ret[0] != "void" and ret[2] is None:
- # Those have been manually generated
- if cond is not None and cond != "":
- include.write("#endif\n")
- export.write("#endif\n")
- output.write("#endif\n")
- return 1
-
- output.write("PyObject *\n")
- if module == "libvirt":
- output.write("libvirt_%s(PyObject *self ATTRIBUTE_UNUSED," % (name))
- elif module == "libvirt-lxc":
- output.write("libvirt_lxc_%s(PyObject *self ATTRIBUTE_UNUSED," % (name))
- elif module == "libvirt-qemu":
- output.write("libvirt_qemu_%s(PyObject *self ATTRIBUTE_UNUSED," % (name))
- output.write(" PyObject *args")
- if format == "":
- output.write(" ATTRIBUTE_UNUSED")
- output.write(") {\n")
- if ret[0] != 'void':
- output.write(" PyObject *py_retval;\n")
- if c_return != "":
- output.write(c_return)
- if c_args != "":
- output.write(c_args)
- if format != "":
- output.write("\n if (!PyArg_ParseTuple(args, (char *)\"%s\"%s))\n" %
- (format, format_args))
- output.write(" return NULL;\n")
- if c_convert != "":
- output.write(c_convert + "\n")
-
- output.write(" LIBVIRT_BEGIN_ALLOW_THREADS;")
- output.write(c_call)
- output.write(" LIBVIRT_END_ALLOW_THREADS;\n")
- output.write(ret_convert)
- output.write("}\n\n")
- if cond is not None and cond != "":
- include.write("#endif /* %s */\n" % cond)
- export.write("#endif /* %s */\n" % cond)
- output.write("#endif /* %s */\n" % cond)
-
- if module == "libvirt":
- if name in function_skip_python_impl:
- return 0
- elif module == "libvirt-lxc":
- if name in lxc_function_skip_python_impl:
- return 0
- elif module == "libvirt-qemu":
- if name in qemu_function_skip_python_impl:
- return 0
- return 1
-
-def buildStubs(module):
- global py_types
- global py_return_types
- global unknown_types
-
- if module not in ["libvirt", "libvirt-qemu", "libvirt-lxc"]:
- print "ERROR: Unknown module type: %s" % module
- return None
-
- if module == "libvirt":
- funcs = functions
- funcs_failed = functions_failed
- funcs_skipped = functions_skipped
- elif module == "libvirt-lxc":
- funcs = lxc_functions
- funcs_failed = lxc_functions_failed
- funcs_skipped = lxc_functions_skipped
- elif module == "libvirt-qemu":
- funcs = qemu_functions
- funcs_failed = qemu_functions_failed
- funcs_skipped = qemu_functions_skipped
-
- api_xml = "%s-api.xml" % module
-
- try:
- f = open(os.path.join(srcPref,api_xml))
- data = f.read()
- f.close()
- (parser, target) = getparser()
- parser.feed(data)
- parser.close()
- except IOError, msg:
- try:
- f = open(os.path.join(srcPref,"..","docs",api_xml))
- data = f.read()
- f.close()
- (parser, target) = getparser()
- parser.feed(data)
- parser.close()
- except IOError, msg:
- print file, ":", msg
- sys.exit(1)
-
- n = len(funcs.keys())
- if not quiet:
- print "Found %d functions in %s" % ((n), api_xml)
-
- override_api_xml = "%s-override-api.xml" % module
- py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject")
-
- try:
- f = open(os.path.join(srcPref, override_api_xml))
- data = f.read()
- f.close()
- (parser, target) = getparser()
- parser.feed(data)
- parser.close()
- except IOError, msg:
- print file, ":", msg
-
- if not quiet:
- # XXX: This is not right, same function already in @functions
- # will be overwritten.
- print "Found %d functions in %s" % ((len(funcs.keys()) - n), override_api_xml)
- nb_wrap = 0
- failed = 0
- skipped = 0
-
- header_file = "%s.h" % module
- export_file = "%s-export.c" % module
- wrapper_file = "%s.c" % module
-
- include = open(header_file, "w")
- include.write("/* Generated */\n\n")
-
- export = open(export_file, "w")
- export.write("/* Generated */\n\n")
-
- wrapper = open(wrapper_file, "w")
- wrapper.write("/* Generated by generator.py */\n\n")
- wrapper.write("#include <config.h>\n")
- wrapper.write("#include <Python.h>\n")
- wrapper.write("#include <libvirt/" + module + ".h>\n")
- wrapper.write("#include \"typewrappers.h\"\n")
- wrapper.write("#include \"" + module + ".h\"\n\n")
-
- for function in funcs.keys():
- # Skip the functions which are not for the module
- ret = print_function_wrapper(module, function, wrapper, export, include)
- if ret < 0:
- failed = failed + 1
- funcs_failed.append(function)
- del funcs[function]
- if ret == 0:
- skipped = skipped + 1
- funcs_skipped.append(function)
- del funcs[function]
- if ret == 1:
- nb_wrap = nb_wrap + 1
- include.close()
- export.close()
- wrapper.close()
-
- if not quiet:
- print "Generated %d wrapper functions" % nb_wrap
-
- if unknown_types:
- print "Missing type converters: "
- for type in unknown_types.keys():
- print "%s:%d " % (type, len(unknown_types[type])),
-
- for f in funcs_failed:
- print "ERROR: failed %s" % f
-
- if failed > 0:
- return -1
- if len(unknown_types) > 0:
- return -1
- return 0
-
-#######################################################################
-#
-# This part writes part of the Python front-end classes based on
-# mapping rules between types and classes and also based on function
-# renaming to get consistent function names at the Python level
-#
-#######################################################################
-
-#
-# The type automatically remapped to generated classes
-#
-classes_type = {
- "virDomainPtr": ("._o", "virDomain(self,_obj=%s)", "virDomain"),
- "virDomain *": ("._o", "virDomain(self, _obj=%s)", "virDomain"),
- "virNetworkPtr": ("._o", "virNetwork(self, _obj=%s)", "virNetwork"),
- "virNetwork *": ("._o", "virNetwork(self, _obj=%s)", "virNetwork"),
- "virInterfacePtr": ("._o", "virInterface(self, _obj=%s)", "virInterface"),
- "virInterface *": ("._o", "virInterface(self, _obj=%s)", "virInterface"),
- "virStoragePoolPtr": ("._o", "virStoragePool(self, _obj=%s)", "virStoragePool"),
- "virStoragePool *": ("._o", "virStoragePool(self, _obj=%s)", "virStoragePool"),
- "virStorageVolPtr": ("._o", "virStorageVol(self, _obj=%s)", "virStorageVol"),
- "virStorageVol *": ("._o", "virStorageVol(self, _obj=%s)", "virStorageVol"),
- "virNodeDevicePtr": ("._o", "virNodeDevice(self, _obj=%s)", "virNodeDevice"),
- "virNodeDevice *": ("._o", "virNodeDevice(self, _obj=%s)", "virNodeDevice"),
- "virSecretPtr": ("._o", "virSecret(self, _obj=%s)", "virSecret"),
- "virSecret *": ("._o", "virSecret(self, _obj=%s)", "virSecret"),
- "virNWFilterPtr": ("._o", "virNWFilter(self, _obj=%s)", "virNWFilter"),
- "virNWFilter *": ("._o", "virNWFilter(self, _obj=%s)", "virNWFilter"),
- "virStreamPtr": ("._o", "virStream(self, _obj=%s)", "virStream"),
- "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 = {
-}
-
-primary_classes = ["virDomain", "virNetwork", "virInterface",
- "virStoragePool", "virStorageVol",
- "virConnect", "virNodeDevice", "virSecret",
- "virNWFilter", "virStream", "virDomainSnapshot"]
-
-classes_ancestor = {
-}
-
-classes_destructors = {
- "virDomain": "virDomainFree",
- "virNetwork": "virNetworkFree",
- "virInterface": "virInterfaceFree",
- "virStoragePool": "virStoragePoolFree",
- "virStorageVol": "virStorageVolFree",
- "virNodeDevice" : "virNodeDeviceFree",
- "virSecret": "virSecretFree",
- "virNWFilter": "virNWFilterFree",
- "virDomainSnapshot": "virDomainSnapshotFree",
- # We hand-craft __del__ for this one
- #"virStream": "virStreamFree",
-}
-
-class_skip_connect_impl = {
- "virConnect" : True,
-}
-
-class_domain_impl = {
- "virDomainSnapshot": True,
-}
-
-functions_noexcept = {
- 'virDomainGetID': True,
- 'virDomainGetName': True,
- 'virNetworkGetName': True,
- 'virInterfaceGetName': True,
- 'virStoragePoolGetName': True,
- 'virStorageVolGetName': True,
- 'virStorageVolGetkey': True,
- 'virNodeDeviceGetName': True,
- 'virNodeDeviceGetParent': True,
- 'virSecretGetUsageType': True,
- 'virSecretGetUsageID': True,
- 'virNWFilterGetName': True,
-}
-
-reference_keepers = {
-}
-
-function_classes = {}
-
-function_classes["None"] = []
-
-function_post = {}
-
-# Functions returning an integral type which need special rules to
-# check for errors and raise exceptions.
-functions_int_exception_test = {
- 'virDomainGetMaxMemory': "%s == 0",
-}
-functions_int_default_test = "%s == -1"
-
-def is_integral_type (name):
- return not re.search ("^(unsigned)? ?(int|long)$", name) is None
-
-def is_optional_arg(info):
- return re.search("^\(?\optional\)?", info) is not None
-# Functions returning lists which need special rules to check for errors
-# and raise exceptions.
-functions_list_exception_test = {
-}
-functions_list_default_test = "%s is None"
-
-def is_python_noninteger_type (name):
-
- return name[-1:] == "*"
-
-def nameFixup(name, classe, type, file):
- # avoid a desastrous clash
- listname = classe + "List"
- ll = len(listname)
- l = len(classe)
- if name[0:l] == listname:
- func = name[l:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:16] == "virNetworkDefine":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:19] == "virNetworkCreateXML":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:16] == "virNetworkLookup":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:18] == "virInterfaceDefine":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:21] == "virInterfaceCreateXML":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:18] == "virInterfaceLookup":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:15] == "virSecretDefine":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:15] == "virSecretLookup":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:17] == "virNWFilterDefine":
- func = name[3:]
- func = string.lower(func[0:3]) + func[3:]
- elif name[0:17] == "virNWFilterLookup":
- func = name[3:]
- func = string.lower(func[0:3]) + func[3:]
- elif name[0:20] == "virStoragePoolDefine":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:23] == "virStoragePoolCreateXML":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:20] == "virStoragePoolLookup":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:19] == "virStorageVolDefine":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:19] == "virStorageVolLookup":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:20] == "virDomainGetCPUStats":
- func = name[9:]
- func = string.lower(func[0:1]) + func[1:]
- 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:28] == "virDomainSnapshotNumChildren":
- func = name[17:]
- 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:]
- elif name[0:13] == "virNetworkGet":
- func = name[13:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:10] == "virNetwork":
- func = name[10:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:15] == "virInterfaceGet":
- func = name[15:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:12] == "virInterface":
- func = name[12:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:12] == 'virSecretGet':
- func = name[12:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:9] == 'virSecret':
- func = name[9:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:14] == 'virNWFilterGet':
- func = name[14:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:11] == 'virNWFilter':
- func = name[11:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:12] == 'virStreamNew':
- func = "newStream"
- elif name[0:9] == 'virStream':
- func = name[9:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:17] == "virStoragePoolGet":
- func = name[17:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:14] == "virStoragePool":
- func = name[14:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:16] == "virStorageVolGet":
- func = name[16:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:13] == "virStorageVol":
- func = name[13:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:13] == "virNodeDevice":
- if name[13:16] == "Get":
- func = string.lower(name[16]) + name[17:]
- elif name[13:19] == "Lookup" or name[13:19] == "Create":
- func = string.lower(name[3]) + name[4:]
- else:
- func = string.lower(name[13]) + name[14:]
- elif name[0:7] == "virNode":
- func = name[7:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:10] == "virConnect":
- func = name[10:]
- func = string.lower(func[0:1]) + func[1:]
- elif name[0:3] == "xml":
- func = name[3:]
- func = string.lower(func[0:1]) + func[1:]
- else:
- func = name
- if func == "iD":
- func = "ID"
- if func == "uUID":
- func = "UUID"
- if func == "uUIDString":
- func = "UUIDString"
- if func == "oSType":
- func = "OSType"
- if func == "xMLDesc":
- func = "XMLDesc"
- if func == "mACString":
- func = "MACString"
-
- return func
-
-
-def functionCompare(info1, info2):
- (index1, func1, name1, ret1, args1, file1, mod1) = info1
- (index2, func2, name2, ret2, args2, file2, mod2) = info2
- if file1 == file2:
- if func1 < func2:
- return -1
- if func1 > func2:
- return 1
- if file1 == "python_accessor":
- return -1
- if file2 == "python_accessor":
- return 1
- if file1 < file2:
- return -1
- if file1 > file2:
- return 1
- return 0
-
-def writeDoc(module, name, args, indent, output):
- if module == "libvirt":
- funcs = functions
- elif module == "libvirt-lxc":
- funcs = lxc_functions
- elif module == "libvirt-qemu":
- funcs = qemu_functions
- if funcs[name][0] is None or funcs[name][0] == "":
- return
- val = funcs[name][0]
- val = string.replace(val, "NULL", "None")
- output.write(indent)
- output.write('"""')
- i = string.find(val, "\n")
- while i >= 0:
- str = val[0:i+1]
- val = val[i+1:]
- output.write(str)
- i = string.find(val, "\n")
- output.write(indent)
- output.write(val)
- output.write(' """\n')
-
-def buildWrappers(module):
- global ctypes
- global py_types
- global py_return_types
- global unknown_types
- global functions
- global function_classes
- global classes_type
- global classes_list
- global primary_classes
- global classes_ancestor
- global converter_type
- global classes_destructors
- global functions_noexcept
-
- if not module == "libvirt":
- print "ERROR: Unknown module type: %s" % module
- return None
-
- for type in classes_type.keys():
- function_classes[classes_type[type][2]] = []
-
- #
- # Build the list of C types to look for ordered to start
- # with primary classes
- #
- ctypes = []
- classes_list = []
- ctypes_processed = {}
- classes_processed = {}
- for classe in primary_classes:
- classes_list.append(classe)
- classes_processed[classe] = ()
- for type in classes_type.keys():
- tinfo = classes_type[type]
- if tinfo[2] == classe:
- ctypes.append(type)
- ctypes_processed[type] = ()
- for type in classes_type.keys():
- if ctypes_processed.has_key(type):
- continue
- tinfo = classes_type[type]
- if not classes_processed.has_key(tinfo[2]):
- classes_list.append(tinfo[2])
- classes_processed[tinfo[2]] = ()
-
- ctypes.append(type)
- ctypes_processed[type] = ()
-
- for name in functions.keys():
- found = 0
- (desc, ret, args, file, mod, cond) = functions[name]
- for type in ctypes:
- classe = classes_type[type][2]
-
- if name[0:3] == "vir" and len(args) >= 1 and args[0][1] == type:
- found = 1
- func = nameFixup(name, classe, type, file)
- info = (0, func, name, ret, args, file, mod)
- function_classes[classe].append(info)
- elif name[0:3] == "vir" and len(args) >= 2 and args[1][1] == type \
- and file != "python_accessor" and not name in function_skip_index_one:
- found = 1
- func = nameFixup(name, classe, type, file)
- info = (1, func, name, ret, args, file, mod)
- function_classes[classe].append(info)
- if found == 1:
- continue
- func = nameFixup(name, "None", file, file)
- info = (0, func, name, ret, args, file, mod)
- function_classes['None'].append(info)
-
- classes_file = "%s.py" % module
- extra_file = os.path.join(srcPref, "%s-override.py" % module)
- extra = None
-
- classes = open(classes_file, "w")
-
- if os.path.exists(extra_file):
- extra = open(extra_file, "r")
- classes.write("#! " + python + " -i\n")
- classes.write("#\n")
- classes.write("# WARNING WARNING WARNING WARNING\n")
- classes.write("#\n")
- classes.write("# This file is automatically written by generator.py. Any changes\n")
- classes.write("# made here will be lost.\n")
- classes.write("#\n")
- classes.write("# To change the manually written methods edit " + module + "-override.py\n")
- classes.write("# To change the automatically written methods edit generator.py\n")
- classes.write("#\n")
- classes.write("# WARNING WARNING WARNING WARNING\n")
- classes.write("#\n")
- if extra is not None:
- classes.writelines(extra.readlines())
- classes.write("#\n")
- classes.write("# WARNING WARNING WARNING WARNING\n")
- classes.write("#\n")
- classes.write("# Automatically written part of python bindings for libvirt\n")
- classes.write("#\n")
- classes.write("# WARNING WARNING WARNING WARNING\n")
- if extra is not None:
- extra.close()
-
- if function_classes.has_key("None"):
- flist = function_classes["None"]
- flist.sort(functionCompare)
- oldfile = ""
- for info in flist:
- (index, func, name, ret, args, file, mod) = info
- if file != oldfile:
- classes.write("#\n# Functions from module %s\n#\n\n" % file)
- oldfile = file
- classes.write("def %s(" % func)
- n = 0
- for arg in args:
- if n != 0:
- classes.write(", ")
- classes.write("%s" % arg[0])
- if arg[0] == "flags" or is_optional_arg(arg[2]):
- if is_integral_type(arg[1]):
- classes.write("=0")
- else:
- classes.write("=None")
- n = n + 1
- classes.write("):\n")
- writeDoc(module, name, args, ' ', classes)
-
- for arg in args:
- if classes_type.has_key(arg[1]):
- classes.write(" if %s is None: %s__o = None\n" %
- (arg[0], arg[0]))
- classes.write(" else: %s__o = %s%s\n" %
- (arg[0], arg[0], classes_type[arg[1]][0]))
- if ret[0] != "void":
- classes.write(" ret = ")
- else:
- classes.write(" ")
- classes.write("libvirtmod.%s(" % name)
- n = 0
- for arg in args:
- if n != 0:
- classes.write(", ")
- classes.write("%s" % arg[0])
- if classes_type.has_key(arg[1]):
- classes.write("__o")
- n = n + 1
- classes.write(")\n")
-
- if ret[0] != "void":
- if classes_type.has_key(ret[0]):
- #
- # Raise an exception
- #
- if functions_noexcept.has_key(name):
- classes.write(" if ret is None:return None\n")
- else:
- classes.write(
- " if ret is None:raise libvirtError('%s() failed')\n" %
- (name))
-
- classes.write(" return ")
- classes.write(classes_type[ret[0]][1] % ("ret"))
- classes.write("\n")
-
- # For functions returning an integral type there are
- # several things that we can do, depending on the
- # contents of functions_int_*:
- elif is_integral_type (ret[0]):
- if not functions_noexcept.has_key (name):
- if functions_int_exception_test.has_key (name):
- test = functions_int_exception_test[name]
- else:
- test = functions_int_default_test
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed')\n") %
- ("ret", name))
- classes.write(" return ret\n")
-
- elif is_python_noninteger_type (ret[0]):
- if not functions_noexcept.has_key (name):
- if functions_list_exception_test.has_key (name):
- test = functions_list_exception_test[name]
- else:
- test = functions_list_default_test
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed')\n") %
- ("ret", name))
- classes.write(" return ret\n")
-
- else:
- classes.write(" return ret\n")
-
- classes.write("\n")
-
- for classname in classes_list:
- if classname == "None":
- pass
- else:
- if classes_ancestor.has_key(classname):
- classes.write("class %s(%s):\n" % (classname,
- classes_ancestor[classname]))
- classes.write(" def __init__(self, _obj=None):\n")
- if reference_keepers.has_key(classname):
- rlist = reference_keepers[classname]
- for ref in rlist:
- classes.write(" self.%s = None\n" % ref[1])
- classes.write(" self._o = _obj\n")
- classes.write(" %s.__init__(self, _obj=_obj)\n\n" % (
- classes_ancestor[classname]))
- else:
- classes.write("class %s(object):\n" % (classname))
- if classname in [ "virDomain", "virNetwork", "virInterface", "virStoragePool",
- "virStorageVol", "virNodeDevice", "virSecret","virStream",
- "virNWFilter" ]:
- classes.write(" def __init__(self, conn, _obj=None):\n")
- elif classname in [ 'virDomainSnapshot' ]:
- classes.write(" def __init__(self, dom, _obj=None):\n")
- else:
- classes.write(" def __init__(self, _obj=None):\n")
- if reference_keepers.has_key(classname):
- list = reference_keepers[classname]
- for ref in list:
- classes.write(" self.%s = None\n" % ref[1])
- if classname in [ "virDomain", "virNetwork", "virInterface",
- "virNodeDevice", "virSecret", "virStream",
- "virNWFilter" ]:
- classes.write(" self._conn = conn\n")
- elif classname in [ "virStorageVol", "virStoragePool" ]:
- classes.write(" self._conn = conn\n" + \
- " if not isinstance(conn, virConnect):\n" + \
- " self._conn = conn._conn\n")
- elif classname in [ "virDomainSnapshot" ]:
- classes.write(" self._dom = dom\n")
- classes.write(" self._conn = dom.connect()\n")
- classes.write(" self._o = _obj\n\n")
- destruct=None
- if classes_destructors.has_key(classname):
- classes.write(" def __del__(self):\n")
- classes.write(" if self._o is not None:\n")
- classes.write(" libvirtmod.%s(self._o)\n" %
- classes_destructors[classname])
- classes.write(" self._o = None\n\n")
- destruct=classes_destructors[classname]
-
- if not class_skip_connect_impl.has_key(classname):
- # Build python safe 'connect' method
- classes.write(" def connect(self):\n")
- classes.write(" return self._conn\n\n")
-
- if class_domain_impl.has_key(classname):
- classes.write(" def domain(self):\n")
- classes.write(" return self._dom\n\n")
-
- flist = function_classes[classname]
- flist.sort(functionCompare)
- oldfile = ""
- for info in flist:
- (index, func, name, ret, args, file, mod) = info
- #
- # Do not provide as method the destructors for the class
- # to avoid double free
- #
- if name == destruct:
- continue
- if file != oldfile:
- if file == "python_accessor":
- classes.write(" # accessors for %s\n" % (classname))
- else:
- classes.write(" #\n")
- classes.write(" # %s functions from module %s\n" % (
- classname, file))
- classes.write(" #\n\n")
- oldfile = file
- classes.write(" def %s(self" % func)
- n = 0
- for arg in args:
- if n != index:
- classes.write(", %s" % arg[0])
- if arg[0] == "flags" or is_optional_arg(arg[2]):
- if is_integral_type(arg[1]):
- classes.write("=0")
- else:
- classes.write("=None")
- n = n + 1
- classes.write("):\n")
- writeDoc(module, name, args, ' ', classes)
- n = 0
- for arg in args:
- if classes_type.has_key(arg[1]):
- if n != index:
- classes.write(" if %s is None: %s__o = None\n" %
- (arg[0], arg[0]))
- classes.write(" else: %s__o = %s%s\n" %
- (arg[0], arg[0], classes_type[arg[1]][0]))
- n = n + 1
- if ret[0] != "void":
- classes.write(" ret = ")
- else:
- classes.write(" ")
- n = 0
- classes.write("libvirtmod.%s(" % name)
- for arg in args:
- if n != 0:
- classes.write(", ")
- if n != index:
- classes.write("%s" % arg[0])
- if classes_type.has_key(arg[1]):
- classes.write("__o")
- else:
- classes.write("self")
- if classes_type.has_key(arg[1]):
- classes.write(classes_type[arg[1]][0])
- n = n + 1
- classes.write(")\n")
-
- if name == "virConnectClose":
- classes.write(" self._o = None\n")
-
- # For functions returning object types:
- if ret[0] != "void":
- if classes_type.has_key(ret[0]):
- #
- # Raise an exception
- #
- if functions_noexcept.has_key(name):
- classes.write(
- " if ret is None:return None\n")
- else:
- if classname == "virConnect":
- classes.write(
- " if ret is None:raise libvirtError('%s() failed', conn=self)\n" %
- (name))
- elif classname == "virDomain":
- classes.write(
- " if ret is None:raise libvirtError('%s() failed', dom=self)\n" %
- (name))
- elif classname == "virNetwork":
- classes.write(
- " if ret is None:raise libvirtError('%s() failed', net=self)\n" %
- (name))
- elif classname == "virInterface":
- classes.write(
- " if ret is None:raise libvirtError('%s() failed', net=self)\n" %
- (name))
- elif classname == "virStoragePool":
- classes.write(
- " if ret is None:raise libvirtError('%s() failed', pool=self)\n" %
- (name))
- elif classname == "virStorageVol":
- classes.write(
- " if ret is None:raise libvirtError('%s() failed', vol=self)\n" %
- (name))
- elif classname == "virDomainSnapshot":
- classes.write(
- " if ret is None:raise libvirtError('%s() failed', dom=self._dom)\n" %
- (name))
- else:
- classes.write(
- " if ret is None:raise libvirtError('%s() failed')\n" %
- (name))
-
- #
- # generate the returned class wrapper for the object
- #
- classes.write(" __tmp = ")
- classes.write(classes_type[ret[0]][1] % ("ret"))
- classes.write("\n")
-
- #
- # Sometime one need to keep references of the source
- # class in the returned class object.
- # See reference_keepers for the list
- #
- tclass = classes_type[ret[0]][2]
- if reference_keepers.has_key(tclass):
- list = reference_keepers[tclass]
- for pref in list:
- if pref[0] == classname:
- classes.write(" __tmp.%s = self\n" %
- pref[1])
-
- # Post-processing - just before we return.
- if function_post.has_key(name):
- classes.write(" %s\n" %
- (function_post[name]))
-
- #
- # return the class
- #
- classes.write(" return __tmp\n")
- elif converter_type.has_key(ret[0]):
- #
- # Raise an exception
- #
- if functions_noexcept.has_key(name):
- classes.write(
- " if ret is None:return None")
-
- # Post-processing - just before we return.
- if function_post.has_key(name):
- classes.write(" %s\n" %
- (function_post[name]))
-
- classes.write(" return ")
- classes.write(converter_type[ret[0]] % ("ret"))
- classes.write("\n")
-
- # For functions returning an integral type there
- # are several things that we can do, depending on
- # the contents of functions_int_*:
- elif is_integral_type (ret[0]):
- if not functions_noexcept.has_key (name):
- if functions_int_exception_test.has_key (name):
- test = functions_int_exception_test[name]
- else:
- test = functions_int_default_test
- if classname == "virConnect":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', conn=self)\n") %
- ("ret", name))
- elif classname == "virDomain":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', dom=self)\n") %
- ("ret", name))
- elif classname == "virNetwork":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', net=self)\n") %
- ("ret", name))
- elif classname == "virInterface":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', net=self)\n") %
- ("ret", name))
- elif classname == "virStoragePool":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', pool=self)\n") %
- ("ret", name))
- elif classname == "virStorageVol":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', vol=self)\n") %
- ("ret", name))
- else:
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed')\n") %
- ("ret", name))
-
- # Post-processing - just before we return.
- if function_post.has_key(name):
- classes.write(" %s\n" %
- (function_post[name]))
-
- classes.write (" return ret\n")
-
- elif is_python_noninteger_type (ret[0]):
- if not functions_noexcept.has_key (name):
- if functions_list_exception_test.has_key (name):
- test = functions_list_exception_test[name]
- else:
- test = functions_list_default_test
- if classname == "virConnect":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', conn=self)\n") %
- ("ret", name))
- elif classname == "virDomain":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', dom=self)\n") %
- ("ret", name))
- elif classname == "virNetwork":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', net=self)\n") %
- ("ret", name))
- elif classname == "virInterface":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', net=self)\n") %
- ("ret", name))
- elif classname == "virStoragePool":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', pool=self)\n") %
- ("ret", name))
- elif classname == "virStorageVol":
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed', vol=self)\n") %
- ("ret", name))
- else:
- classes.write ((" if " + test +
- ": raise libvirtError ('%s() failed')\n") %
- ("ret", name))
-
- # Post-processing - just before we return.
- if function_post.has_key(name):
- classes.write(" %s\n" %
- (function_post[name]))
-
- classes.write (" return ret\n")
-
- else:
- # Post-processing - just before we return.
- if function_post.has_key(name):
- classes.write(" %s\n" %
- (function_post[name]))
-
- classes.write(" return ret\n")
-
- classes.write("\n")
- # Append "<classname>.py" to class def, iff it exists
- try:
- extra = open(os.path.join(srcPref,"libvirt-override-" + classname + ".py"), "r")
- classes.write (" #\n")
- classes.write (" # %s methods from %s.py (hand coded)\n" % (classname,classname))
- classes.write (" #\n")
- classes.writelines(extra.readlines())
- classes.write("\n")
- extra.close()
- except:
- pass
-
- #
- # Generate enum constants
- #
- for type,enum in enums.items():
- classes.write("# %s\n" % type)
- items = enum.items()
- items.sort(lambda i1,i2: cmp(long(i1[1]),long(i2[1])))
- for name,value in items:
- classes.write("%s = %s\n" % (name,value))
- classes.write("\n")
-
- classes.close()
-
-def qemuBuildWrappers(module):
- global qemu_functions
-
- if not module == "libvirt-qemu":
- print "ERROR: only libvirt-qemu is supported"
- return None
-
- extra_file = os.path.join(srcPref, "%s-override.py" % module)
- extra = None
-
- fd = open("libvirt_qemu.py", "w")
-
- if os.path.exists(extra_file):
- extra = open(extra_file, "r")
- fd.write("#! " + python + " -i\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# This file is automatically written by generator.py. Any changes\n")
- fd.write("# made here will be lost.\n")
- fd.write("#\n")
- fd.write("# To change the manually written methods edit " + module + "-override.py\n")
- fd.write("# To change the automatically written methods edit generator.py\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- if extra is not None:
- fd.writelines(extra.readlines())
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# Automatically written part of python bindings for libvirt\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- if extra is not None:
- extra.close()
-
- fd.write("try:\n")
- fd.write(" import libvirtmod_qemu\n")
- fd.write("except ImportError, lib_e:\n")
- fd.write(" try:\n")
- fd.write(" import cygvirtmod_qemu as libvirtmod_qemu\n")
- fd.write(" except ImportError, cyg_e:\n")
- fd.write(" if str(cyg_e).count(\"No module named\"):\n")
- fd.write(" raise lib_e\n\n")
-
- fd.write("import libvirt\n\n")
- fd.write("#\n# Functions from module %s\n#\n\n" % module)
- #
- # Generate functions directly, no classes
- #
- for name in qemu_functions.keys():
- func = nameFixup(name, 'None', None, None)
- (desc, ret, args, file, mod, cond) = qemu_functions[name]
- fd.write("def %s(" % func)
- n = 0
- for arg in args:
- if n != 0:
- fd.write(", ")
- fd.write("%s" % arg[0])
- n = n + 1
- fd.write("):\n")
- writeDoc(module, name, args, ' ', fd)
-
- if ret[0] != "void":
- fd.write(" ret = ")
- else:
- fd.write(" ")
- fd.write("libvirtmod_qemu.%s(" % name)
- n = 0
-
- conn = None
-
- for arg in args:
- if arg[1] == "virConnectPtr":
- conn = arg[0]
-
- if n != 0:
- fd.write(", ")
- if arg[1] in ["virDomainPtr", "virConnectPtr"]:
- # FIXME: This might have problem if the function
- # has multiple args which are objects.
- fd.write("%s.%s" % (arg[0], "_o"))
- else:
- fd.write("%s" % arg[0])
- n = n + 1
- fd.write(")\n")
-
- if ret[0] != "void":
- fd.write(" if ret is None: raise libvirt.libvirtError('" + name + "() failed')\n")
- if ret[0] == "virDomainPtr":
- fd.write(" __tmp = virDomain(" + conn + ",_obj=ret)\n")
- fd.write(" return __tmp\n")
- else:
- fd.write(" return ret\n")
-
- fd.write("\n")
-
- #
- # Generate enum constants
- #
- for type,enum in qemu_enums.items():
- fd.write("# %s\n" % type)
- items = enum.items()
- items.sort(lambda i1,i2: cmp(long(i1[1]),long(i2[1])))
- for name,value in items:
- fd.write("%s = %s\n" % (name,value))
- fd.write("\n")
-
- fd.close()
-
-
-def lxcBuildWrappers(module):
- global lxc_functions
-
- if not module == "libvirt-lxc":
- print "ERROR: only libvirt-lxc is supported"
- return None
-
- extra_file = os.path.join(srcPref, "%s-override.py" % module)
- extra = None
-
- fd = open("libvirt_lxc.py", "w")
-
- if os.path.exists(extra_file):
- extra = open(extra_file, "r")
- fd.write("#! " + python + " -i\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# This file is automatically written by generator.py. Any changes\n")
- fd.write("# made here will be lost.\n")
- fd.write("#\n")
- fd.write("# To change the manually written methods edit " + module + "-override.py\n")
- fd.write("# To change the automatically written methods edit generator.py\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- if extra is not None:
- fd.writelines(extra.readlines())
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- fd.write("#\n")
- fd.write("# Automatically written part of python bindings for libvirt\n")
- fd.write("#\n")
- fd.write("# WARNING WARNING WARNING WARNING\n")
- if extra is not None:
- extra.close()
-
- fd.write("try:\n")
- fd.write(" import libvirtmod_lxc\n")
- fd.write("except ImportError, lib_e:\n")
- fd.write(" try:\n")
- fd.write(" import cygvirtmod_lxc as libvirtmod_lxc\n")
- fd.write(" except ImportError, cyg_e:\n")
- fd.write(" if str(cyg_e).count(\"No module named\"):\n")
- fd.write(" raise lib_e\n\n")
-
- fd.write("import libvirt\n\n")
- fd.write("#\n# Functions from module %s\n#\n\n" % module)
- #
- # Generate functions directly, no classes
- #
- for name in lxc_functions.keys():
- func = nameFixup(name, 'None', None, None)
- (desc, ret, args, file, mod, cond) = lxc_functions[name]
- fd.write("def %s(" % func)
- n = 0
- for arg in args:
- if n != 0:
- fd.write(", ")
- fd.write("%s" % arg[0])
- n = n + 1
- fd.write("):\n")
- writeDoc(module, name, args, ' ', fd)
-
- if ret[0] != "void":
- fd.write(" ret = ")
- else:
- fd.write(" ")
- fd.write("libvirtmod_lxc.%s(" % name)
- n = 0
-
- conn = None
-
- for arg in args:
- if arg[1] == "virConnectPtr":
- conn = arg[0]
-
- if n != 0:
- fd.write(", ")
- if arg[1] in ["virDomainPtr", "virConnectPtr"]:
- # FIXME: This might have problem if the function
- # has multiple args which are objects.
- fd.write("%s.%s" % (arg[0], "_o"))
- else:
- fd.write("%s" % arg[0])
- n = n + 1
- fd.write(")\n")
-
- if ret[0] != "void":
- fd.write(" if ret is None: raise libvirt.libvirtError('" + name + "() failed')\n")
- if ret[0] == "virDomainPtr":
- fd.write(" __tmp = virDomain(" + conn + ",_obj=ret)\n")
- fd.write(" return __tmp\n")
- else:
- fd.write(" return ret\n")
-
- fd.write("\n")
-
- #
- # Generate enum constants
- #
- for type,enum in lxc_enums.items():
- fd.write("# %s\n" % type)
- items = enum.items()
- items.sort(lambda i1,i2: cmp(long(i1[1]),long(i2[1])))
- for name,value in items:
- fd.write("%s = %s\n" % (name,value))
- fd.write("\n")
-
- fd.close()
-
-
-quiet = 0
-if buildStubs("libvirt") < 0:
- sys.exit(1)
-if buildStubs("libvirt-lxc") < 0:
- sys.exit(1)
-if buildStubs("libvirt-qemu") < 0:
- sys.exit(1)
-buildWrappers("libvirt")
-lxcBuildWrappers("libvirt-lxc")
-qemuBuildWrappers("libvirt-qemu")
-sys.exit(0)
diff --git a/python/libvirt-lxc-override-api.xml b/python/libvirt-lxc-override-api.xml
deleted file mode 100644
index db0d45d..0000000
--- a/python/libvirt-lxc-override-api.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-<api name='libvir-lxc-python'>
- <symbols>
- <function name='virDomainLxcOpenNamespace' file='python-lxc'>
- <info><![CDATA[This API is LXC specific, so it will only work with hypervisor
-connections to the LXC driver.
-
-Open the namespaces associated with the container @domain
-and return a list of file descriptors associated with the
-container.
-
-The returned file descriptors are intended to be used with
-the setns() system call.]]></info>
- <return type='int' info='the list of open file descriptors, or -1 on error'/>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='flags' type='unsigned int' info='currently unused, pass 0'/>
- </function>
- </symbols>
-</api>
diff --git a/python/libvirt-lxc-override.c b/python/libvirt-lxc-override.c
deleted file mode 100644
index f76ff4b..0000000
--- a/python/libvirt-lxc-override.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * libvir.c: this modules implements the main part of the glue of the
- * libvir library and the Python interpreter. It provides the
- * entry points where an automatically generated stub is
- * unpractical
- *
- * Copyright (C) 2012-2013 Red Hat, Inc.
- *
- * Daniel Veillard <veillard(a)redhat.com>
- */
-
-#include <config.h>
-
-/* Horrible kludge to work around even more horrible name-space pollution
- via Python.h. That file includes /usr/include/python2.5/pyconfig*.h,
- which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
-#undef HAVE_PTHREAD_H
-
-#include <Python.h>
-#include <libvirt/libvirt-lxc.h>
-#include <libvirt/virterror.h>
-#include "typewrappers.h"
-#include "libvirt-lxc.h"
-#include "viralloc.h"
-#include "virfile.h"
-
-#ifndef __CYGWIN__
-extern void initlibvirtmod_lxc(void);
-#else
-extern void initcygvirtmod_lxc(void);
-#endif
-
-#if 0
-# define DEBUG_ERROR 1
-#endif
-
-#if DEBUG_ERROR
-# define DEBUG(fmt, ...) \
- printf(fmt, __VA_ARGS__)
-#else
-# define DEBUG(fmt, ...) \
- do {} while (0)
-#endif
-
-/* The two-statement sequence "Py_INCREF(Py_None); return Py_None;"
- is so common that we encapsulate it here. Now, each use is simply
- return VIR_PY_NONE; */
-#define VIR_PY_NONE (Py_INCREF (Py_None), Py_None)
-#define VIR_PY_INT_FAIL (libvirt_intWrap(-1))
-#define VIR_PY_INT_SUCCESS (libvirt_intWrap(0))
-
-/************************************************************************
- * *
- * Statistics *
- * *
- ************************************************************************/
-
-static PyObject *
-libvirt_lxc_virDomainLxcOpenNamespace(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- unsigned int flags;
- int c_retval;
- int *fdlist = NULL;
- size_t i;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainLxcOpenNamespace",
- &pyobj_domain, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (domain == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainLxcOpenNamespace(domain, &fdlist, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyList_New(0);
- for (i = 0; i < c_retval; i++) {
- PyObject *item = NULL;
-
- if ((item = PyInt_FromLong(fdlist[i])) == NULL)
- goto error;
-
- if (PyList_Append(py_retval, item) < 0) {
- Py_DECREF(item);
- goto error;
- }
- }
- VIR_FREE(fdlist);
- return py_retval;
-
-error:
- for (i = 0; i < c_retval; i++) {
- VIR_FORCE_CLOSE(fdlist[i]);
- }
- VIR_FREE(fdlist);
- return VIR_PY_NONE;
-}
-/************************************************************************
- * *
- * The registration stuff *
- * *
- ************************************************************************/
-static PyMethodDef libvirtLxcMethods[] = {
-#include "libvirt-lxc-export.c"
- {(char *) "virDomainLxcOpenNamespace", libvirt_lxc_virDomainLxcOpenNamespace, METH_VARARGS, NULL},
- {NULL, NULL, 0, NULL}
-};
-
-void
-#ifndef __CYGWIN__
-initlibvirtmod_lxc
-#else
-initcygvirtmod_lxc
-#endif
- (void)
-{
- static int initialized = 0;
-
- if (initialized != 0)
- return;
-
- if (virInitialize() < 0)
- return;
-
- /* initialize the python extension module */
- Py_InitModule((char *)
-#ifndef __CYGWIN__
- "libvirtmod_lxc"
-#else
- "cygvirtmod_lxc"
-#endif
- , libvirtLxcMethods);
-
- initialized = 1;
-}
diff --git a/python/libvirt-override-api.xml b/python/libvirt-override-api.xml
deleted file mode 100644
index 337d0a0..0000000
--- a/python/libvirt-override-api.xml
+++ /dev/null
@@ -1,613 +0,0 @@
-<?xml version="1.0"?>
-<api name='libvir-python'>
- <!-- This file lists libvirt API functions whose Python stubs are
- written by hand in libvirt-override.c, but the Python-level code
- are still automatically generated by the generator.py script.
-
- The type of return value is supposed to be C type. If a function's
- stub will return a python non-integer data type like string, list,
- tuple, dictionary, etc, please use "char *" as the type of its return
- value.
- -->
- <symbols>
- <function name="virConnectGetVersion" file='python'>
- <info>Returns the running hypervisor version of the connection host</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='int' info="0 on success, -1 on error"/>
- </function>
- <function name="virConnectGetLibVersion" file='python'>
- <info>Returns the libvirt version of the connection host</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='int' info="0 on success, -1 on error"/>
- </function>
- <function name="virConnectListDomainsID" file='python'>
- <info>Returns the list of the ID of the domains on the hypervisor</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info="the list of ID or None in case of error"/>
- </function>
- <function name='virConnectListDefinedDomains' file='python'>
- <info>list the defined domains, stores the pointers to the names in @names</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virConnectListAllDomains' file='python'>
- <info>returns list of all defined domains</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of domains or None in case of error'/>
- </function>
- <function name='virConnectListNetworks' file='python'>
- <info>list the networks, stores the pointers to the names in @names</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virConnectListDefinedNetworks' file='python'>
- <info>list the defined networks, stores the pointers to the names in @names</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virConnectListAllNetworks' file='python'>
- <info>returns list of all networks</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of networks or None in case of error'/>
- </function>
- <function name='virDomainLookupByUUID' file='python'>
- <info>Try to lookup a domain on the given hypervisor based on its UUID.</info>
- <return type='virDomainPtr' info='a new domain object or NULL in case of failure'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='uuid' type='const unsigned char *' info='the UUID string for the domain, must be 16 bytes'/>
- </function>
- <function name='virNetworkLookupByUUID' file='python'>
- <info>Try to lookup a network on the given hypervisor based on its UUID.</info>
- <return type='virNetworkPtr' info='a new network object or NULL in case of failure'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='uuid' type='const unsigned char *' info='the UUID string for the network, must be 16 bytes'/>
- </function>
- <function name='virDomainGetInfo' file='python'>
- <info>Extract information about a domain. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted.</info>
- <return type='char *' 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='char *' 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='virDomainGetControlInfo' file='python'>
- <info>Extract details about current state of control interface to a domain.</info>
- <return type='char *' info='the list of information 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='char *' info='the list of information or None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='path' type='const char *' info='path to the block device or file'/>
- <arg name='flags' type='unsigned int' info='currently unused'/>
- </function>
- <function name='virDomainGetJobInfo' file='python'>
- <info>Extract information about an active job being processed for a domain.</info>
- <return type='char *' info='the list of information or None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- </function>
- <function name='virDomainGetJobStats' file='python'>
- <info>Extract information about an active job being processed for a domain.</info>
- <return type='char *' info='dictionary mapping field names to values or None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='flags' type='unsigned int' info='flags, currently unused, pass 0.'/>
- </function>
- <function name='virNodeGetInfo' file='python'>
- <info>Extract hardware information about the Node. Note that the memory size is reported in MiB instead of KiB.</info>
- <return type='char *' info='the list of information or None in case of error'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- </function>
- <function name='virNodeGetCPUStats' file='python'>
- <info>Extract node's CPU statistics.</info>
- <return type='char *' info='dictionary mapping field names to values or None in case of error'/>
- <arg name='conn' type='virConnectPtr' info='pointer to hypervisor connection'/>
- <arg name='cpuNum' type='int' info='number of node cpu. (VIR_NODE_CPU_STATS_ALL_CPUS means total cpu statistics)'/>
- <arg name='flags' type='unsigned int' info='additional flags'/>
- </function>
- <function name='virNodeGetMemoryStats' file='python'>
- <info>Extract node's memory statistics.</info>
- <return type='char *' info='dictionary mapping field names to values or None in case of error'/>
- <arg name='conn' type='virConnectPtr' info='pointer to hypervisor connection'/>
- <arg name='cellNum' type='int' info='number of node cell. (VIR_NODE_MEMORY_STATS_ALL_CELLS means total cell statistics)'/>
- <arg name='flags' type='unsigned int' info='additional flags'/>
- </function>
- <function name='virDomainGetUUID' file='python'>
- <info>Extract the UUID unique Identifier of a domain.</info>
- <return type='char *' info='the 16 bytes string or None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- </function>
- <function name='virDomainGetUUIDString' file='python'>
- <info>Fetch globally unique ID of the domain as a string.</info>
- <return type='char *' info='the UUID string or None in case of error'/>
- <arg name='pool' type='virDomainPtr' info='a domain object'/>
- </function>
- <function name='virNetworkGetUUID' file='python'>
- <info>Extract the UUID unique Identifier of a network.</info>
- <return type='char *' info='the 16 bytes string or None in case of error'/>
- <arg name='domain' type='virNetworkPtr' info='a network object'/>
- </function>
- <function name='virNetworkGetUUIDString' file='python'>
- <info>Fetch globally unique ID of the network as a string.</info>
- <return type='char *' info='the UUID string or None in case of error'/>
- <arg name='net' type='virNetworkPtr' info='a network object'/>
- </function>
- <function name='virStoragePoolGetUUID' file='python'>
- <info>Extract the UUID unique Identifier of a storage pool.</info>
- <return type='char *' info='the 16 bytes string or None in case of error'/>
- <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
- </function>
- <function name='virStoragePoolGetUUIDString' file='python'>
- <info>Fetch globally unique ID of the storage pool as a string.</info>
- <return type='char *' info='the UUID string or None in case of error'/>
- <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
- </function>
- <function name='virNetworkGetAutostart' file='python'>
- <info>Extract the autostart flag for a network.</info>
- <return type='int' info='the autostart flag, or None in case of error'/>
- <arg name='domain' type='virNetworkPtr' info='a network object'/>
- </function>
- <function name='virDomainGetAutostart' file='python'>
- <info>Extract the autostart flag for a domain</info>
- <return type='int' info='the autostart flag, or None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='a network object'/>
- </function>
- <function name='virStoragePoolGetAutostart' file='python'>
- <info>Extract the autostart flag for a storage pool</info>
- <return type='int' info='the autostart flag, or None in case of error'/>
- <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
- </function>
- <function name='virDomainBlockStats' file='python'>
- <info>Extracts block device statistics for a domain</info>
- <return type='char *' info='a tuple of statistics'/>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='path' type='char *' info='the path for the block device'/>
- </function>
- <function name='virDomainBlockStatsFlags' file='python'>
- <info>Extracts block device statistics parameters of a running domain</info>
- <return type='char *' info='None in case of error, returns a dictionary of params'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='path' type='char *' info='the path for the block device'/>
- <arg name='flags' type='int' info='flags (unused; pass 0)'/>
- </function>
- <function name='virDomainGetCPUStats' file='python'>
- <info>Extracts CPU statistics for a running domain. On success it will
- return a list of data of dictionary type. If boolean total is False or 0, the
- first element of the list refers to CPU0 on the host, second element is
- CPU1, and so on. The format of data struct is as follows:
- [{cpu_time:xxx}, {cpu_time:xxx}, ...]
- If it is True or 1, it returns total domain CPU statistics in the format of
- [{cpu_time:xxx, user_time:xxx, system_time:xxx}]</info>
- <return type='char *' info='returns a list of dictionary in case of success, None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='total' type='bool' info='on true, return total domain CPU statistics, false return per-cpu info'/>
- <arg name='flags' type='int' info='flags (unused; pass 0)'/>
- </function>
- <function name='virDomainInterfaceStats' file='python'>
- <info>Extracts interface device statistics for a domain</info>
- <return type='char *' info='a tuple of statistics'/>
- <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='char *' 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'/>
- <arg name='startCell' type='int' info='first cell in the list'/>
- <arg name='maxCells' type='int' info='number of cell in the list'/>
- <return type='char *' info="the list available memory in the cells"/>
- </function>
- <function name='virDomainGetSchedulerParameters' file='python'>
- <info>Get the scheduler parameters, the @params array will be filled with the values.</info>
- <return type='char *' info='None in case of error, returns a dictionary of params.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- </function>
- <function name='virDomainGetSchedulerParametersFlags' file='python'>
- <info>Get the scheduler parameters</info>
- <return type='char *' info='None in case of error, returns a dictionary of params'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainGetSchedulerType' file='python'>
- <info>Get the scheduler type.</info>
- <return type='char *' info='NULL in case of error. The caller must free the returned string.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- </function>
- <function name='virDomainGetVcpus' file='python'>
- <info>Extract information about virtual CPUs of domain, store it in info array and also in cpumaps if this pointer is'nt NULL.</info>
- <return type='int' info='the number of info filled in case of success, -1 in case of failure.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
- </function>
- <function name='virDomainPinVcpu' file='python'>
- <info>Dynamically change the real CPUs which can be allocated to a virtual CPU. This function requires privileged access to the hypervisor.</info>
- <return type='int' info='0 in case of success, -1 in case of failure.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
- <arg name='vcpu' type='unsigned int' info='virtual CPU number'/>
- <arg name='cpumap' type='unsigned char *' info='pointer to a bit map of real CPUs (in 8-bit bytes) (IN) Each bit set to 1 means that corresponding CPU is usable. Bytes are stored in little-endian order: CPU0-7, 8-15... In each byte, lowest CPU number is least significant bit.'/>
- </function>
- <function name='virDomainPinVcpuFlags' file='python'>
- <info>Dynamically change the real CPUs which can be allocated to a virtual CPU. This function requires privileged access to the hypervisor.</info>
- <return type='int' info='0 in case of success, -1 in case of failure.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
- <arg name='vcpu' type='unsigned int' info='virtual CPU number'/>
- <arg name='cpumap' type='unsigned char *' info='pointer to a bit map of real CPUs (in 8-bit bytes) (IN) Each bit set to 1 means that corresponding CPU is usable. Bytes are stored in little-endian order: CPU0-7, 8-15... In each byte, lowest CPU number is least significant bit.'/>
- <arg name='flags' type='int' info='flags to specify'/>
- </function>
- <function name='virDomainGetVcpuPinInfo' file='python'>
- <info>Query the CPU affinity setting of all virtual CPUs of domain</info>
- <return type='char *' info='the array of cpumap'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainGetEmulatorPinInfo' file='python'>
- <info>Query the CPU affinity setting of the emulator process of domain</info>
- <return type='char *' info='the array of cpumap'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainPinEmulator' file='python'>
- <info>Dynamically change the real CPUs which can be allocated to the emulator process of a domain.
- This function requires privileged access to the hypervisor.</info>
- <return type='int' info='0 in case of success, -1 in case of failure.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
- <arg name='cpumap' type='unsigned char *' info='pointer to a bit map of real CPUs (in 8-bit bytes) (IN) Each bit set to 1 means that corresponding CPU is usable. Bytes are stored in little-endian order: CPU0-7, 8-15... In each byte, lowest CPU number is least significant bit.'/>
- <arg name='flags' type='int' info='flags to specify'/>
- </function>
- <function name='virDomainSetSchedulerParameters' file='python'>
- <info>Change the scheduler parameters</info>
- <return type='int' info='-1 in case of error, 0 in case of success.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='params' type='virSchedParameterPtr' info='pointer to scheduler parameter objects'/>
- </function>
- <function name='virDomainSetSchedulerParametersFlags' file='python'>
- <info>Change the scheduler parameters</info>
- <return type='int' info='-1 in case of error, 0 in case of success.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='params' type='virSchedParameterPtr' info='pointer to scheduler parameter objects'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainSetBlkioParameters' file='python'>
- <info>Change the blkio tunables</info>
- <return type='int' info='-1 in case of error, 0 in case of success.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='params' type='virBlkioParameterPtr' info='pointer to blkio tunable objects'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainGetBlkioParameters' file='python'>
- <info>Get the blkio parameters</info>
- <return type='char *' info='None in case of error, returns a dictionary of params'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainSetMemoryParameters' file='python'>
- <info>Change the memory tunables</info>
- <return type='int' info='-1 in case of error, 0 in case of success.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='params' type='virMemoryParameterPtr' info='pointer to memory tunable objects'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainGetMemoryParameters' file='python'>
- <info>Get the memory parameters</info>
- <return type='char *' info='None in case of error, returns a dictionary of params'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainSetNumaParameters' file='python'>
- <info>Change the NUMA tunables</info>
- <return type='int' info='-1 in case of error, 0 in case of success.'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='params' type='virTypedParameterPtr' info='pointer to numa tunable objects'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainGetNumaParameters' file='python'>
- <info>Get the NUMA parameters</info>
- <return type='char *' info='returns a dictionary of params in case of success, None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='flags' type='int' info='an OR'ed set of virDomainModificationImpact'/>
- </function>
- <function name='virDomainSetInterfaceParameters' file='python'>
- <info>Change the bandwidth tunables for a interface device</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='device' type='const char *' info='interface name'/>
- <arg name='params' type='virTypedParameterPtr' info='Pointer to bandwidth tuning params object'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainModificationImpact'/>
- <return type='int' info='0 in case of success, -1 in case of failure'/>
- </function>
- <function name='virDomainGetInterfaceParameters' file='python'>
- <info>Get the bandwidth tunables for a interface device</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='device' type='const char *' info='interface name'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainModificationImpact'/>
- <return type='char *' info='the bandwidth tunables value or None in case of error'/>
- </function>
-
- <function name='virConnectListStoragePools' file='python'>
- <info>list the storage pools, stores the pointers to the names in @names</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info='the list of Names of None in case of error'/>
- </function>
- <function name='virConnectListDefinedStoragePools' file='python'>
- <info>list the defined storage pool, stores the pointers to the names in @names</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info='the list of Names of None in case of error'/>
- </function>
- <function name='virConnectListAllStoragePools' file='python'>
- <info>returns list of all storage pools</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of pools or None in case of error'/>
- </function>
- <function name='virStoragePoolListVolumes' file='python'>
- <info>list the storage volumes, stores the pointers to the names in @names</info>
- <arg name='pool' type='virStoragePoolPtr' info='pointer to the storage pool'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virStoragePoolListAllVolumes' file='python'>
- <info>return list of storage volume objects</info>
- <arg name='pool' type='virStoragePoolPtr' info='pointer to the storage pool'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of volumes or None in case of error'/>
- </function>
- <function name='virStoragePoolGetInfo' file='python'>
- <info>Extract information about a storage pool. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted.</info>
- <return type='char *' info='the list of information or None in case of error'/>
- <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
- </function>
- <function name='virStorageVolGetInfo' file='python'>
- <info>Extract information about a storage volume. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted.</info>
- <return type='char *' info='the list of information or None in case of error'/>
- <arg name='vol' type='virStorageVolPtr' info='a storage vol object'/>
- </function>
- <function name='virNodeListDevices' file='python'>
- <info>list the node devices</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='cap' type='const unsigned char *' info='capability name'/>
- <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virConnectListAllNodeDevices' file='python'>
- <info>returns list of all host node devices</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of host node device or None in case of error'/>
- </function>
- <function name='virNodeDeviceListCaps' file='python'>
- <info>list the node device's capabilities</info>
- <arg name='dev' type='virNodeDevicePtr' info='pointer to the node device'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virSecretGetValue' file='libvirt' module='libvirt'>
- <info>Fetches the value associated with a secret.</info>
- <return type='char *' info='the secret value or None in case of error'/>
- <arg name='secret' type='virSecretPtr' info='virSecret secret'/>
- <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
- </function>
- <function name='virConnectListSecrets' file='libvirt' module='libvirt'>
- <info>List the defined secret IDs</info>
- <arg name='conn' type='virConnectPtr' info='virConnect connection'/>
- <return type='char *' info='the list of secret IDs or None in case of error'/>
- </function>
- <function name='virConnectListAllSecrets' file='python'>
- <info>returns list of all interfaces</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of secrets or None in case of error'/>
- </function>
- <function name='virSecretSetValue' file='libvirt' module='libvirt'>
- <info>Associates a value with a secret.</info>
- <return type='int' info='0 on success, -1 on failure.'/>
- <arg name='secret' type='virSecretPtr' info='virSecret secret'/>
- <arg name='value' type='const char *' info='The secret value'/>
- <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
- </function>
- <function name='virSecretLookupByUUID' file='python'>
- <info>Try to lookup a secret on the given hypervisor based on its UUID.</info>
- <return type='virSecretPtr' info='a new secret object or NULL in case of failure'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='uuid' type='const unsigned char *' info='the UUID string for the secret, must be 16 bytes'/>
- </function>
- <function name='virSecretGetUUID' file='python'>
- <info>Extract the UUID unique Identifier of a secret.</info>
- <return type='char *' info='the 16 bytes string or None in case of error'/>
- <arg name='secret' type='virSecretPtr' info='a secret object'/>
- </function>
- <function name='virSecretGetUUIDString' file='python'>
- <info>Fetch globally unique ID of the secret as a string.</info>
- <return type='char *' info='the UUID string or None in case of error'/>
- <arg name='secret' type='virSecretPtr' info='a secret object'/>
- </function>
- <function name='virConnectListNWFilters' file='libvirt' module='libvirt'>
- <info>List the defined network filters</info>
- <arg name='conn' type='virConnectPtr' info='virConnect connection'/>
- <return type='char *' info='the list of network filter IDs or None in case of error'/>
- </function>
- <function name='virConnectListAllNWFilters' file='python'>
- <info>returns list of all network fitlers</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of network filters or None in case of error'/>
- </function>
- <function name='virNWFilterLookupByUUID' file='python'>
- <info>Try to lookup a network filter on the given hypervisor based on its UUID.</info>
- <return type='virNWFilterPtr' info='a new network filter object or NULL in case of failure'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='uuid' type='const unsigned char *' info='the UUID string for the secret, must be 16 bytes'/>
- </function>
- <function name='virNWFilterGetUUID' file='python'>
- <info>Extract the UUID unique Identifier of a network filter.</info>
- <return type='char *' info='the 16 bytes string or None in case of error'/>
- <arg name='nwfilter' type='virNWFilterPtr' info='a network filter object'/>
- </function>
- <function name='virNWFilterGetUUIDString' file='python'>
- <info>Fetch globally unique ID of the network filter as a string.</info>
- <return type='char *' info='the UUID string or None in case of error'/>
- <arg name='nwfilter' type='virNWFilterPtr' info='a network filter object'/>
- </function>
- <function name='virConnectListInterfaces' file='python'>
- <info>list the running interfaces, stores the pointers to the names in @names</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info='the list of Names of None in case of error'/>
- </function>
- <function name='virConnectListDefinedInterfaces' file='python'>
- <info>list the defined interfaces, stores the pointers to the names in @names</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <return type='char *' info='the list of Names of None in case of error'/>
- </function>
- <function name='virConnectListAllInterfaces' file='python'>
- <info>returns list of all interfaces</info>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='unsigned int' info='optional flags'/>
- <return type='char *' info='the list of interfaces or None in case of error'/>
- </function>
- <function name='virConnectBaselineCPU' file='python'>
- <info>Computes the most feature-rich CPU which is compatible with all given host CPUs.</info>
- <return type='char *' info='XML description of the computed CPU or NULL on error.'/>
- <arg name='conn' type='virConnectPtr' info='virConnect connection'/>
- <arg name='xmlCPUs' type='const char **' info='array of XML descriptions of host CPUs'/>
- <arg name='flags' type='unsigned int' info='fine-tuning flags, currently unused, pass 0.'/>
- </function>
- <function name='virConnectGetCPUModelNames' file='python'>
- <info>Get the list of supported CPU models.</info>
- <return type='char *' info='list of supported CPU models'/>
- <arg name='conn' type='virConnectPtr' info='virConnect connection'/>
- <arg name='arch' type='const char *' info='arch'/>
- <arg name='flags' type='unsigned int' info='fine-tuning flags, currently unused, pass 0.'/>
- </function>
- <function name='virDomainSnapshotListNames' file='python'>
- <info>collect the list of snapshot names for the given domain</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='flags' type='unsigned int' info='flags'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virDomainListAllSnapshots' file='python'>
- <info>returns the list of snapshots for the given domain</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='flags' type='unsigned int' info='flags'/>
- <return type='char *' info='the list of snapshots or None in case of error'/>
- </function>
- <function name='virDomainSnapshotListChildrenNames' file='python'>
- <info>collect the list of child snapshot names for the given snapshot</info>
- <arg name='snapshot' type='virDomainSnapshotPtr' info='pointer to the snapshot'/>
- <arg name='flags' type='unsigned int' info='flags'/>
- <return type='char *' info='the list of Names or None in case of error'/>
- </function>
- <function name='virDomainSnapshotListAllChildren' file='python'>
- <info>returns the list of child snapshots for the given snapshot</info>
- <arg name='snapshot' type='virDomainSnapshotPtr' info='pointer to the snapshot'/>
- <arg name='flags' type='unsigned int' info='flags'/>
- <return type='char *' info='the list of snapshots or None in case of error'/>
- </function>
- <function name='virDomainRevertToSnapshot' file='python'>
- <info>revert the domain to the given snapshot</info>
- <arg name='dom' type='virDomainPtr' info='dummy domain pointer'/>
- <arg name='snap' type='virDomainSnapshotPtr' info='pointer to the snapshot'/>
- <arg name='flags' type='unsigned int' info='flags'/>
- <return type='int' info="0 on success, -1 on error"/>
- </function>
- <function name='virDomainGetBlockJobInfo' file='python'>
- <info>Get progress information for a block job</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='char *' info='A dictionary containing job information.' />
- </function>
- <function name='virDomainMigrateGetCompressionCache' file='python'>
- <info>Get current size of the cache (in bytes) used for compressing
- repeatedly transferred memory pages during live migration.</info>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='flags' type='unsigned int' info='flags, currently unused, pass 0.'/>
- <return type='unsigned long long' info='current cache size, or None in case of error'/>
- </function>
- <function name='virDomainMigrateGetMaxSpeed' file='python'>
- <info>Get currently configured maximum migration speed for a domain</info>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='flags' type='unsigned int' info='flags, currently unused, pass 0.'/>
- <return type='unsigned long' info='current max migration speed, or None in case of error'/>
- </function>
- <function name='virDomainMigrate3' file='python'>
- <info>Migrate the domain object from its current host to the destination host
- given by dconn (a connection to the destination host).</info>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='dconn' type='virConnectPtr' info='pointer to the destination host connection'/>
- <arg name='params' type='char *' info='dictionary with migration parameters'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainMigrateFlags'/>
- <return type='virDomainPtr' info='a new domain object or NULL in case of failure'/>
- </function>
- <function name='virDomainMigrateToURI3' file='python'>
- <info>Migrate the domain object from its current host to the destination host
- given by URI.</info>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='dconnuri' type='virConnectPtr' info='URI for target libvirtd if @flags includes VIR_MIGRATE_PEER2PEER'/>
- <arg name='params' type='char *' info='dictionary with migration parameters'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainMigrateFlags'/>
- <return type='int' info='0 in case of success, -1 in case of failure.'/>
- </function>
- <function name='virDomainSetBlockIoTune' file='python'>
- <info>Change the I/O tunables for a block device</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='disk' type='const char *' info='disk name'/>
- <arg name='params' type='virTypedParameterPtr' info='Pointer to blkio tuning params object'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainModificationImpact'/>
- <return type='int' info='0 in case of success, -1 in case of failure'/>
- </function>
- <function name='virDomainGetBlockIoTune' file='python'>
- <info>Get the I/O tunables for a block device</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='disk' type='const char *' info='disk name'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainModificationImpact'/>
- <return type='char *' info='the I/O tunables value or None in case of error'/>
- </function>
- <function name='virDomainBlockPeek' file='python'>
- <info>Read the contents of domain's disk device</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='disk' type='const char *' info='disk name'/>
- <arg name='offset' type='unsigned long long' info='offset within block device'/>
- <arg name='size' type='size_t' info='size to read'/>
- <arg name='flags' type='unsigned int' info='unused, always pass 0'/>
- <return type='char *' info='the returned buffer or None in case of error'/>
- </function>
- <function name='virDomainMemoryPeek' file='python'>
- <info>Read the contents of domain's memory</info>
- <arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='start' type='unsigned long long' info='start of memory to peek'/>
- <arg name='size' type='size_t' info='size of memory to peek'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainMemoryFlags'/>
- <return type='char *' info='the returned buffer or None in case of error'/>
- </function>
- <function name='virDomainGetDiskErrors' file='python'>
- <info>Extract errors on disk devices.</info>
- <return type='char *' info='dictionary of disks and their errors or None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='a domain object'/>
- <arg name='flags' type='unsigned int' info='unused, always pass 0'/>
- </function>
- <function name='virNodeSetMemoryParameters' file='python'>
- <info>Change the node memory tunables</info>
- <return type='int' info='-1 in case of error, 0 in case of success.'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='params' type='virTypedParameterPtr' info='pointer to the memory tunable objects'/>
- <arg name='flags' type='int' info='unused, always pass 0'/>
- </function>
- <function name='virNodeGetMemoryParameters' file='python'>
- <info>Get the node memory parameters</info>
- <return type='char *' info='None in case of error, returns a dictionary of params'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='int' info='unused, always pass 0'/>
- </function>
- <function name='virNodeGetCPUMap' file='python'>
- <info>Get node CPU information</info>
- <return type='char *' info='(cpunum, cpumap, online) on success, None on error'/>
- <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
- <arg name='flags' type='int' info='unused, pass 0'/>
- </function>
- </symbols>
-</api>
diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py
deleted file mode 100644
index 4ba3d30..0000000
--- a/python/libvirt-override-virConnect.py
+++ /dev/null
@@ -1,351 +0,0 @@
- def __del__(self):
- try:
- for cb,opaque in self.domainEventCallbacks.items():
- del self.domainEventCallbacks[cb]
- del self.domainEventCallbacks
- libvirtmod.virConnectDomainEventDeregister(self._o, self)
- except AttributeError:
- pass
-
- if self._o is not None:
- libvirtmod.virConnectClose(self._o)
- self._o = None
-
- def domainEventDeregister(self, cb):
- """Removes a Domain Event Callback. De-registering for a
- domain callback will disable delivery of this event type """
- try:
- del self.domainEventCallbacks[cb]
- if len(self.domainEventCallbacks) == 0:
- del self.domainEventCallbacks
- ret = libvirtmod.virConnectDomainEventDeregister(self._o, self)
- if ret == -1: raise libvirtError ('virConnectDomainEventDeregister() failed', conn=self)
- except AttributeError:
- pass
-
- def domainEventRegister(self, cb, opaque):
- """Adds a Domain Event Callback. Registering for a domain
- callback will enable delivery of the events """
- try:
- self.domainEventCallbacks[cb] = opaque
- except AttributeError:
- self.domainEventCallbacks = {cb:opaque}
- ret = libvirtmod.virConnectDomainEventRegister(self._o, self)
- if ret == -1: raise libvirtError ('virConnectDomainEventRegister() failed', conn=self)
-
- def _dispatchDomainEventCallbacks(self, dom, event, detail):
- """Dispatches events to python user domain event callbacks
- """
- try:
- for cb,opaque in self.domainEventCallbacks.items():
- cb(self,dom,event,detail,opaque)
- return 0
- except AttributeError:
- pass
-
- def _dispatchDomainEventLifecycleCallback(self, dom, event, detail, cbData):
- """Dispatches events to python user domain lifecycle event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), event, detail, opaque)
- return 0
-
- def _dispatchDomainEventGenericCallback(self, dom, cbData):
- """Dispatches events to python user domain generic event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), opaque)
- return 0
-
- def _dispatchDomainEventRTCChangeCallback(self, dom, offset, cbData):
- """Dispatches events to python user domain RTC change event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), offset ,opaque)
- return 0
-
- def _dispatchDomainEventWatchdogCallback(self, dom, action, cbData):
- """Dispatches events to python user domain watchdog event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), action, opaque)
- return 0
-
- def _dispatchDomainEventIOErrorCallback(self, dom, srcPath, devAlias,
- action, cbData):
- """Dispatches events to python user domain IO error event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), srcPath, devAlias, action, opaque)
- return 0
-
- def _dispatchDomainEventIOErrorReasonCallback(self, dom, srcPath,
- devAlias, action, reason,
- cbData):
- """Dispatches events to python user domain IO error event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), srcPath, devAlias, action,
- reason, opaque)
- return 0
-
- def _dispatchDomainEventGraphicsCallback(self, dom, phase, localAddr,
- remoteAddr, authScheme, subject,
- cbData):
- """Dispatches events to python user domain graphics event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), phase, localAddr, remoteAddr,
- authScheme, subject, opaque)
- return 0
-
- def dispatchDomainEventBlockPullCallback(self, dom, path, type, status, cbData):
- """Dispatches events to python user domain blockJob event callbacks
- """
- try:
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), path, type, status, opaque)
- return 0
- except AttributeError:
- pass
-
- def _dispatchDomainEventDiskChangeCallback(self, dom, oldSrcPath, newSrcPath, devAlias, reason, cbData):
- """Dispatches event to python user domain diskChange event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), oldSrcPath, newSrcPath, devAlias, reason, opaque)
- return 0
-
- def _dispatchDomainEventTrayChangeCallback(self, dom, devAlias, reason, cbData):
- """Dispatches event to python user domain trayChange event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), devAlias, reason, opaque)
- return 0
-
- def _dispatchDomainEventPMWakeupCallback(self, dom, reason, cbData):
- """Dispatches event to python user domain pmwakeup event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), reason, opaque)
- return 0
-
- def _dispatchDomainEventPMSuspendCallback(self, dom, reason, cbData):
- """Dispatches event to python user domain pmsuspend event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), reason, opaque)
- return 0
-
- def _dispatchDomainEventBalloonChangeCallback(self, dom, actual, cbData):
- """Dispatches events to python user domain balloon change event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), actual, opaque)
- return 0
-
- def _dispatchDomainEventPMSuspendDiskCallback(self, dom, reason, cbData):
- """Dispatches event to python user domain pmsuspend-disk event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), reason, opaque)
- return 0
-
- def _dispatchDomainEventDeviceRemovedCallback(self, dom, devAlias, cbData):
- """Dispatches event to python user domain device removed event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, virDomain(self, _obj=dom), devAlias, opaque)
- return 0
-
- def domainEventDeregisterAny(self, callbackID):
- """Removes a Domain Event Callback. De-registering for a
- domain callback will disable delivery of this event type """
- try:
- ret = libvirtmod.virConnectDomainEventDeregisterAny(self._o, callbackID)
- if ret == -1: raise libvirtError ('virConnectDomainEventDeregisterAny() failed', conn=self)
- del self.domainEventCallbackID[callbackID]
- except AttributeError:
- pass
-
- def domainEventRegisterAny(self, dom, eventID, cb, opaque):
- """Adds a Domain Event Callback. Registering for a domain
- callback will enable delivery of the events """
- if not hasattr(self, 'domainEventCallbackID'):
- self.domainEventCallbackID = {}
- cbData = { "cb": cb, "conn": self, "opaque": opaque }
- if dom is None:
- ret = libvirtmod.virConnectDomainEventRegisterAny(self._o, None, eventID, cbData)
- else:
- ret = libvirtmod.virConnectDomainEventRegisterAny(self._o, dom._o, eventID, cbData)
- if ret == -1:
- raise libvirtError ('virConnectDomainEventRegisterAny() failed', conn=self)
- self.domainEventCallbackID[ret] = opaque
- return ret
-
- def listAllDomains(self, flags=0):
- """List all domains and returns a list of domain objects"""
- ret = libvirtmod.virConnectListAllDomains(self._o, flags)
- if ret is None:
- raise libvirtError("virConnectListAllDomains() failed", conn=self)
-
- retlist = list()
- for domptr in ret:
- retlist.append(virDomain(self, _obj=domptr))
-
- return retlist
-
- def listAllStoragePools(self, flags=0):
- """Returns a list of storage pool objects"""
- ret = libvirtmod.virConnectListAllStoragePools(self._o, flags)
- if ret is None:
- raise libvirtError("virConnectListAllStoragePools() failed", conn=self)
-
- retlist = list()
- for poolptr in ret:
- retlist.append(virStoragePool(self, _obj=poolptr))
-
- return retlist
-
- def listAllNetworks(self, flags=0):
- """Returns a list of network objects"""
- ret = libvirtmod.virConnectListAllNetworks(self._o, flags)
- if ret is None:
- raise libvirtError("virConnectListAllNetworks() failed", conn=self)
-
- retlist = list()
- for netptr in ret:
- retlist.append(virNetwork(self, _obj=netptr))
-
- return retlist
-
- def listAllInterfaces(self, flags=0):
- """Returns a list of interface objects"""
- ret = libvirtmod.virConnectListAllInterfaces(self._o, flags)
- if ret is None:
- raise libvirtError("virConnectListAllInterfaces() failed", conn=self)
-
- retlist = list()
- for ifaceptr in ret:
- retlist.append(virInterface(self, _obj=ifaceptr))
-
- return retlist
-
- def listAllDevices(self, flags=0):
- """Returns a list of host node device objects"""
- ret = libvirtmod.virConnectListAllNodeDevices(self._o, flags)
- if ret is None:
- raise libvirtError("virConnectListAllNodeDevices() failed", conn=self)
-
- retlist = list()
- for devptr in ret:
- retlist.append(virNodeDevice(self, _obj=devptr))
-
- return retlist
-
- def listAllNWFilters(self, flags=0):
- """Returns a list of network filter objects"""
- ret = libvirtmod.virConnectListAllNWFilters(self._o, flags)
- if ret is None:
- raise libvirtError("virConnectListAllNWFilters() failed", conn=self)
-
- retlist = list()
- for filter_ptr in ret:
- retlist.append(virNWFilter(self, _obj=filter_ptr))
-
- return retlist
-
- def listAllSecrets(self, flags=0):
- """Returns a list of secret objects"""
- ret = libvirtmod.virConnectListAllSecrets(self._o, flags)
- if ret is None:
- raise libvirtError("virConnectListAllSecrets() failed", conn=self)
-
- retlist = list()
- for secret_ptr in ret:
- retlist.append(virSecret(self, _obj=secret_ptr))
-
- return retlist
-
- def _dispatchCloseCallback(self, reason, cbData):
- """Dispatches events to python user close callback"""
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, reason, opaque)
- return 0
-
-
- def unregisterCloseCallback(self):
- """Removes a close event callback"""
- ret = libvirtmod.virConnectUnregisterCloseCallback(self._o)
- if ret == -1: raise libvirtError ('virConnectUnregisterCloseCallback() failed', conn=self)
-
- def registerCloseCallback(self, cb, opaque):
- """Adds a close event callback, providing a notification
- when a connection fails / closes"""
- cbData = { "cb": cb, "conn": self, "opaque": opaque }
- ret = libvirtmod.virConnectRegisterCloseCallback(self._o, cbData)
- if ret == -1:
- raise libvirtError ('virConnectRegisterCloseCallback() failed', conn=self)
- return ret
-
- def createXMLWithFiles(self, xmlDesc, files, flags=0):
- """Launch a new guest domain, based on an XML description similar
- to the one returned by virDomainGetXMLDesc()
- This function may require privileged access to the hypervisor.
- The domain is not persistent, so its definition will disappear when it
- is destroyed, or if the host is restarted (see virDomainDefineXML() to
- define persistent domains).
-
- @files provides an array of file descriptors which will be
- made available to the 'init' process of the guest. The file
- handles exposed to the guest will be renumbered to start
- from 3 (ie immediately following stderr). This is only
- supported for guests which use container based virtualization
- technology.
-
- If the VIR_DOMAIN_START_PAUSED flag is set, the guest domain
- will be started, but its CPUs will remain paused. The CPUs
- can later be manually started using virDomainResume.
-
- If the VIR_DOMAIN_START_AUTODESTROY flag is set, the guest
- domain will be automatically destroyed when the virConnectPtr
- object is finally released. This will also happen if the
- client application crashes / loses its connection to the
- libvirtd daemon. Any domains marked for auto destroy will
- block attempts at migration, save-to-file, or snapshots. """
- ret = libvirtmod.virDomainCreateXMLWithFiles(self._o, xmlDesc, files, flags)
- if ret is None:raise libvirtError('virDomainCreateXMLWithFiles() failed', conn=self)
- __tmp = virDomain(self,_obj=ret)
- return __tmp
diff --git a/python/libvirt-override-virDomain.py b/python/libvirt-override-virDomain.py
deleted file mode 100644
index c96cc5e..0000000
--- a/python/libvirt-override-virDomain.py
+++ /dev/null
@@ -1,49 +0,0 @@
- def listAllSnapshots(self, flags=0):
- """List all snapshots and returns a list of snapshot objects"""
- ret = libvirtmod.virDomainListAllSnapshots(self._o, flags)
- if ret is None:
- raise libvirtError("virDomainListAllSnapshots() failed", conn=self)
-
- retlist = list()
- for snapptr in ret:
- retlist.append(virDomainSnapshot(self, _obj=snapptr))
-
- return retlist
-
-
- def createWithFiles(self, files, flags=0):
- """Launch a defined domain. If the call succeeds the domain moves from the
- defined to the running domains pools.
-
- @files provides an array of file descriptors which will be
- made available to the 'init' process of the guest. The file
- handles exposed to the guest will be renumbered to start
- from 3 (ie immediately following stderr). This is only
- supported for guests which use container based virtualization
- technology.
-
- If the VIR_DOMAIN_START_PAUSED flag is set, or if the guest domain
- has a managed save image that requested paused state (see
- virDomainManagedSave()) the guest domain will be started, but its
- CPUs will remain paused. The CPUs can later be manually started
- using virDomainResume(). In all other cases, the guest domain will
- be running.
-
- If the VIR_DOMAIN_START_AUTODESTROY flag is set, the guest
- domain will be automatically destroyed when the virConnectPtr
- object is finally released. This will also happen if the
- client application crashes / loses its connection to the
- libvirtd daemon. Any domains marked for auto destroy will
- block attempts at migration, save-to-file, or snapshots.
-
- If the VIR_DOMAIN_START_BYPASS_CACHE flag is set, and there is a
- managed save file for this domain (created by virDomainManagedSave()),
- then libvirt will attempt to bypass the file system cache while restoring
- the file, or fail if it cannot do so for the given system; this can allow
- less pressure on file system cache, but also risks slowing loads from NFS.
-
- If the VIR_DOMAIN_START_FORCE_BOOT flag is set, then any managed save
- file for this domain is discarded, and the domain boots from scratch. """
- ret = libvirtmod.virDomainCreateWithFiles(self._o, files, flags)
- if ret == -1: raise libvirtError ('virDomainCreateWithFiles() failed', dom=self)
- return ret
diff --git a/python/libvirt-override-virDomainSnapshot.py b/python/libvirt-override-virDomainSnapshot.py
deleted file mode 100644
index ec53358..0000000
--- a/python/libvirt-override-virDomainSnapshot.py
+++ /dev/null
@@ -1,19 +0,0 @@
- def getConnect(self):
- """Get the connection that owns the domain that a snapshot was created for"""
- return self.connect()
-
- def getDomain(self):
- """Get the domain that a snapshot was created for"""
- return self.domain()
-
- def listAllChildren(self, flags=0):
- """List all child snapshots and returns a list of snapshot objects"""
- ret = libvirtmod.virDomainSnapshotListAllChildren(self._o, flags)
- if ret is None:
- raise libvirtError("virDomainSnapshotListAllChildren() failed", conn=self)
-
- retlist = list()
- for snapptr in ret:
- retlist.append(virDomainSnapshot(self, _obj=snapptr))
-
- return retlist
diff --git a/python/libvirt-override-virStoragePool.py b/python/libvirt-override-virStoragePool.py
deleted file mode 100644
index 325e403..0000000
--- a/python/libvirt-override-virStoragePool.py
+++ /dev/null
@@ -1,11 +0,0 @@
- def listAllVolumes(self, flags=0):
- """List all storage volumes and returns a list of storage volume objects"""
- ret = libvirtmod.virStoragePoolListAllVolumes(self._o, flags)
- if ret is None:
- raise libvirtError("virStoragePoolListAllVolumes() failed", conn=self)
-
- retlist = list()
- for volptr in ret:
- retlist.append(virStorageVol(self, _obj=volptr))
-
- return retlist
diff --git a/python/libvirt-override-virStream.py b/python/libvirt-override-virStream.py
deleted file mode 100644
index 53000da..0000000
--- a/python/libvirt-override-virStream.py
+++ /dev/null
@@ -1,125 +0,0 @@
- def __del__(self):
- try:
- if self.cb:
- libvirtmod.virStreamEventRemoveCallback(self._o)
- except AttributeError:
- pass
-
- if self._o is not None:
- libvirtmod.virStreamFree(self._o)
- self._o = None
-
- def _dispatchStreamEventCallback(self, events, cbData):
- """
- Dispatches events to python user's stream event callbacks
- """
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(self, events, opaque)
- return 0
-
- def eventAddCallback(self, events, cb, opaque):
- self.cb = cb
- cbData = {"stream": self, "cb" : cb, "opaque" : opaque}
- ret = libvirtmod.virStreamEventAddCallback(self._o, events, cbData)
- if ret == -1: raise libvirtError ('virStreamEventAddCallback() failed')
-
- def recvAll(self, handler, opaque):
- """Receive the entire data stream, sending the data to the
- requested data sink. This is simply a convenient alternative
- to virStreamRecv, for apps that do blocking-I/o.
-
- A hypothetical handler function looks like:
-
- def handler(stream, # virStream instance
- buf, # string containing received data
- opaque): # extra data passed to recvAll as opaque
- fd = opaque
- return os.write(fd, buf)
- """
- while True:
- got = self.recv(1024*64)
- if got == -2:
- raise libvirtError("cannot use recvAll with "
- "nonblocking stream")
- if len(got) == 0:
- break
-
- try:
- ret = handler(self, got, opaque)
- if type(ret) is int and ret < 0:
- raise RuntimeError("recvAll handler returned %d" % ret)
- except Exception, e:
- try:
- self.abort()
- except:
- pass
- raise e
-
- def sendAll(self, handler, opaque):
- """
- Send the entire data stream, reading the data from the
- requested data source. This is simply a convenient alternative
- to virStreamSend, for apps that do blocking-I/o.
-
- A hypothetical handler function looks like:
-
- def handler(stream, # virStream instance
- nbytes, # int amt of data to read
- opaque): # extra data passed to recvAll as opaque
- fd = opaque
- return os.read(fd, nbytes)
- """
- while True:
- try:
- got = handler(self, 1024*64, opaque)
- except:
- try:
- self.abort()
- except:
- pass
- raise e
-
- if got == "":
- break
-
- ret = self.send(got)
- if ret == -2:
- raise libvirtError("cannot use sendAll with "
- "nonblocking stream")
-
- def recv(self, nbytes):
- """Reads a series of bytes from the stream. This method may
- block the calling application for an arbitrary amount
- of time.
-
- Errors are not guaranteed to be reported synchronously
- with the call, but may instead be delayed until a
- subsequent call.
-
- On success, the received data is returned. On failure, an
- exception is raised. If the stream is a NONBLOCK stream and
- the request would block, integer -2 is returned.
- """
- ret = libvirtmod.virStreamRecv(self._o, nbytes)
- if ret is None: raise libvirtError ('virStreamRecv() failed')
- return ret
-
- def send(self, data):
- """Write a series of bytes to the stream. This method may
- block the calling application for an arbitrary amount
- of time. Once an application has finished sending data
- it should call virStreamFinish to wait for successful
- confirmation from the driver, or detect any error
-
- This method may not be used if a stream source has been
- registered
-
- Errors are not guaranteed to be reported synchronously
- with the call, but may instead be delayed until a
- subsequent call.
- """
- ret = libvirtmod.virStreamSend(self._o, data, len(data))
- if ret == -1: raise libvirtError ('virStreamSend() failed')
- return ret
diff --git a/python/libvirt-override.c b/python/libvirt-override.c
deleted file mode 100644
index c60747d..0000000
--- a/python/libvirt-override.c
+++ /dev/null
@@ -1,7379 +0,0 @@
-/*
- * libvir.c: this modules implements the main part of the glue of the
- * libvir library and the Python interpreter. It provides the
- * entry points where an automatically generated stub is
- * unpractical
- *
- * Copyright (C) 2005, 2007-2013 Red Hat, Inc.
- *
- * Daniel Veillard <veillard(a)redhat.com>
- */
-
-#include <config.h>
-
-/* Horrible kludge to work around even more horrible name-space pollution
- via Python.h. That file includes /usr/include/python2.5/pyconfig*.h,
- which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
-#undef HAVE_PTHREAD_H
-
-/* We want to see *_LAST enums. */
-#define VIR_ENUM_SENTINELS
-
-#include <Python.h>
-#include <libvirt/libvirt.h>
-#include <libvirt/virterror.h>
-#include "typewrappers.h"
-#include "libvirt.h"
-#include "viralloc.h"
-#include "virtypedparam.h"
-#include "ignore-value.h"
-#include "virutil.h"
-#include "virstring.h"
-
-#ifndef __CYGWIN__
-extern void initlibvirtmod(void);
-#else
-extern void initcygvirtmod(void);
-#endif
-
-#if 0
-# define DEBUG_ERROR 1
-#endif
-
-#if DEBUG_ERROR
-# define DEBUG(fmt, ...) \
- printf(fmt, __VA_ARGS__)
-#else
-# define DEBUG(fmt, ...) \
- do {} while (0)
-#endif
-
-/* The two-statement sequence "Py_INCREF(Py_None); return Py_None;"
- is so common that we encapsulate it here. Now, each use is simply
- return VIR_PY_NONE; */
-#define VIR_PY_NONE (Py_INCREF (Py_None), Py_None)
-#define VIR_PY_INT_FAIL (libvirt_intWrap(-1))
-#define VIR_PY_INT_SUCCESS (libvirt_intWrap(0))
-
-/* We don't want to free() returned value. As written in doc:
- * PyString_AsString returns pointer to 'internal buffer of string,
- * not a copy' and 'It must not be deallocated'. */
-static char *py_str(PyObject *obj)
-{
- PyObject *str = PyObject_Str(obj);
- if (!str) {
- PyErr_Print();
- PyErr_Clear();
- return NULL;
- };
- return PyString_AsString(str);
-}
-
-/* Helper function to convert a virTypedParameter output array into a
- * Python dictionary for return to the user. Return NULL on failure,
- * after raising a python exception. */
-static PyObject *
-getPyVirTypedParameter(const virTypedParameter *params, int nparams)
-{
- PyObject *key, *val, *info;
- size_t i;
-
- if ((info = PyDict_New()) == NULL)
- return NULL;
-
- for (i = 0; i < nparams; i++) {
- switch (params[i].type) {
- case VIR_TYPED_PARAM_INT:
- val = PyInt_FromLong(params[i].value.i);
- break;
-
- case VIR_TYPED_PARAM_UINT:
- val = PyInt_FromLong(params[i].value.ui);
- break;
-
- case VIR_TYPED_PARAM_LLONG:
- val = PyLong_FromLongLong(params[i].value.l);
- break;
-
- case VIR_TYPED_PARAM_ULLONG:
- val = PyLong_FromUnsignedLongLong(params[i].value.ul);
- break;
-
- case VIR_TYPED_PARAM_DOUBLE:
- val = PyFloat_FromDouble(params[i].value.d);
- break;
-
- case VIR_TYPED_PARAM_BOOLEAN:
- val = PyBool_FromLong(params[i].value.b);
- break;
-
- case VIR_TYPED_PARAM_STRING:
- val = libvirt_constcharPtrWrap(params[i].value.s);
- break;
-
- default:
- /* Possible if a newer server has a bug and sent stuff we
- * don't recognize. */
- PyErr_Format(PyExc_LookupError,
- "Type value \"%d\" not recognized",
- params[i].type);
- val = NULL;
- break;
- }
-
- key = libvirt_constcharPtrWrap(params[i].field);
- if (!key || !val)
- goto cleanup;
-
- if (PyDict_SetItem(info, key, val) < 0) {
- Py_DECREF(info);
- goto cleanup;
- }
-
- Py_DECREF(key);
- Py_DECREF(val);
- }
- return info;
-
-cleanup:
- Py_XDECREF(key);
- Py_XDECREF(val);
- return NULL;
-}
-
-/* Allocate a new typed parameter array with the same contents and
- * length as info, and using the array params of length nparams as
- * hints on what types to use when creating the new array. The caller
- * must NOT clear the array before freeing it, as it points into info
- * rather than allocated strings. Return NULL on failure, after
- * raising a python exception. */
-static virTypedParameterPtr ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
-setPyVirTypedParameter(PyObject *info,
- const virTypedParameter *params, int nparams)
-{
- PyObject *key, *value;
-#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 4
- int pos = 0;
-#else
- Py_ssize_t pos = 0;
-#endif
- virTypedParameterPtr temp = NULL, ret = NULL;
- Py_ssize_t size;
- size_t i;
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- /* Libvirt APIs use NULL array and 0 size as a special case;
- * setting should have at least one parameter. */
- if (size == 0) {
- PyErr_Format(PyExc_LookupError, "Dictionary must not be empty");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(ret, size) < 0) {
- PyErr_NoMemory();
- return NULL;
- }
-
- temp = &ret[0];
- while (PyDict_Next(info, &pos, &key, &value)) {
- char *keystr = NULL;
-
- if ((keystr = PyString_AsString(key)) == NULL)
- goto cleanup;
-
- for (i = 0; i < nparams; i++) {
- if (STREQ(params[i].field, keystr))
- break;
- }
- if (i == nparams) {
- PyErr_Format(PyExc_LookupError,
- "Attribute name \"%s\" could not be recognized",
- keystr);
- goto cleanup;
- }
-
- ignore_value(virStrcpyStatic(temp->field, keystr));
- temp->type = params[i].type;
-
- switch (params[i].type) {
- case VIR_TYPED_PARAM_INT:
- if (libvirt_intUnwrap(value, &temp->value.i) < 0)
- goto cleanup;
- break;
-
- case VIR_TYPED_PARAM_UINT:
- if (libvirt_uintUnwrap(value, &temp->value.ui) < 0)
- goto cleanup;
- break;
-
- case VIR_TYPED_PARAM_LLONG:
- if (libvirt_longlongUnwrap(value, &temp->value.l) < 0)
- goto cleanup;
- break;
-
- case VIR_TYPED_PARAM_ULLONG:
- if (libvirt_ulonglongUnwrap(value, &temp->value.ul) < 0)
- goto cleanup;
- break;
-
- case VIR_TYPED_PARAM_DOUBLE:
- if (libvirt_doubleUnwrap(value, &temp->value.d) < 0)
- goto cleanup;
- break;
-
- case VIR_TYPED_PARAM_BOOLEAN:
- {
- bool b;
- if (libvirt_boolUnwrap(value, &b) < 0)
- goto cleanup;
- temp->value.b = b;
- break;
- }
- case VIR_TYPED_PARAM_STRING:
- {
- char *string_val = PyString_AsString(value);
- if (!string_val)
- goto cleanup;
- temp->value.s = string_val;
- break;
- }
-
- default:
- /* Possible if a newer server has a bug and sent stuff we
- * don't recognize. */
- PyErr_Format(PyExc_LookupError,
- "Type value \"%d\" not recognized",
- params[i].type);
- goto cleanup;
- }
-
- temp++;
- }
- return ret;
-
-cleanup:
- VIR_FREE(ret);
- return NULL;
-}
-
-
-typedef struct {
- const char *name;
- int type;
-} virPyTypedParamsHint;
-typedef virPyTypedParamsHint *virPyTypedParamsHintPtr;
-
-/* Automatically convert dict into type parameters based on types reported
- * by python. All integer types are converted into LLONG (in case of a negative
- * value) or ULLONG (in case of a positive value). If you need different
- * handling, use @hints to explicitly specify what types should be used for
- * specific parameters.
- */
-static int
-ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
-virPyDictToTypedParams(PyObject *dict,
- virTypedParameterPtr *ret_params,
- int *ret_nparams,
- virPyTypedParamsHintPtr hints,
- int nhints)
-{
- PyObject *key;
- PyObject *value;
-#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 4
- int pos = 0;
-#else
- Py_ssize_t pos = 0;
-#endif
- virTypedParameterPtr params = NULL;
- size_t i;
- int n = 0;
- int max = 0;
- int ret = -1;
-
- *ret_params = NULL;
- *ret_nparams = 0;
-
- if (PyDict_Size(dict) < 0)
- return -1;
-
- while (PyDict_Next(dict, &pos, &key, &value)) {
- char *keystr;
- int type = -1;
-
- if (!(keystr = PyString_AsString(key)))
- goto cleanup;
-
- for (i = 0; i < nhints; i++) {
- if (STREQ(hints[i].name, keystr)) {
- type = hints[i].type;
- break;
- }
- }
-
- if (type == -1) {
- if (PyString_Check(value)) {
- type = VIR_TYPED_PARAM_STRING;
- } else if (PyBool_Check(value)) {
- type = VIR_TYPED_PARAM_BOOLEAN;
- } else if (PyLong_Check(value)) {
- unsigned long long ull = PyLong_AsUnsignedLongLong(value);
- if (ull == (unsigned long long) -1 && PyErr_Occurred())
- type = VIR_TYPED_PARAM_LLONG;
- else
- type = VIR_TYPED_PARAM_ULLONG;
- } else if (PyInt_Check(value)) {
- if (PyInt_AS_LONG(value) < 0)
- type = VIR_TYPED_PARAM_LLONG;
- else
- type = VIR_TYPED_PARAM_ULLONG;
- } else if (PyFloat_Check(value)) {
- type = VIR_TYPED_PARAM_DOUBLE;
- }
- }
-
- if (type == -1) {
- PyErr_Format(PyExc_TypeError,
- "Unknown type of \"%s\" field", keystr);
- goto cleanup;
- }
-
- switch ((virTypedParameterType) type) {
- case VIR_TYPED_PARAM_INT:
- {
- int val;
- if (libvirt_intUnwrap(value, &val) < 0 ||
- virTypedParamsAddInt(¶ms, &n, &max, keystr, val) < 0)
- goto cleanup;
- break;
- }
- case VIR_TYPED_PARAM_UINT:
- {
- unsigned int val;
- if (libvirt_uintUnwrap(value, &val) < 0 ||
- virTypedParamsAddUInt(¶ms, &n, &max, keystr, val) < 0)
- goto cleanup;
- break;
- }
- case VIR_TYPED_PARAM_LLONG:
- {
- long long val;
- if (libvirt_longlongUnwrap(value, &val) < 0 ||
- virTypedParamsAddLLong(¶ms, &n, &max, keystr, val) < 0)
- goto cleanup;
- break;
- }
- case VIR_TYPED_PARAM_ULLONG:
- {
- unsigned long long val;
- if (libvirt_ulonglongUnwrap(value, &val) < 0 ||
- virTypedParamsAddULLong(¶ms, &n, &max, keystr, val) < 0)
- goto cleanup;
- break;
- }
- case VIR_TYPED_PARAM_DOUBLE:
- {
- double val;
- if (libvirt_doubleUnwrap(value, &val) < 0 ||
- virTypedParamsAddDouble(¶ms, &n, &max, keystr, val) < 0)
- goto cleanup;
- break;
- }
- case VIR_TYPED_PARAM_BOOLEAN:
- {
- bool val;
- if (libvirt_boolUnwrap(value, &val) < 0 ||
- virTypedParamsAddBoolean(¶ms, &n, &max, keystr, val) < 0)
- goto cleanup;
- break;
- }
- case VIR_TYPED_PARAM_STRING:
- {
- char *val = PyString_AsString(value);
- if (!val ||
- virTypedParamsAddString(¶ms, &n, &max, keystr, val) < 0)
- goto cleanup;
- break;
- }
- case VIR_TYPED_PARAM_LAST:
- break; /* unreachable */
- }
- }
-
- *ret_params = params;
- *ret_nparams = n;
- params = NULL;
- ret = 0;
-
-cleanup:
- virTypedParamsFree(params, n);
- return ret;
-}
-
-
-/*
- * Utility function to retrieve the number of node CPUs present.
- * It first tries virGetNodeCPUMap, which will return the
- * number reliably, if available.
- * As a fallback and for compatibility with backlevel libvirt
- * versions virGetNodeInfo will be called to calculate the
- * CPU number, which has the potential to return a too small
- * number if some host CPUs are offline.
- */
-static int
-getPyNodeCPUCount(virConnectPtr conn) {
- int i_retval;
- virNodeInfo nodeinfo;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeGetCPUMap(conn, NULL, NULL, 0);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- /* fallback: use nodeinfo */
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeGetInfo(conn, &nodeinfo);
- LIBVIRT_END_ALLOW_THREADS;
- if (i_retval < 0)
- goto cleanup;
-
- i_retval = VIR_NODEINFO_MAXCPUS(nodeinfo);
- }
-
-cleanup:
- return i_retval;
-}
-
-/************************************************************************
- * *
- * Statistics *
- * *
- ************************************************************************/
-
-static PyObject *
-libvirt_virDomainBlockStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- virDomainPtr domain;
- PyObject *pyobj_domain;
- char * path;
- int c_retval;
- virDomainBlockStatsStruct stats;
- PyObject *info;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz:virDomainBlockStats",
- &pyobj_domain, &path))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainBlockStats(domain, path, &stats, sizeof(stats));
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- /* convert to a Python tuple of long objects */
- if ((info = PyTuple_New(5)) == NULL)
- return VIR_PY_NONE;
- PyTuple_SetItem(info, 0, PyLong_FromLongLong(stats.rd_req));
- PyTuple_SetItem(info, 1, PyLong_FromLongLong(stats.rd_bytes));
- PyTuple_SetItem(info, 2, PyLong_FromLongLong(stats.wr_req));
- PyTuple_SetItem(info, 3, PyLong_FromLongLong(stats.wr_bytes));
- PyTuple_SetItem(info, 4, PyLong_FromLongLong(stats.errs));
- return info;
-}
-
-static PyObject *
-libvirt_virDomainBlockStatsFlags(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- unsigned int flags;
- virTypedParameterPtr params;
- const char *path;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainBlockStatsFlags",
- &pyobj_domain, &path, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainBlockStatsFlags(domain, path, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainBlockStatsFlags(domain, path, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *totalbool;
- PyObject *cpu, *total;
- PyObject *ret = NULL;
- PyObject *error = NULL;
- int ncpus = -1, start_cpu = 0;
- int sumparams = 0, nparams = -1;
- size_t i;
- int i_retval;
- unsigned int flags;
- bool totalflag;
- virTypedParameterPtr params = NULL, cpuparams;
-
- if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainGetCPUStats",
- &pyobj_domain, &totalbool, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (libvirt_boolUnwrap(totalbool, &totalflag) < 0)
- return NULL;
-
- if ((ret = PyList_New(0)) == NULL)
- return NULL;
-
- if (!totalflag) {
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ncpus = virDomainGetCPUStats(domain, NULL, 0, 0, 0, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (ncpus < 0) {
- error = VIR_PY_NONE;
- goto error;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- nparams = virDomainGetCPUStats(domain, NULL, 0, 0, 1, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (nparams < 0) {
- error = VIR_PY_NONE;
- goto error;
- }
-
- sumparams = nparams * MIN(ncpus, 128);
-
- if (VIR_ALLOC_N_QUIET(params, sumparams) < 0) {
- error = PyErr_NoMemory();
- goto error;
- }
-
- while (ncpus) {
- int queried_ncpus = MIN(ncpus, 128);
- if (nparams) {
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetCPUStats(domain, params,
- nparams, start_cpu, queried_ncpus, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- error = VIR_PY_NONE;
- goto error;
- }
- } else {
- i_retval = 0;
- }
-
- for (i = 0; i < queried_ncpus; i++) {
- cpuparams = ¶ms[i * nparams];
- if ((cpu = getPyVirTypedParameter(cpuparams, i_retval)) == NULL) {
- goto error;
- }
-
- if (PyList_Append(ret, cpu) < 0) {
- Py_DECREF(cpu);
- goto error;
- }
- Py_DECREF(cpu);
- }
-
- start_cpu += queried_ncpus;
- ncpus -= queried_ncpus;
- virTypedParamsClear(params, sumparams);
- }
- } else {
- LIBVIRT_BEGIN_ALLOW_THREADS;
- nparams = virDomainGetCPUStats(domain, NULL, 0, -1, 1, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (nparams < 0) {
- error = VIR_PY_NONE;
- goto error;
- }
-
- if (nparams) {
- sumparams = nparams;
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0) {
- error = PyErr_NoMemory();
- goto error;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetCPUStats(domain, params, nparams, -1, 1, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- error = VIR_PY_NONE;
- goto error;
- }
- } else {
- i_retval = 0;
- }
-
- if ((total = getPyVirTypedParameter(params, i_retval)) == NULL) {
- goto error;
- }
- if (PyList_Append(ret, total) < 0) {
- Py_DECREF(total);
- goto error;
- }
- Py_DECREF(total);
- }
-
- virTypedParamsFree(params, sumparams);
- return ret;
-
-error:
- virTypedParamsFree(params, sumparams);
- Py_DECREF(ret);
- return error;
-}
-
-static PyObject *
-libvirt_virDomainInterfaceStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- virDomainPtr domain;
- PyObject *pyobj_domain;
- char * path;
- int c_retval;
- virDomainInterfaceStatsStruct stats;
- PyObject *info;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz:virDomainInterfaceStats",
- &pyobj_domain, &path))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainInterfaceStats(domain, path, &stats, sizeof(stats));
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- /* convert to a Python tuple of long objects */
- if ((info = PyTuple_New(8)) == NULL)
- return VIR_PY_NONE;
- PyTuple_SetItem(info, 0, PyLong_FromLongLong(stats.rx_bytes));
- PyTuple_SetItem(info, 1, PyLong_FromLongLong(stats.rx_packets));
- PyTuple_SetItem(info, 2, PyLong_FromLongLong(stats.rx_errs));
- PyTuple_SetItem(info, 3, PyLong_FromLongLong(stats.rx_drop));
- PyTuple_SetItem(info, 4, PyLong_FromLongLong(stats.tx_bytes));
- PyTuple_SetItem(info, 5, PyLong_FromLongLong(stats.tx_packets));
- PyTuple_SetItem(info, 6, PyLong_FromLongLong(stats.tx_errs));
- PyTuple_SetItem(info, 7, PyLong_FromLongLong(stats.tx_drop));
- return info;
-}
-
-static PyObject *
-libvirt_virDomainMemoryStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- virDomainPtr domain;
- PyObject *pyobj_domain;
- unsigned int nr_stats;
- size_t i;
- virDomainMemoryStatStruct stats[VIR_DOMAIN_MEMORY_STAT_NR];
- 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_DOMAIN_MEMORY_STAT_NR, 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_DOMAIN_MEMORY_STAT_SWAP_IN)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("swap_in"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_SWAP_OUT)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("swap_out"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("major_fault"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("minor_fault"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_UNUSED)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("unused"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_AVAILABLE)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("available"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("actual"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_RSS)
- PyDict_SetItem(info, libvirt_constcharPtrWrap("rss"),
- PyLong_FromUnsignedLongLong(stats[i].val));
- }
- return info;
-}
-
-static PyObject *
-libvirt_virDomainGetSchedulerType(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- char *c_retval;
- int nparams;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetScedulerType",
- &pyobj_domain))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetSchedulerType(domain, &nparams);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval == NULL)
- return VIR_PY_NONE;
-
- /* convert to a Python tuple of long objects */
- if ((info = PyTuple_New(2)) == NULL) {
- VIR_FREE(c_retval);
- return VIR_PY_NONE;
- }
-
- PyTuple_SetItem(info, 0, libvirt_constcharPtrWrap(c_retval));
- PyTuple_SetItem(info, 1, PyInt_FromLong((long)nparams));
- VIR_FREE(c_retval);
- return info;
-}
-
-static PyObject *
-libvirt_virDomainGetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- char *c_retval;
- int i_retval;
- int nparams = 0;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetScedulerParameters",
- &pyobj_domain))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetSchedulerType(domain, &nparams);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == NULL)
- return VIR_PY_NONE;
- VIR_FREE(c_retval);
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetSchedulerParameters(domain, params, &nparams);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetSchedulerParametersFlags(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- char *c_retval;
- int i_retval;
- int nparams = 0;
- unsigned int flags;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetScedulerParametersFlags",
- &pyobj_domain, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetSchedulerType(domain, &nparams);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == NULL)
- return VIR_PY_NONE;
- VIR_FREE(c_retval);
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetSchedulerParametersFlags(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainSetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- PyObject *ret = NULL;
- char *c_retval;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args, (char *)"OO:virDomainSetScedulerParameters",
- &pyobj_domain, &info))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetSchedulerType(domain, &nparams);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == NULL)
- return VIR_PY_INT_FAIL;
- VIR_FREE(c_retval);
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "Domain has no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetSchedulerParameters(domain, params, &nparams);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainSetSchedulerParameters(domain, new_params, size);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainSetSchedulerParametersFlags(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- PyObject *ret = NULL;
- char *c_retval;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- unsigned int flags;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args,
- (char *)"OOi:virDomainSetScedulerParametersFlags",
- &pyobj_domain, &info, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetSchedulerType(domain, &nparams);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == NULL)
- return VIR_PY_INT_FAIL;
- VIR_FREE(c_retval);
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "Domain has no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetSchedulerParametersFlags(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainSetSchedulerParametersFlags(domain, new_params, size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainSetBlkioParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- unsigned int flags;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args,
- (char *)"OOi:virDomainSetBlkioParameters",
- &pyobj_domain, &info, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlkioParameters(domain, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "Domain has no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlkioParameters(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainSetBlkioParameters(domain, new_params, size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetBlkioParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- unsigned int flags;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetBlkioParameters",
- &pyobj_domain, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlkioParameters(domain, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlkioParameters(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainSetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- unsigned int flags;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args,
- (char *)"OOi:virDomainSetMemoryParameters",
- &pyobj_domain, &info, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetMemoryParameters(domain, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "Domain has no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetMemoryParameters(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainSetMemoryParameters(domain, new_params, size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- unsigned int flags;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetMemoryParameters",
- &pyobj_domain, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetMemoryParameters(domain, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetMemoryParameters(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainSetNumaParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- unsigned int flags;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args,
- (char *)"OOi:virDomainSetNumaParameters",
- &pyobj_domain, &info, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetNumaParameters(domain, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "Domain has no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetNumaParameters(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainSetNumaParameters(domain, new_params, size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetNumaParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- unsigned int flags;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetNumaParameters",
- &pyobj_domain, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetNumaParameters(domain, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetNumaParameters(domain, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainSetInterfaceParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- unsigned int flags;
- const char *device = NULL;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args,
- (char *)"OzOi:virDomainSetInterfaceParameters",
- &pyobj_domain, &device, &info, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetInterfaceParameters(domain, device, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "Domain has no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetInterfaceParameters(domain, device, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainSetInterfaceParameters(domain, device, new_params, size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetInterfaceParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- unsigned int flags;
- const char *device = NULL;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetInterfaceParameters",
- &pyobj_domain, &device, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetInterfaceParameters(domain, device, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetInterfaceParameters(domain, device, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetVcpus(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *pyretval = NULL, *pycpuinfo = NULL, *pycpumap = NULL;
- PyObject *error = NULL;
- virDomainInfo dominfo;
- virVcpuInfoPtr cpuinfo = NULL;
- unsigned char *cpumap = NULL;
- size_t cpumaplen, i;
- int i_retval, cpunum;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetVcpus",
- &pyobj_domain))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
- return VIR_PY_INT_FAIL;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetInfo(domain, &dominfo);
- LIBVIRT_END_ALLOW_THREADS;
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- if (VIR_ALLOC_N_QUIET(cpuinfo, dominfo.nrVirtCpu) < 0)
- return PyErr_NoMemory();
-
- cpumaplen = VIR_CPU_MAPLEN(cpunum);
- if (xalloc_oversized(dominfo.nrVirtCpu, cpumaplen) ||
- VIR_ALLOC_N_QUIET(cpumap, dominfo.nrVirtCpu * cpumaplen) < 0) {
- error = PyErr_NoMemory();
- goto cleanup;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetVcpus(domain,
- cpuinfo, dominfo.nrVirtCpu,
- cpumap, cpumaplen);
- LIBVIRT_END_ALLOW_THREADS;
- if (i_retval < 0) {
- error = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- /* convert to a Python tuple of long objects */
- if ((pyretval = PyTuple_New(2)) == NULL)
- goto cleanup;
- if ((pycpuinfo = PyList_New(dominfo.nrVirtCpu)) == NULL)
- goto cleanup;
- if ((pycpumap = PyList_New(dominfo.nrVirtCpu)) == NULL)
- goto cleanup;
-
- for (i = 0; i < dominfo.nrVirtCpu; i++) {
- PyObject *info = PyTuple_New(4);
- PyObject *item = NULL;
-
- if (info == NULL)
- goto cleanup;
-
- if ((item = PyInt_FromLong((long)cpuinfo[i].number)) == NULL ||
- PyTuple_SetItem(info, 0, item) < 0)
- goto itemError;
-
- if ((item = PyInt_FromLong((long)cpuinfo[i].state)) == NULL ||
- PyTuple_SetItem(info, 1, item) < 0)
- goto itemError;
-
- if ((item = PyLong_FromLongLong((long long)cpuinfo[i].cpuTime)) == NULL ||
- PyTuple_SetItem(info, 2, item) < 0)
- goto itemError;
-
- if ((item = PyInt_FromLong((long)cpuinfo[i].cpu)) == NULL ||
- PyTuple_SetItem(info, 3, item) < 0)
- goto itemError;
-
- if (PyList_SetItem(pycpuinfo, i, info) < 0)
- goto itemError;
-
- continue;
- itemError:
- Py_DECREF(info);
- Py_XDECREF(item);
- goto cleanup;
- }
- for (i = 0; i < dominfo.nrVirtCpu; i++) {
- PyObject *info = PyTuple_New(cpunum);
- size_t j;
- if (info == NULL)
- goto cleanup;
- for (j = 0; j < cpunum; j++) {
- PyObject *item = NULL;
- if ((item = PyBool_FromLong(VIR_CPU_USABLE(cpumap, cpumaplen, i, j))) == NULL ||
- PyTuple_SetItem(info, j, item) < 0) {
- Py_DECREF(info);
- Py_XDECREF(item);
- goto cleanup;
- }
- }
- if (PyList_SetItem(pycpumap, i, info) < 0) {
- Py_DECREF(info);
- goto cleanup;
- }
- }
- if (PyTuple_SetItem(pyretval, 0, pycpuinfo) < 0 ||
- PyTuple_SetItem(pyretval, 1, pycpumap) < 0)
- goto cleanup;
-
- VIR_FREE(cpuinfo);
- VIR_FREE(cpumap);
-
- return pyretval;
-
-cleanup:
- VIR_FREE(cpuinfo);
- VIR_FREE(cpumap);
- Py_XDECREF(pyretval);
- Py_XDECREF(pycpuinfo);
- Py_XDECREF(pycpumap);
- return error;
-}
-
-
-static PyObject *
-libvirt_virDomainPinVcpu(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *pycpumap;
- PyObject *ret = NULL;
- unsigned char *cpumap;
- int cpumaplen, vcpu, tuple_size, cpunum;
- size_t i;
- int i_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"OiO:virDomainPinVcpu",
- &pyobj_domain, &vcpu, &pycpumap))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
- return VIR_PY_INT_FAIL;
-
- if (PyTuple_Check(pycpumap)) {
- tuple_size = PyTuple_Size(pycpumap);
- if (tuple_size == -1)
- return ret;
- } else {
- PyErr_SetString(PyExc_TypeError, "Unexpected type, tuple is required");
- return ret;
- }
-
- cpumaplen = VIR_CPU_MAPLEN(cpunum);
- if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
- return PyErr_NoMemory();
-
- for (i = 0; i < tuple_size; i++) {
- PyObject *flag = PyTuple_GetItem(pycpumap, i);
- bool b;
-
- if (!flag || libvirt_boolUnwrap(flag, &b) < 0)
- goto cleanup;
-
- if (b)
- VIR_USE_CPU(cpumap, i);
- else
- VIR_UNUSE_CPU(cpumap, i);
- }
-
- for (; i < cpunum; i++)
- VIR_UNUSE_CPU(cpumap, i);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainPinVcpu(domain, vcpu, cpumap, cpumaplen);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- VIR_FREE(cpumap);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainPinVcpuFlags(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *pycpumap;
- PyObject *ret = NULL;
- unsigned char *cpumap;
- int cpumaplen, vcpu, tuple_size, cpunum;
- size_t i;
- unsigned int flags;
- int i_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"OiOi:virDomainPinVcpuFlags",
- &pyobj_domain, &vcpu, &pycpumap, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
- return VIR_PY_INT_FAIL;
-
- if (PyTuple_Check(pycpumap)) {
- tuple_size = PyTuple_Size(pycpumap);
- if (tuple_size == -1)
- return ret;
- } else {
- PyErr_SetString(PyExc_TypeError, "Unexpected type, tuple is required");
- return ret;
- }
-
- cpumaplen = VIR_CPU_MAPLEN(cpunum);
- if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
- return PyErr_NoMemory();
-
- for (i = 0; i < tuple_size; i++) {
- PyObject *flag = PyTuple_GetItem(pycpumap, i);
- bool b;
-
- if (!flag || libvirt_boolUnwrap(flag, &b) < 0)
- goto cleanup;
-
- if (b)
- VIR_USE_CPU(cpumap, i);
- else
- VIR_UNUSE_CPU(cpumap, i);
- }
-
- for (; i < cpunum; i++)
- VIR_UNUSE_CPU(cpumap, i);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainPinVcpuFlags(domain, vcpu, cpumap, cpumaplen, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- VIR_FREE(cpumap);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetVcpuPinInfo(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- virDomainPtr domain;
- PyObject *pyobj_domain, *pycpumaps = NULL;
- virDomainInfo dominfo;
- unsigned char *cpumaps = NULL;
- size_t cpumaplen, vcpu, pcpu;
- unsigned int flags;
- int i_retval, cpunum;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetVcpuPinInfo",
- &pyobj_domain, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
- return VIR_PY_INT_FAIL;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetInfo(domain, &dominfo);
- LIBVIRT_END_ALLOW_THREADS;
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- cpumaplen = VIR_CPU_MAPLEN(cpunum);
- if (xalloc_oversized(dominfo.nrVirtCpu, cpumaplen) ||
- VIR_ALLOC_N_QUIET(cpumaps, dominfo.nrVirtCpu * cpumaplen) < 0)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetVcpuPinInfo(domain, dominfo.nrVirtCpu,
- cpumaps, cpumaplen, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (i_retval < 0)
- goto cleanup;
-
- if ((pycpumaps = PyList_New(dominfo.nrVirtCpu)) == NULL)
- goto cleanup;
-
- for (vcpu = 0; vcpu < dominfo.nrVirtCpu; vcpu++) {
- PyObject *mapinfo = PyTuple_New(cpunum);
- if (mapinfo == NULL)
- goto cleanup;
-
- for (pcpu = 0; pcpu < cpunum; pcpu++) {
- PyTuple_SetItem(mapinfo, pcpu,
- PyBool_FromLong(VIR_CPU_USABLE(cpumaps, cpumaplen, vcpu, pcpu)));
- }
- PyList_SetItem(pycpumaps, vcpu, mapinfo);
- }
-
- VIR_FREE(cpumaps);
-
- return pycpumaps;
-
-cleanup:
- VIR_FREE(cpumaps);
-
- Py_XDECREF(pycpumaps);
-
- return VIR_PY_NONE;
-}
-
-
-static PyObject *
-libvirt_virDomainPinEmulator(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *pycpumap;
- unsigned char *cpumap = NULL;
- int cpumaplen, tuple_size, cpunum;
- size_t i;
- int i_retval;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainPinVcpu",
- &pyobj_domain, &pycpumap, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
- return VIR_PY_INT_FAIL;
-
- cpumaplen = VIR_CPU_MAPLEN(cpunum);
-
- if (!PyTuple_Check(pycpumap)) {
- PyErr_SetString(PyExc_TypeError, "Unexpected type, tuple is required");
- return NULL;
- }
-
- if ((tuple_size = PyTuple_Size(pycpumap)) == -1)
- return NULL;
-
- if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
- return PyErr_NoMemory();
-
- for (i = 0; i < tuple_size; i++) {
- PyObject *flag = PyTuple_GetItem(pycpumap, i);
- bool b;
-
- if (!flag || libvirt_boolUnwrap(flag, &b) < 0) {
- VIR_FREE(cpumap);
- return VIR_PY_INT_FAIL;
- }
-
- if (b)
- VIR_USE_CPU(cpumap, i);
- else
- VIR_UNUSE_CPU(cpumap, i);
- }
-
- for (; i < cpunum; i++)
- VIR_UNUSE_CPU(cpumap, i);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainPinEmulator(domain, cpumap, cpumaplen, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- VIR_FREE(cpumap);
-
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- return VIR_PY_INT_SUCCESS;
-}
-
-
-static PyObject *
-libvirt_virDomainGetEmulatorPinInfo(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *pycpumap;
- unsigned char *cpumap;
- size_t cpumaplen;
- size_t pcpu;
- unsigned int flags;
- int ret;
- int cpunum;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainEmulatorPinInfo",
- &pyobj_domain, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
- return VIR_PY_NONE;
-
- cpumaplen = VIR_CPU_MAPLEN(cpunum);
-
- if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virDomainGetEmulatorPinInfo(domain, cpumap, cpumaplen, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (ret < 0) {
- VIR_FREE(cpumap);
- return VIR_PY_NONE;
- }
-
- if (!(pycpumap = PyTuple_New(cpunum))) {
- VIR_FREE(cpumap);
- return NULL;
- }
-
- for (pcpu = 0; pcpu < cpunum; pcpu++)
- PyTuple_SET_ITEM(pycpumap, pcpu,
- PyBool_FromLong(VIR_CPU_USABLE(cpumap, cpumaplen,
- 0, pcpu)));
-
- VIR_FREE(cpumap);
- return pycpumap;
-}
-
-
-/************************************************************************
- * *
- * Global error handler at the Python level *
- * *
- ************************************************************************/
-
-static PyObject *libvirt_virPythonErrorFuncHandler = NULL;
-static PyObject *libvirt_virPythonErrorFuncCtxt = NULL;
-
-static PyObject *
-libvirt_virGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args ATTRIBUTE_UNUSED)
-{
- virError *err;
- PyObject *info;
-
- if ((err = virGetLastError()) == NULL)
- return VIR_PY_NONE;
-
- if ((info = PyTuple_New(9)) == NULL)
- return VIR_PY_NONE;
- PyTuple_SetItem(info, 0, PyInt_FromLong((long) err->code));
- PyTuple_SetItem(info, 1, PyInt_FromLong((long) err->domain));
- PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(err->message));
- PyTuple_SetItem(info, 3, PyInt_FromLong((long) err->level));
- PyTuple_SetItem(info, 4, libvirt_constcharPtrWrap(err->str1));
- PyTuple_SetItem(info, 5, libvirt_constcharPtrWrap(err->str2));
- PyTuple_SetItem(info, 6, libvirt_constcharPtrWrap(err->str3));
- PyTuple_SetItem(info, 7, PyInt_FromLong((long) err->int1));
- PyTuple_SetItem(info, 8, PyInt_FromLong((long) err->int2));
-
- return info;
-}
-
-static PyObject *
-libvirt_virConnGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- virError *err;
- PyObject *info;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConGetLastError", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- err = virConnGetLastError(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (err == NULL)
- return VIR_PY_NONE;
-
- if ((info = PyTuple_New(9)) == NULL)
- return VIR_PY_NONE;
- PyTuple_SetItem(info, 0, PyInt_FromLong((long) err->code));
- PyTuple_SetItem(info, 1, PyInt_FromLong((long) err->domain));
- PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(err->message));
- PyTuple_SetItem(info, 3, PyInt_FromLong((long) err->level));
- PyTuple_SetItem(info, 4, libvirt_constcharPtrWrap(err->str1));
- PyTuple_SetItem(info, 5, libvirt_constcharPtrWrap(err->str2));
- PyTuple_SetItem(info, 6, libvirt_constcharPtrWrap(err->str3));
- PyTuple_SetItem(info, 7, PyInt_FromLong((long) err->int1));
- PyTuple_SetItem(info, 8, PyInt_FromLong((long) err->int2));
-
- return info;
-}
-
-static void
-libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, virErrorPtr err)
-{
- PyObject *list, *info;
- PyObject *result;
-
- DEBUG("libvirt_virErrorFuncHandler(%p, %s, ...) called\n", ctx,
- err->message);
-
- if ((err == NULL) || (err->code == VIR_ERR_OK))
- return;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- if ((libvirt_virPythonErrorFuncHandler == NULL) ||
- (libvirt_virPythonErrorFuncHandler == Py_None)) {
- virDefaultErrorFunc(err);
- } else {
- list = PyTuple_New(2);
- info = PyTuple_New(9);
- PyTuple_SetItem(list, 0, libvirt_virPythonErrorFuncCtxt);
- PyTuple_SetItem(list, 1, info);
- Py_XINCREF(libvirt_virPythonErrorFuncCtxt);
- PyTuple_SetItem(info, 0, PyInt_FromLong((long) err->code));
- PyTuple_SetItem(info, 1, PyInt_FromLong((long) err->domain));
- PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(err->message));
- PyTuple_SetItem(info, 3, PyInt_FromLong((long) err->level));
- PyTuple_SetItem(info, 4, libvirt_constcharPtrWrap(err->str1));
- PyTuple_SetItem(info, 5, libvirt_constcharPtrWrap(err->str2));
- PyTuple_SetItem(info, 6, libvirt_constcharPtrWrap(err->str3));
- PyTuple_SetItem(info, 7, PyInt_FromLong((long) err->int1));
- PyTuple_SetItem(info, 8, PyInt_FromLong((long) err->int2));
- /* TODO pass conn and dom if available */
- result = PyEval_CallObject(libvirt_virPythonErrorFuncHandler, list);
- Py_XDECREF(list);
- Py_XDECREF(result);
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static PyObject *
-libvirt_virRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- PyObject *py_retval;
- PyObject *pyobj_f;
- PyObject *pyobj_ctx;
-
- if (!PyArg_ParseTuple
- (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f,
- &pyobj_ctx))
- return NULL;
-
- DEBUG("libvirt_virRegisterErrorHandler(%p, %p) called\n", pyobj_ctx,
- pyobj_f);
-
- virSetErrorFunc(NULL, libvirt_virErrorFuncHandler);
- if (libvirt_virPythonErrorFuncHandler != NULL) {
- Py_XDECREF(libvirt_virPythonErrorFuncHandler);
- }
- if (libvirt_virPythonErrorFuncCtxt != NULL) {
- Py_XDECREF(libvirt_virPythonErrorFuncCtxt);
- }
-
- if ((pyobj_f == Py_None) && (pyobj_ctx == Py_None)) {
- libvirt_virPythonErrorFuncHandler = NULL;
- libvirt_virPythonErrorFuncCtxt = NULL;
- } else {
- Py_XINCREF(pyobj_ctx);
- Py_XINCREF(pyobj_f);
-
- /* TODO: check f is a function ! */
- libvirt_virPythonErrorFuncHandler = pyobj_f;
- libvirt_virPythonErrorFuncCtxt = pyobj_ctx;
- }
-
- py_retval = libvirt_intWrap(1);
- return py_retval;
-}
-
-static int virConnectCredCallbackWrapper(virConnectCredentialPtr cred,
- unsigned int ncred,
- void *cbdata) {
- PyObject *list;
- PyObject *pycred;
- PyObject *pyauth = (PyObject *)cbdata;
- PyObject *pycbdata;
- PyObject *pycb;
- PyObject *pyret;
- int ret = -1;
- size_t i;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- pycb = PyList_GetItem(pyauth, 1);
- pycbdata = PyList_GetItem(pyauth, 2);
-
- list = PyTuple_New(2);
- pycred = PyTuple_New(ncred);
- for (i = 0; i < ncred; i++) {
- PyObject *pycreditem;
- pycreditem = PyList_New(5);
- Py_INCREF(Py_None);
- PyTuple_SetItem(pycred, i, pycreditem);
- PyList_SetItem(pycreditem, 0, PyInt_FromLong((long) cred[i].type));
- PyList_SetItem(pycreditem, 1, PyString_FromString(cred[i].prompt));
- if (cred[i].challenge) {
- PyList_SetItem(pycreditem, 2, PyString_FromString(cred[i].challenge));
- } else {
- Py_INCREF(Py_None);
- PyList_SetItem(pycreditem, 2, Py_None);
- }
- if (cred[i].defresult) {
- PyList_SetItem(pycreditem, 3, PyString_FromString(cred[i].defresult));
- } else {
- Py_INCREF(Py_None);
- PyList_SetItem(pycreditem, 3, Py_None);
- }
- PyList_SetItem(pycreditem, 4, Py_None);
- }
-
- PyTuple_SetItem(list, 0, pycred);
- Py_XINCREF(pycbdata);
- PyTuple_SetItem(list, 1, pycbdata);
-
- PyErr_Clear();
- pyret = PyEval_CallObject(pycb, list);
- if (PyErr_Occurred()) {
- PyErr_Print();
- goto cleanup;
- }
-
- ret = PyLong_AsLong(pyret);
- if (ret == 0) {
- for (i = 0; i < ncred; i++) {
- PyObject *pycreditem;
- PyObject *pyresult;
- char *result = NULL;
- pycreditem = PyTuple_GetItem(pycred, i);
- pyresult = PyList_GetItem(pycreditem, 4);
- if (pyresult != Py_None)
- result = PyString_AsString(pyresult);
- if (result != NULL) {
- cred[i].result = strdup(result);
- cred[i].resultlen = strlen(result);
- } else {
- cred[i].result = NULL;
- cred[i].resultlen = 0;
- }
- }
- }
-
- cleanup:
- Py_XDECREF(list);
- Py_XDECREF(pyret);
-
- LIBVIRT_RELEASE_THREAD_STATE;
-
- return ret;
-}
-
-
-static PyObject *
-libvirt_virConnectOpenAuth(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- virConnectPtr c_retval;
- char * name;
- unsigned int flags;
- PyObject *pyauth;
- PyObject *pycredcb;
- PyObject *pycredtype;
- virConnectAuth auth;
-
- memset(&auth, 0, sizeof(auth));
- if (!PyArg_ParseTuple(args, (char *)"zOi:virConnectOpenAuth", &name, &pyauth, &flags))
- return NULL;
-
- pycredtype = PyList_GetItem(pyauth, 0);
- pycredcb = PyList_GetItem(pyauth, 1);
-
- auth.ncredtype = PyList_Size(pycredtype);
- if (auth.ncredtype) {
- size_t i;
- if (VIR_ALLOC_N_QUIET(auth.credtype, auth.ncredtype) < 0)
- return VIR_PY_NONE;
- for (i = 0; i < auth.ncredtype; i++) {
- PyObject *val;
- val = PyList_GetItem(pycredtype, i);
- auth.credtype[i] = (int)PyLong_AsLong(val);
- }
- }
- if (pycredcb && pycredcb != Py_None)
- auth.cb = virConnectCredCallbackWrapper;
- auth.cbdata = pyauth;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- c_retval = virConnectOpenAuth(name, &auth, flags);
- LIBVIRT_END_ALLOW_THREADS;
- VIR_FREE(auth.credtype);
- py_retval = libvirt_virConnectPtrWrap((virConnectPtr) c_retval);
- return py_retval;
-}
-
-
-/************************************************************************
- * *
- * Wrappers for functions where generator fails *
- * *
- ************************************************************************/
-
-static PyObject *
-libvirt_virGetVersion(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- char *type = NULL;
- unsigned long libVer, typeVer = 0;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *) "|s", &type))
- return NULL;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- if (type == NULL)
- c_retval = virGetVersion(&libVer, NULL, NULL);
- else
- c_retval = virGetVersion(&libVer, type, &typeVer);
-
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == -1)
- return VIR_PY_NONE;
-
- if (type == NULL)
- return PyInt_FromLong(libVer);
- else
- return Py_BuildValue((char *) "kk", libVer, typeVer);
-}
-
-static PyObject *
-libvirt_virConnectGetVersion(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- unsigned long hvVersion;
- int c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectGetVersion",
- &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- c_retval = virConnectGetVersion(conn, &hvVersion);
-
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == -1)
- return VIR_PY_INT_FAIL;
-
- return PyInt_FromLong(hvVersion);
-}
-
-static PyObject *
-libvirt_virConnectGetCPUModelNames(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- int c_retval;
- virConnectPtr conn;
- PyObject *rv = NULL, *pyobj_conn;
- char **models = NULL;
- size_t i;
- int flags = 0;
- const char *arch = NULL;
-
- if (!PyArg_ParseTuple(args, (char *)"Osi:virConnectGetCPUModelNames",
- &pyobj_conn, &arch, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- c_retval = virConnectGetCPUModelNames(conn, arch, &models, flags);
-
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == -1)
- return VIR_PY_INT_FAIL;
-
- if ((rv = PyList_New(c_retval)) == NULL)
- goto error;
-
- for (i = 0; i < c_retval; i++) {
- PyObject *str;
- if ((str = PyString_FromString(models[i])) == NULL)
- goto error;
-
- PyList_SET_ITEM(rv, i, str);
- }
-
-done:
- if (models) {
- for (i = 0; i < c_retval; i++)
- VIR_FREE(models[i]);
- VIR_FREE(models);
- }
-
- return rv;
-
-error:
- Py_XDECREF(rv);
- rv = VIR_PY_INT_FAIL;
- goto done;
-}
-
-static PyObject *
-libvirt_virConnectGetLibVersion(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- unsigned long libVer;
- int c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectGetLibVersion",
- &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- c_retval = virConnectGetLibVersion(conn, &libVer);
-
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == -1)
- return VIR_PY_INT_FAIL;
-
- return PyInt_FromLong(libVer);
-}
-
-static PyObject *
-libvirt_virConnectListDomainsID(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- int *ids = NULL, c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDomains", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfDomains(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(ids, c_retval) < 0)
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListDomains(conn, ids, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(ids);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
-
- if (ids) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_intWrap(ids[i]));
- }
- VIR_FREE(ids);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListAllDomains(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_conn;
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virConnectPtr conn;
- virDomainPtr *doms = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllDomains",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListAllDomains(conn, &doms, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virDomainPtrWrap(doms[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- doms[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (doms[i])
- virDomainFree(doms[i]);
- VIR_FREE(doms);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListDefinedDomains(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedDomains", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfDefinedDomains(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListDefinedDomains(conn, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_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]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainSnapshotListNames(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virDomainPtr dom;
- PyObject *pyobj_dom;
- PyObject *pyobj_snap;
- unsigned 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) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return PyErr_NoMemory();
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainSnapshotListNames(dom, names, c_retval, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(names);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
- if (!py_retval)
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if ((pyobj_snap = libvirt_constcharPtrWrap(names[i])) == NULL ||
- PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
- Py_XDECREF(pyobj_snap);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- VIR_FREE(names[i]);
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- VIR_FREE(names[i]);
- VIR_FREE(names);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainListAllSnapshots(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval = NULL;
- virDomainSnapshotPtr *snaps = NULL;
- int c_retval;
- size_t i;
- virDomainPtr dom;
- PyObject *pyobj_dom;
- unsigned int flags;
- PyObject *pyobj_snap;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainListAllSnapshots",
- &pyobj_dom, &flags))
- return NULL;
- dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainListAllSnapshots(dom, &snaps, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if ((pyobj_snap = libvirt_virDomainSnapshotPtrWrap(snaps[i])) == NULL ||
- PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
- Py_XDECREF(pyobj_snap);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- snaps[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (snaps[i])
- virDomainSnapshotFree(snaps[i]);
- VIR_FREE(snaps);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainSnapshotListChildrenNames(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virDomainSnapshotPtr snap;
- PyObject *pyobj_snap;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainSnapshotListChildrenNames",
- &pyobj_snap, &flags))
- return NULL;
- snap = (virDomainSnapshotPtr) PyvirDomainSnapshot_Get(pyobj_snap);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainSnapshotNumChildren(snap, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return PyErr_NoMemory();
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainSnapshotListChildrenNames(snap, names, c_retval,
- flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(names);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
-
- for (i = 0; i < c_retval; i++) {
- if ((pyobj_snap = libvirt_constcharPtrWrap(names[i])) == NULL ||
- PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
- Py_XDECREF(pyobj_snap);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- VIR_FREE(names[i]);
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- VIR_FREE(names[i]);
- VIR_FREE(names);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainSnapshotListAllChildren(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval = NULL;
- virDomainSnapshotPtr *snaps = NULL;
- int c_retval;
- size_t i;
- virDomainSnapshotPtr parent;
- PyObject *pyobj_parent;
- unsigned int flags;
- PyObject *pyobj_snap;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainSnapshotListAllChildren",
- &pyobj_parent, &flags))
- return NULL;
- parent = (virDomainSnapshotPtr) PyvirDomainSnapshot_Get(pyobj_parent);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainSnapshotListAllChildren(parent, &snaps, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if ((pyobj_snap = libvirt_virDomainSnapshotPtrWrap(snaps[i])) == NULL ||
- PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
- Py_XDECREF(pyobj_snap);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- snaps[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (snaps[i])
- virDomainSnapshotFree(snaps[i]);
- VIR_FREE(snaps);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainRevertToSnapshot(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- int c_retval;
- virDomainSnapshotPtr snap;
- PyObject *pyobj_snap;
- PyObject *pyobj_dom;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainRevertToSnapshot", &pyobj_dom, &pyobj_snap, &flags))
- return NULL;
- snap = (virDomainSnapshotPtr) PyvirDomainSnapshot_Get(pyobj_snap);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainRevertToSnapshot(snap, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_INT_FAIL;
-
- return PyInt_FromLong(c_retval);
-}
-
-static PyObject *
-libvirt_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- virDomainInfo info;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetInfo", &pyobj_domain))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetInfo(domain, &info);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyList_New(5);
- PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state));
- PyList_SetItem(py_retval, 1, libvirt_ulongWrap(info.maxMem));
- PyList_SetItem(py_retval, 2, libvirt_ulongWrap(info.memory));
- PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.nrVirtCpu));
- PyList_SetItem(py_retval, 4,
- libvirt_longlongWrap((unsigned long long) info.cpuTime));
- return py_retval;
-}
-
-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_virDomainGetControlInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- virDomainControlInfo info;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetControlInfo",
- &pyobj_domain, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetControlInfo(domain, &info, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyList_New(3);
- PyList_SetItem(py_retval, 0, libvirt_intWrap(info.state));
- PyList_SetItem(py_retval, 1, libvirt_intWrap(info.details));
- PyList_SetItem(py_retval, 2, libvirt_longlongWrap(info.stateTime));
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainGetBlockInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- virDomainBlockInfo info;
- const char *path;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetInfo", &pyobj_domain, &path, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetBlockInfo(domain, path, &info, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyList_New(3);
- PyList_SetItem(py_retval, 0, libvirt_ulonglongWrap(info.capacity));
- PyList_SetItem(py_retval, 1, libvirt_ulonglongWrap(info.allocation));
- PyList_SetItem(py_retval, 2, libvirt_ulonglongWrap(info.physical));
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNodeGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- virNodeInfo info;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetInfo", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeGetInfo(conn, &info);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyList_New(8);
- PyList_SetItem(py_retval, 0, libvirt_constcharPtrWrap(&info.model[0]));
- PyList_SetItem(py_retval, 1, libvirt_longWrap((long) info.memory >> 10));
- PyList_SetItem(py_retval, 2, libvirt_intWrap((int) info.cpus));
- PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.mhz));
- PyList_SetItem(py_retval, 4, libvirt_intWrap((int) info.nodes));
- PyList_SetItem(py_retval, 5, libvirt_intWrap((int) info.sockets));
- PyList_SetItem(py_retval, 6, libvirt_intWrap((int) info.cores));
- PyList_SetItem(py_retval, 7, libvirt_intWrap((int) info.threads));
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- unsigned char uuid[VIR_UUID_BUFLEN];
- virDomainPtr domain;
- PyObject *pyobj_domain;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetUUID", &pyobj_domain))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (domain == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetUUID(domain, &uuid[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virDomainPtr dom;
- PyObject *pyobj_dom;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetUUIDString",
- &pyobj_dom))
- return NULL;
- dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom);
-
- if (dom == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetUUIDString(dom, &uuidstr[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromString((char *) &uuidstr[0]);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- virDomainPtr c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- unsigned char * uuid;
- int len;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz#:virDomainLookupByUUID", &pyobj_conn, &uuid, &len))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainLookupByUUID(conn, uuid);
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_virDomainPtrWrap((virDomainPtr) c_retval);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virConnectListNetworks(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListNetworks", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfNetworks(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListNetworks(conn, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_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]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virConnectListDefinedNetworks(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedNetworks", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfDefinedNetworks(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListDefinedNetworks(conn, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_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]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListAllNetworks(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_conn;
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virConnectPtr conn;
- virNetworkPtr *nets = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllNetworks",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListAllNetworks(conn, &nets, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virNetworkPtrWrap(nets[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- nets[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (nets[i])
- virNetworkFree(nets[i]);
- VIR_FREE(nets);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virNetworkGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- unsigned char uuid[VIR_UUID_BUFLEN];
- virNetworkPtr domain;
- PyObject *pyobj_domain;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virNetworkGetUUID", &pyobj_domain))
- return NULL;
- domain = (virNetworkPtr) PyvirNetwork_Get(pyobj_domain);
-
- if (domain == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNetworkGetUUID(domain, &uuid[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNetworkGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virNetworkPtr net;
- PyObject *pyobj_net;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virNetworkGetUUIDString",
- &pyobj_net))
- return NULL;
- net = (virNetworkPtr) PyvirNetwork_Get(pyobj_net);
-
- if (net == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNetworkGetUUIDString(net, &uuidstr[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromString((char *) &uuidstr[0]);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNetworkLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- virNetworkPtr c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- unsigned char * uuid;
- int len;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz#:virNetworkLookupByUUID", &pyobj_conn, &uuid, &len))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNetworkLookupByUUID(conn, uuid);
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_virNetworkPtrWrap((virNetworkPtr) c_retval);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virDomainGetAutostart(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval, autostart;
- virDomainPtr domain;
- PyObject *pyobj_domain;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetAutostart", &pyobj_domain))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetAutostart(domain, &autostart);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_INT_FAIL;
- py_retval = libvirt_intWrap(autostart);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virNetworkGetAutostart(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval, autostart;
- virNetworkPtr network;
- PyObject *pyobj_network;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virNetworkGetAutostart", &pyobj_network))
- return NULL;
-
- network = (virNetworkPtr) PyvirNetwork_Get(pyobj_network);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNetworkGetAutostart(network, &autostart);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_INT_FAIL;
- py_retval = libvirt_intWrap(autostart);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNodeGetCellsFreeMemory(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- PyObject *py_retval;
- PyObject *pyobj_conn;
- int startCell, maxCells, c_retval;
- size_t i;
- virConnectPtr conn;
- unsigned long long *freeMems;
-
- if (!PyArg_ParseTuple(args, (char *)"Oii:virNodeGetCellsFreeMemory", &pyobj_conn, &startCell, &maxCells))
- return NULL;
-
- if ((startCell < 0) || (maxCells <= 0) || (startCell + maxCells > 10000))
- return VIR_PY_NONE;
-
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
- if (VIR_ALLOC_N_QUIET(freeMems, maxCells) < 0)
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeGetCellsFreeMemory(conn, freeMems, startCell, maxCells);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0) {
- VIR_FREE(freeMems);
- return VIR_PY_NONE;
- }
- py_retval = PyList_New(c_retval);
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i,
- libvirt_longlongWrap((long long) freeMems[i]));
- }
- VIR_FREE(freeMems);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNodeGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- PyObject *ret = NULL;
- PyObject *key = NULL;
- PyObject *val = NULL;
- PyObject *pyobj_conn;
- virConnectPtr conn;
- unsigned int flags;
- int cpuNum, c_retval;
- size_t i;
- int nparams = 0;
- virNodeCPUStatsPtr stats = NULL;
-
- if (!PyArg_ParseTuple(args, (char *)"Oii:virNodeGetCPUStats", &pyobj_conn, &cpuNum, &flags))
- return ret;
- conn = (virConnectPtr)(PyvirConnect_Get(pyobj_conn));
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeGetCPUStats(conn, cpuNum, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (nparams) {
- if (VIR_ALLOC_N_QUIET(stats, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeGetCPUStats(conn, cpuNum, stats, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(stats);
- return VIR_PY_NONE;
- }
- }
-
- if (!(ret = PyDict_New()))
- goto error;
-
- for (i = 0; i < nparams; i++) {
- key = libvirt_constcharPtrWrap(stats[i].field);
- val = libvirt_ulonglongWrap(stats[i].value);
-
- if (!key || !val || PyDict_SetItem(ret, key, val) < 0) {
- Py_DECREF(ret);
- ret = NULL;
- goto error;
- }
-
- Py_DECREF(key);
- Py_DECREF(val);
- }
-
- VIR_FREE(stats);
- return ret;
-
-error:
- VIR_FREE(stats);
- Py_XDECREF(key);
- Py_XDECREF(val);
- return ret;
-}
-
-static PyObject *
-libvirt_virNodeGetMemoryStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- PyObject *ret = NULL;
- PyObject *key = NULL;
- PyObject *val = NULL;
- PyObject *pyobj_conn;
- virConnectPtr conn;
- unsigned int flags;
- int cellNum, c_retval;
- size_t i;
- int nparams = 0;
- virNodeMemoryStatsPtr stats = NULL;
-
- if (!PyArg_ParseTuple(args, (char *)"Oii:virNodeGetMemoryStats", &pyobj_conn, &cellNum, &flags))
- return ret;
- conn = (virConnectPtr)(PyvirConnect_Get(pyobj_conn));
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeGetMemoryStats(conn, cellNum, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (nparams) {
- if (VIR_ALLOC_N_QUIET(stats, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeGetMemoryStats(conn, cellNum, stats, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(stats);
- return VIR_PY_NONE;
- }
- }
-
- if (!(ret = PyDict_New()))
- goto error;
-
- for (i = 0; i < nparams; i++) {
- key = libvirt_constcharPtrWrap(stats[i].field);
- val = libvirt_ulonglongWrap(stats[i].value);
-
- if (!key || !val || PyDict_SetItem(ret, key, val) < 0) {
- Py_DECREF(ret);
- ret = NULL;
- goto error;
- }
-
- Py_DECREF(key);
- Py_DECREF(val);
- }
-
- VIR_FREE(stats);
- return ret;
-
-error:
- VIR_FREE(stats);
- Py_XDECREF(key);
- Py_XDECREF(val);
- return ret;
-}
-
-static PyObject *
-libvirt_virConnectListStoragePools(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListStoragePools", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfStoragePools(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListStoragePools(conn, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(names);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
- if (py_retval == NULL) {
- if (names) {
- for (i = 0; i < c_retval; i++)
- VIR_FREE(names[i]);
- VIR_FREE(names);
- }
- return VIR_PY_NONE;
- }
-
- if (names) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virConnectListDefinedStoragePools(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedStoragePools", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfDefinedStoragePools(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListDefinedStoragePools(conn, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(names);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
- if (py_retval == NULL) {
- if (names) {
- for (i = 0; i < c_retval; i++)
- VIR_FREE(names[i]);
- VIR_FREE(names);
- }
- return VIR_PY_NONE;
- }
-
- if (names) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListAllStoragePools(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_conn;
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virConnectPtr conn;
- virStoragePoolPtr *pools = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllStoragePools",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListAllStoragePools(conn, &pools, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virStoragePoolPtrWrap(pools[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- pools[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (pools[i])
- virStoragePoolFree(pools[i]);
- VIR_FREE(pools);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virStoragePoolListVolumes(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virStoragePoolPtr pool;
- PyObject *pyobj_pool;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolListVolumes", &pyobj_pool))
- return NULL;
- pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolNumOfVolumes(pool);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolListVolumes(pool, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(names);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
- if (py_retval == NULL) {
- if (names) {
- for (i = 0; i < c_retval; i++)
- VIR_FREE(names[i]);
- VIR_FREE(names);
- }
- return VIR_PY_NONE;
- }
-
- if (names) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virStoragePoolListAllVolumes(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virStoragePoolPtr pool;
- virStorageVolPtr *vols = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
- PyObject *pyobj_pool;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virStoragePoolListAllVolumes",
- &pyobj_pool, &flags))
- return NULL;
-
- pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolListAllVolumes(pool, &vols, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virStorageVolPtrWrap(vols[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- vols[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (vols[i])
- virStorageVolFree(vols[i]);
- VIR_FREE(vols);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virStoragePoolGetAutostart(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval, autostart;
- virStoragePoolPtr pool;
- PyObject *pyobj_pool;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetAutostart", &pyobj_pool))
- return NULL;
-
- pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolGetAutostart(pool, &autostart);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = libvirt_intWrap(autostart);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virStoragePoolGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virStoragePoolPtr pool;
- PyObject *pyobj_pool;
- virStoragePoolInfo info;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetInfo", &pyobj_pool))
- return NULL;
- pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolGetInfo(pool, &info);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if ((py_retval = PyList_New(4)) == NULL)
- return VIR_PY_NONE;
-
- PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state));
- PyList_SetItem(py_retval, 1,
- libvirt_longlongWrap((unsigned long long) info.capacity));
- PyList_SetItem(py_retval, 2,
- libvirt_longlongWrap((unsigned long long) info.allocation));
- PyList_SetItem(py_retval, 3,
- libvirt_longlongWrap((unsigned long long) info.available));
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virStorageVolGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virStorageVolPtr pool;
- PyObject *pyobj_pool;
- virStorageVolInfo info;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virStorageVolGetInfo", &pyobj_pool))
- return NULL;
- pool = (virStorageVolPtr) PyvirStorageVol_Get(pyobj_pool);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStorageVolGetInfo(pool, &info);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if ((py_retval = PyList_New(3)) == NULL)
- return VIR_PY_NONE;
- PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.type));
- PyList_SetItem(py_retval, 1,
- libvirt_longlongWrap((unsigned long long) info.capacity));
- PyList_SetItem(py_retval, 2,
- libvirt_longlongWrap((unsigned long long) info.allocation));
- return py_retval;
-}
-
-static PyObject *
-libvirt_virStoragePoolGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- unsigned char uuid[VIR_UUID_BUFLEN];
- virStoragePoolPtr pool;
- PyObject *pyobj_pool;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetUUID", &pyobj_pool))
- return NULL;
- pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
-
- if (pool == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolGetUUID(pool, &uuid[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virStoragePoolGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virStoragePoolPtr pool;
- PyObject *pyobj_pool;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetUUIDString", &pyobj_pool))
- return NULL;
- pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
-
- if (pool == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolGetUUIDString(pool, &uuidstr[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromString((char *) &uuidstr[0]);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virStoragePoolLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- virStoragePoolPtr c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- unsigned char * uuid;
- int len;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz#:virStoragePoolLookupByUUID", &pyobj_conn, &uuid, &len))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virStoragePoolLookupByUUID(conn, uuid);
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_virStoragePoolPtrWrap((virStoragePoolPtr) c_retval);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNodeListDevices(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- char *cap;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozi:virNodeListDevices",
- &pyobj_conn, &cap, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeNumOfDevices(conn, cap, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeListDevices(conn, cap, names, c_retval, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_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]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListAllNodeDevices(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_conn;
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virConnectPtr conn;
- virNodeDevicePtr *devices = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllNodeDevices",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListAllNodeDevices(conn, &devices, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virNodeDevicePtrWrap(devices[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- devices[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (devices[i])
- virNodeDeviceFree(devices[i]);
- VIR_FREE(devices);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virNodeDevicePtr dev;
- PyObject *pyobj_dev;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virNodeDeviceListCaps", &pyobj_dev))
- return NULL;
- dev = (virNodeDevicePtr) PyvirNodeDevice_Get(pyobj_dev);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeDeviceNumOfCaps(dev);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNodeDeviceListCaps(dev, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_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]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virSecretGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- unsigned char uuid[VIR_UUID_BUFLEN];
- virSecretPtr secret;
- PyObject *pyobj_secret;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virSecretGetUUID", &pyobj_secret))
- return NULL;
- secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
-
- if (secret == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virSecretGetUUID(secret, &uuid[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virSecretGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virSecretPtr dom;
- PyObject *pyobj_dom;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virSecretGetUUIDString",
- &pyobj_dom))
- return NULL;
- dom = (virSecretPtr) PyvirSecret_Get(pyobj_dom);
-
- if (dom == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virSecretGetUUIDString(dom, &uuidstr[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromString((char *) &uuidstr[0]);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virSecretLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- virSecretPtr c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- unsigned char * uuid;
- int len;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz#:virSecretLookupByUUID", &pyobj_conn, &uuid, &len))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virSecretLookupByUUID(conn, uuid);
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_virSecretPtrWrap((virSecretPtr) c_retval);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virConnectListSecrets(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **uuids = NULL;
- virConnectPtr conn;
- int c_retval;
- size_t i;
- PyObject *pyobj_conn;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListSecrets", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfSecrets(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(uuids, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListSecrets(conn, uuids, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(uuids);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
-
- if (uuids) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(uuids[i]));
- VIR_FREE(uuids[i]);
- }
- VIR_FREE(uuids);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListAllSecrets(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_conn;
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virConnectPtr conn;
- virSecretPtr *secrets = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllSecrets",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListAllSecrets(conn, &secrets, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virSecretPtrWrap(secrets[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- secrets[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (secrets[i])
- virSecretFree(secrets[i]);
- VIR_FREE(secrets);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virSecretGetValue(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- unsigned char *c_retval;
- size_t size;
- virSecretPtr secret;
- PyObject *pyobj_secret;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virSecretGetValue", &pyobj_secret,
- &flags))
- return NULL;
- secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virSecretGetValue(secret, &size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval == NULL)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromStringAndSize((const char *)c_retval, size);
- VIR_FREE(c_retval);
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virSecretSetValue(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virSecretPtr secret;
- PyObject *pyobj_secret;
- const char *value;
- int size;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz#i:virSecretSetValue", &pyobj_secret,
- &value, &size, &flags))
- return NULL;
- secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virSecretSetValue(secret, (const unsigned char *)value, size,
- flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- py_retval = libvirt_intWrap(c_retval);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNWFilterGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- unsigned char uuid[VIR_UUID_BUFLEN];
- virNWFilterPtr nwfilter;
- PyObject *pyobj_nwfilter;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virNWFilterGetUUID", &pyobj_nwfilter))
- return NULL;
- nwfilter = (virNWFilterPtr) PyvirNWFilter_Get(pyobj_nwfilter);
-
- if (nwfilter == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNWFilterGetUUID(nwfilter, &uuid[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNWFilterGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virNWFilterPtr nwfilter;
- PyObject *pyobj_nwfilter;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virNWFilterGetUUIDString",
- &pyobj_nwfilter))
- return NULL;
- nwfilter = (virNWFilterPtr) PyvirNWFilter_Get(pyobj_nwfilter);
-
- if (nwfilter == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNWFilterGetUUIDString(nwfilter, &uuidstr[0]);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromString((char *) &uuidstr[0]);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNWFilterLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- virNWFilterPtr c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- unsigned char * uuid;
- int len;
-
- if (!PyArg_ParseTuple(args, (char *)"Oz#:virNWFilterLookupByUUID", &pyobj_conn, &uuid, &len))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virNWFilterLookupByUUID(conn, uuid);
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_virNWFilterPtrWrap((virNWFilterPtr) c_retval);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virConnectListNWFilters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **uuids = NULL;
- virConnectPtr conn;
- int c_retval;
- size_t i;
- PyObject *pyobj_conn;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListNWFilters", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfNWFilters(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(uuids, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListNWFilters(conn, uuids, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(uuids);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
-
- if (uuids) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(uuids[i]));
- VIR_FREE(uuids[i]);
- }
- VIR_FREE(uuids);
- }
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListAllNWFilters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_conn;
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virConnectPtr conn;
- virNWFilterPtr *filters = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllNWFilters",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListAllNWFilters(conn, &filters, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virNWFilterPtrWrap(filters[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- filters[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (filters[i])
- virNWFilterFree(filters[i]);
- VIR_FREE(filters);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectListInterfaces(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListInterfaces", &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfInterfaces(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListInterfaces(conn, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(names);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
- if (py_retval == NULL) {
- if (names) {
- for (i = 0; i < c_retval; i++)
- VIR_FREE(names[i]);
- VIR_FREE(names);
- }
- return VIR_PY_NONE;
- }
-
- if (names) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virConnectListDefinedInterfaces(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char **names = NULL;
- int c_retval;
- size_t i;
- virConnectPtr conn;
- PyObject *pyobj_conn;
-
-
- if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedInterfaces",
- &pyobj_conn))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectNumOfDefinedInterfaces(conn);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (c_retval) {
- if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListDefinedInterfaces(conn, names, c_retval);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0) {
- VIR_FREE(names);
- return VIR_PY_NONE;
- }
- }
- py_retval = PyList_New(c_retval);
- if (py_retval == NULL) {
- if (names) {
- for (i = 0; i < c_retval; i++)
- VIR_FREE(names[i]);
- VIR_FREE(names);
- }
- return VIR_PY_NONE;
- }
-
- if (names) {
- for (i = 0; i < c_retval; i++) {
- PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
- VIR_FREE(names[i]);
- }
- VIR_FREE(names);
- }
-
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virConnectListAllInterfaces(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_conn;
- PyObject *py_retval = NULL;
- PyObject *tmp = NULL;
- virConnectPtr conn;
- virInterfacePtr *ifaces = NULL;
- int c_retval = 0;
- size_t i;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllInterfaces",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virConnectListAllInterfaces(conn, &ifaces, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- if (!(py_retval = PyList_New(c_retval)))
- goto cleanup;
-
- for (i = 0; i < c_retval; i++) {
- if (!(tmp = libvirt_virInterfacePtrWrap(ifaces[i])) ||
- PyList_SetItem(py_retval, i, tmp) < 0) {
- Py_XDECREF(tmp);
- Py_DECREF(py_retval);
- py_retval = NULL;
- goto cleanup;
- }
- /* python steals the pointer */
- ifaces[i] = NULL;
- }
-
-cleanup:
- for (i = 0; i < c_retval; i++)
- if (ifaces[i])
- virInterfaceFree(ifaces[i]);
- VIR_FREE(ifaces);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectBaselineCPU(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *pyobj_conn;
- PyObject *list;
- virConnectPtr conn;
- unsigned int flags;
- const char **xmlcpus = NULL;
- int ncpus = 0;
- char *base_cpu;
- PyObject *pybase_cpu;
-
- if (!PyArg_ParseTuple(args, (char *)"OOi:virConnectBaselineCPU",
- &pyobj_conn, &list, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- if (PyList_Check(list)) {
- size_t i;
-
- ncpus = PyList_Size(list);
- if (VIR_ALLOC_N_QUIET(xmlcpus, ncpus) < 0)
- return VIR_PY_INT_FAIL;
-
- for (i = 0; i < ncpus; i++) {
- xmlcpus[i] = PyString_AsString(PyList_GetItem(list, i));
- if (xmlcpus[i] == NULL) {
- VIR_FREE(xmlcpus);
- return VIR_PY_INT_FAIL;
- }
- }
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- base_cpu = virConnectBaselineCPU(conn, xmlcpus, ncpus, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- VIR_FREE(xmlcpus);
-
- if (base_cpu == NULL)
- return VIR_PY_INT_FAIL;
-
- pybase_cpu = PyString_FromString(base_cpu);
- VIR_FREE(base_cpu);
-
- if (pybase_cpu == NULL)
- return VIR_PY_INT_FAIL;
-
- return pybase_cpu;
-}
-
-
-static PyObject *
-libvirt_virDomainGetJobInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- virDomainJobInfo info;
-
- if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetJobInfo", &pyobj_domain))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainGetJobInfo(domain, &info);
- LIBVIRT_END_ALLOW_THREADS;
- if (c_retval < 0)
- return VIR_PY_NONE;
- py_retval = PyList_New(12);
- PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.type));
- PyList_SetItem(py_retval, 1, libvirt_ulonglongWrap(info.timeElapsed));
- PyList_SetItem(py_retval, 2, libvirt_ulonglongWrap(info.timeRemaining));
- PyList_SetItem(py_retval, 3, libvirt_ulonglongWrap(info.dataTotal));
- PyList_SetItem(py_retval, 4, libvirt_ulonglongWrap(info.dataProcessed));
- PyList_SetItem(py_retval, 5, libvirt_ulonglongWrap(info.dataRemaining));
- PyList_SetItem(py_retval, 6, libvirt_ulonglongWrap(info.memTotal));
- PyList_SetItem(py_retval, 7, libvirt_ulonglongWrap(info.memProcessed));
- PyList_SetItem(py_retval, 8, libvirt_ulonglongWrap(info.memRemaining));
- PyList_SetItem(py_retval, 9, libvirt_ulonglongWrap(info.fileTotal));
- PyList_SetItem(py_retval, 10, libvirt_ulonglongWrap(info.fileProcessed));
- PyList_SetItem(py_retval, 11, libvirt_ulonglongWrap(info.fileRemaining));
-
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainGetJobStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- PyObject *pyobj_domain;
- virDomainPtr domain;
- unsigned int flags;
- virTypedParameterPtr params = NULL;
- int nparams = 0;
- int type;
- PyObject *dict = NULL;
- int rc;
-
- if (!PyArg_ParseTuple(args, (char *) "Oi:virDomainGetJobStats",
- &pyobj_domain, &flags))
- goto cleanup;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- rc = virDomainGetJobStats(domain, &type, ¶ms, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
- if (rc < 0)
- goto cleanup;
-
- if (!(dict = getPyVirTypedParameter(params, nparams)))
- goto cleanup;
-
- if (PyDict_SetItem(dict, libvirt_constcharPtrWrap("type"),
- libvirt_intWrap(type)) < 0) {
- Py_DECREF(dict);
- dict = NULL;
- goto cleanup;
- }
-
-cleanup:
- virTypedParamsFree(params, nparams);
- if (dict)
- return dict;
- else
- return VIR_PY_NONE;
-}
-
-static PyObject *
-libvirt_virDomainGetBlockJobInfo(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- const char *path;
- unsigned int flags;
- virDomainBlockJobInfo info;
- int c_ret;
- PyObject *type = NULL, *bandwidth = NULL, *cur = NULL, *end = NULL;
- PyObject *dict;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetBlockJobInfo",
- &pyobj_domain, &path, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((dict = PyDict_New()) == NULL)
- return NULL;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_ret = virDomainGetBlockJobInfo(domain, path, &info, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_ret == 0) {
- return dict;
- } else if (c_ret < 0) {
- Py_DECREF(dict);
- return VIR_PY_NONE;
- }
-
- if ((type = libvirt_intWrap(info.type)) == NULL ||
- PyDict_SetItemString(dict, "type", type) < 0)
- goto error;
- Py_DECREF(type);
-
- if ((bandwidth = libvirt_ulongWrap(info.bandwidth)) == NULL ||
- PyDict_SetItemString(dict, "bandwidth", bandwidth) < 0)
- goto error;
- Py_DECREF(bandwidth);
-
- if ((cur = libvirt_ulonglongWrap(info.cur)) == NULL ||
- PyDict_SetItemString(dict, "cur", cur) < 0)
- goto error;
- Py_DECREF(cur);
-
- if ((end = libvirt_ulonglongWrap(info.end)) == NULL ||
- PyDict_SetItemString(dict, "end", end) < 0)
- goto error;
- Py_DECREF(end);
-
- return dict;
-
-error:
- Py_DECREF(dict);
- Py_XDECREF(type);
- Py_XDECREF(bandwidth);
- Py_XDECREF(cur);
- Py_XDECREF(end);
- return NULL;
-}
-
-static PyObject *
-libvirt_virDomainSetBlockIoTune(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain, *info;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- const char *disk;
- unsigned int flags;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args, (char *)"OzOi:virDomainSetBlockIoTune",
- &pyobj_domain, &disk, &info, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlockIoTune(domain, disk, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "Domain has no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlockIoTune(domain, disk, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainSetBlockIoTune(domain, disk, new_params, size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetBlockIoTune(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- const char *disk;
- unsigned int flags;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetBlockIoTune",
- &pyobj_domain, &disk, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlockIoTune(domain, disk, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virDomainGetBlockIoTune(domain, disk, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virDomainGetDiskErrors(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval = VIR_PY_NONE;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- unsigned int flags;
- virDomainDiskErrorPtr disks = NULL;
- unsigned int ndisks;
- int count;
- size_t i;
-
- if (!PyArg_ParseTuple(args, (char *) "Oi:virDomainGetDiskErrors",
- &pyobj_domain, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if ((count = virDomainGetDiskErrors(domain, NULL, 0, 0)) < 0)
- return VIR_PY_NONE;
- ndisks = count;
-
- if (ndisks) {
- if (VIR_ALLOC_N_QUIET(disks, ndisks) < 0)
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- count = virDomainGetDiskErrors(domain, disks, ndisks, 0);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (count < 0)
- goto cleanup;
- }
-
- if (!(py_retval = PyDict_New()))
- goto cleanup;
-
- for (i = 0; i < count; i++) {
- PyDict_SetItem(py_retval,
- libvirt_constcharPtrWrap(disks[i].disk),
- libvirt_intWrap(disks[i].error));
- }
-
-cleanup:
- if (disks) {
- for (i = 0; i < count; i++)
- VIR_FREE(disks[i].disk);
- VIR_FREE(disks);
- }
- return py_retval;
-}
-
-/*******************************************
- * Helper functions to avoid importing modules
- * for every callback
- *******************************************/
-static PyObject *libvirt_module = NULL;
-static PyObject *libvirt_dict = NULL;
-static PyObject *libvirt_dom_class = NULL;
-
-static PyObject *
-getLibvirtModuleObject(void) {
- if (libvirt_module)
- return libvirt_module;
-
- // PyImport_ImportModule returns a new reference
- /* Bogus (char *) cast for RHEL-5 python API brokenness */
- libvirt_module = PyImport_ImportModule((char *)"libvirt");
- if (!libvirt_module) {
- DEBUG("%s Error importing libvirt module\n", __FUNCTION__);
- PyErr_Print();
- return NULL;
- }
-
- return libvirt_module;
-}
-
-static PyObject *
-getLibvirtDictObject(void) {
- if (libvirt_dict)
- return libvirt_dict;
-
- // PyModule_GetDict returns a borrowed reference
- libvirt_dict = PyModule_GetDict(getLibvirtModuleObject());
- if (!libvirt_dict) {
- DEBUG("%s Error importing libvirt dictionary\n", __FUNCTION__);
- PyErr_Print();
- return NULL;
- }
-
- Py_INCREF(libvirt_dict);
- return libvirt_dict;
-}
-
-static PyObject *
-getLibvirtDomainClassObject(void) {
- if (libvirt_dom_class)
- return libvirt_dom_class;
-
- // PyDict_GetItemString returns a borrowed reference
- libvirt_dom_class = PyDict_GetItemString(getLibvirtDictObject(),
- "virDomain");
- if (!libvirt_dom_class) {
- DEBUG("%s Error importing virDomain class\n", __FUNCTION__);
- PyErr_Print();
- return NULL;
- }
-
- Py_INCREF(libvirt_dom_class);
- return libvirt_dom_class;
-}
-
-static PyObject *
-libvirt_lookupPythonFunc(const char *funcname)
-{
- PyObject *python_cb;
-
- /* Lookup the python callback */
- python_cb = PyDict_GetItemString(getLibvirtDictObject(), funcname);
-
- if (!python_cb) {
- DEBUG("%s: Error finding %s\n", __FUNCTION__, funcname);
- PyErr_Print();
- PyErr_Clear();
- return NULL;
- }
-
- if (!PyCallable_Check(python_cb)) {
- DEBUG("%s: %s is not callable\n", __FUNCTION__, funcname);
- return NULL;
- }
-
- return python_cb;
-}
-
-/*******************************************
- * Domain Events
- *******************************************/
-
-static int
-libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- int event,
- int detail,
- void *opaque)
-{
- PyObject *pyobj_ret;
-
- PyObject *pyobj_conn_inst = (PyObject*)opaque;
- PyObject *pyobj_dom;
-
- PyObject *pyobj_dom_args;
- PyObject *pyobj_dom_inst;
-
- PyObject *dom_class;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- pyobj_dom_args = PyTuple_New(2);
- if (PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst) != 0) {
- DEBUG("%s error creating tuple", __FUNCTION__);
- goto cleanup;
- }
- if (PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom) != 0) {
- DEBUG("%s error creating tuple", __FUNCTION__);
- goto cleanup;
- }
- Py_INCREF(pyobj_conn_inst);
-
- dom_class = getLibvirtDomainClassObject();
- if (!PyClass_Check(dom_class)) {
- DEBUG("%s dom_class is not a class!\n", __FUNCTION__);
- goto cleanup;
- }
-
- pyobj_dom_inst = PyInstance_New(dom_class,
- pyobj_dom_args,
- NULL);
-
- Py_DECREF(pyobj_dom_args);
-
- if (!pyobj_dom_inst) {
- DEBUG("%s Error creating a python instance of virDomain\n",
- __FUNCTION__);
- PyErr_Print();
- goto cleanup;
- }
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn_inst,
- (char*)"_dispatchDomainEventCallbacks",
- (char*)"Oii",
- pyobj_dom_inst,
- event,
- detail);
-
- Py_DECREF(pyobj_dom_inst);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
-
-cleanup:
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static PyObject *
-libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- PyObject *py_retval; /* return value */
- PyObject *pyobj_conn; /* virConnectPtr */
- PyObject *pyobj_conn_inst; /* virConnect Python object */
-
- virConnectPtr conn;
- int ret = 0;
-
- if (!PyArg_ParseTuple
- (args, (char *) "OO:virConnectDomainEventRegister",
- &pyobj_conn, &pyobj_conn_inst)) {
- DEBUG("%s failed parsing tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
-
- DEBUG("libvirt_virConnectDomainEventRegister(%p %p) called\n",
- pyobj_conn, pyobj_conn_inst);
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- Py_INCREF(pyobj_conn_inst);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- ret = virConnectDomainEventRegister(conn,
- libvirt_virConnectDomainEventCallback,
- (void *)pyobj_conn_inst, NULL);
-
- LIBVIRT_END_ALLOW_THREADS;
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- PyObject *py_retval;
- PyObject *pyobj_conn;
- PyObject *pyobj_conn_inst;
-
- virConnectPtr conn;
- int ret = 0;
-
- if (!PyArg_ParseTuple
- (args, (char *) "OO:virConnectDomainEventDeregister",
- &pyobj_conn, &pyobj_conn_inst))
- return NULL;
-
- DEBUG("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn);
-
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback);
-
- LIBVIRT_END_ALLOW_THREADS;
-
- Py_DECREF(pyobj_conn_inst);
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-/*******************************************
- * Event Impl
- *******************************************/
-static PyObject *addHandleObj = NULL;
-static char *addHandleName = NULL;
-static PyObject *updateHandleObj = NULL;
-static char *updateHandleName = NULL;
-static PyObject *removeHandleObj = NULL;
-static char *removeHandleName = NULL;
-static PyObject *addTimeoutObj = NULL;
-static char *addTimeoutName = NULL;
-static PyObject *updateTimeoutObj = NULL;
-static char *updateTimeoutName = NULL;
-static PyObject *removeTimeoutObj = NULL;
-static char *removeTimeoutName = NULL;
-
-#define NAME(fn) ( fn ## Name ? fn ## Name : # fn )
-
-static int
-libvirt_virEventAddHandleFunc (int fd,
- int event,
- virEventHandleCallback cb,
- void *opaque,
- virFreeCallback ff)
-{
- PyObject *result;
- PyObject *python_cb;
- PyObject *cb_obj;
- PyObject *ff_obj;
- PyObject *opaque_obj;
- PyObject *cb_args;
- PyObject *pyobj_args;
- int retval = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Lookup the python callback */
- python_cb = libvirt_lookupPythonFunc("_eventInvokeHandleCallback");
- if (!python_cb) {
- goto cleanup;
- }
- Py_INCREF(python_cb);
-
- /* create tuple for cb */
- cb_obj = libvirt_virEventHandleCallbackWrap(cb);
- ff_obj = libvirt_virFreeCallbackWrap(ff);
- opaque_obj = libvirt_virVoidPtrWrap(opaque);
-
- cb_args = PyTuple_New(3);
- PyTuple_SetItem(cb_args, 0, cb_obj);
- PyTuple_SetItem(cb_args, 1, opaque_obj);
- PyTuple_SetItem(cb_args, 2, ff_obj);
-
- pyobj_args = PyTuple_New(4);
- PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
- PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
- PyTuple_SetItem(pyobj_args, 2, python_cb);
- PyTuple_SetItem(pyobj_args, 3, cb_args);
-
- result = PyEval_CallObject(addHandleObj, pyobj_args);
- if (!result) {
- PyErr_Print();
- PyErr_Clear();
- } else if (!PyInt_Check(result)) {
- DEBUG("%s: %s should return an int\n", __FUNCTION__, NAME(addHandle));
- } else {
- retval = (int)PyInt_AsLong(result);
- }
-
- Py_XDECREF(result);
- Py_DECREF(pyobj_args);
-
-cleanup:
- LIBVIRT_RELEASE_THREAD_STATE;
-
- return retval;
-}
-
-static void
-libvirt_virEventUpdateHandleFunc(int watch, int event)
-{
- PyObject *result;
- PyObject *pyobj_args;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- pyobj_args = PyTuple_New(2);
- PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch));
- PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
-
- result = PyEval_CallObject(updateHandleObj, pyobj_args);
- if (!result) {
- PyErr_Print();
- PyErr_Clear();
- }
-
- Py_XDECREF(result);
- Py_DECREF(pyobj_args);
-
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-
-static int
-libvirt_virEventRemoveHandleFunc(int watch)
-{
- PyObject *result;
- PyObject *pyobj_args;
- PyObject *opaque;
- PyObject *ff;
- int retval = -1;
- virFreeCallback cff;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- pyobj_args = PyTuple_New(1);
- PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch));
-
- result = PyEval_CallObject(removeHandleObj, pyobj_args);
- if (!result) {
- PyErr_Print();
- PyErr_Clear();
- } else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) {
- DEBUG("%s: %s must return opaque obj registered with %s"
- "to avoid leaking libvirt memory\n",
- __FUNCTION__, NAME(removeHandle), NAME(addHandle));
- } else {
- opaque = PyTuple_GetItem(result, 1);
- ff = PyTuple_GetItem(result, 2);
- cff = PyvirFreeCallback_Get(ff);
- if (cff)
- (*cff)(PyvirVoidPtr_Get(opaque));
- retval = 0;
- }
-
- Py_XDECREF(result);
- Py_DECREF(pyobj_args);
-
- LIBVIRT_RELEASE_THREAD_STATE;
-
- return retval;
-}
-
-
-static int
-libvirt_virEventAddTimeoutFunc(int timeout,
- virEventTimeoutCallback cb,
- void *opaque,
- virFreeCallback ff)
-{
- PyObject *result;
-
- PyObject *python_cb;
-
- PyObject *cb_obj;
- PyObject *ff_obj;
- PyObject *opaque_obj;
- PyObject *cb_args;
- PyObject *pyobj_args;
- int retval = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Lookup the python callback */
- python_cb = libvirt_lookupPythonFunc("_eventInvokeTimeoutCallback");
- if (!python_cb) {
- goto cleanup;
- }
- Py_INCREF(python_cb);
-
- /* create tuple for cb */
- cb_obj = libvirt_virEventTimeoutCallbackWrap(cb);
- ff_obj = libvirt_virFreeCallbackWrap(ff);
- opaque_obj = libvirt_virVoidPtrWrap(opaque);
-
- cb_args = PyTuple_New(3);
- PyTuple_SetItem(cb_args, 0, cb_obj);
- PyTuple_SetItem(cb_args, 1, opaque_obj);
- PyTuple_SetItem(cb_args, 2, ff_obj);
-
- pyobj_args = PyTuple_New(3);
-
- PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timeout));
- PyTuple_SetItem(pyobj_args, 1, python_cb);
- PyTuple_SetItem(pyobj_args, 2, cb_args);
-
- result = PyEval_CallObject(addTimeoutObj, pyobj_args);
- if (!result) {
- PyErr_Print();
- PyErr_Clear();
- } else if (!PyInt_Check(result)) {
- DEBUG("%s: %s should return an int\n", __FUNCTION__, NAME(addTimeout));
- } else {
- retval = (int)PyInt_AsLong(result);
- }
-
- Py_XDECREF(result);
- Py_DECREF(pyobj_args);
-
-cleanup:
- LIBVIRT_RELEASE_THREAD_STATE;
- return retval;
-}
-
-static void
-libvirt_virEventUpdateTimeoutFunc(int timer, int timeout)
-{
- PyObject *result = NULL;
- PyObject *pyobj_args;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- pyobj_args = PyTuple_New(2);
- PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
- PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout));
-
- result = PyEval_CallObject(updateTimeoutObj, pyobj_args);
- if (!result) {
- PyErr_Print();
- PyErr_Clear();
- }
-
- Py_XDECREF(result);
- Py_DECREF(pyobj_args);
-
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static int
-libvirt_virEventRemoveTimeoutFunc(int timer)
-{
- PyObject *result = NULL;
- PyObject *pyobj_args;
- PyObject *opaque;
- PyObject *ff;
- int retval = -1;
- virFreeCallback cff;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- pyobj_args = PyTuple_New(1);
- PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
-
- result = PyEval_CallObject(removeTimeoutObj, pyobj_args);
- if (!result) {
- PyErr_Print();
- PyErr_Clear();
- } else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) {
- DEBUG("%s: %s must return opaque obj registered with %s"
- "to avoid leaking libvirt memory\n",
- __FUNCTION__, NAME(removeTimeout), NAME(addTimeout));
- } else {
- opaque = PyTuple_GetItem(result, 1);
- ff = PyTuple_GetItem(result, 2);
- cff = PyvirFreeCallback_Get(ff);
- if (cff)
- (*cff)(PyvirVoidPtr_Get(opaque));
- retval = 0;
- }
-
- Py_XDECREF(result);
- Py_DECREF(pyobj_args);
-
- LIBVIRT_RELEASE_THREAD_STATE;
-
- return retval;
-}
-
-static PyObject *
-libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- /* Unref the previously-registered impl (if any) */
- Py_XDECREF(addHandleObj);
- Py_XDECREF(updateHandleObj);
- Py_XDECREF(removeHandleObj);
- Py_XDECREF(addTimeoutObj);
- Py_XDECREF(updateTimeoutObj);
- Py_XDECREF(removeTimeoutObj);
-
- /* Parse and check arguments */
- if (!PyArg_ParseTuple(args, (char *) "OOOOOO:virEventRegisterImpl",
- &addHandleObj, &updateHandleObj,
- &removeHandleObj, &addTimeoutObj,
- &updateTimeoutObj, &removeTimeoutObj) ||
- !PyCallable_Check(addHandleObj) ||
- !PyCallable_Check(updateHandleObj) ||
- !PyCallable_Check(removeHandleObj) ||
- !PyCallable_Check(addTimeoutObj) ||
- !PyCallable_Check(updateTimeoutObj) ||
- !PyCallable_Check(removeTimeoutObj))
- return VIR_PY_INT_FAIL;
-
- /* Get argument string representations (for error reporting) */
- addHandleName = py_str(addHandleObj);
- updateHandleName = py_str(updateHandleObj);
- removeHandleName = py_str(removeHandleObj);
- addTimeoutName = py_str(addTimeoutObj);
- updateTimeoutName = py_str(updateTimeoutObj);
- removeTimeoutName = py_str(removeTimeoutObj);
-
- /* Inc refs since we're holding on to these objects until
- * the next call (if any) to this function.
- */
- Py_INCREF(addHandleObj);
- Py_INCREF(updateHandleObj);
- Py_INCREF(removeHandleObj);
- Py_INCREF(addTimeoutObj);
- Py_INCREF(updateTimeoutObj);
- Py_INCREF(removeTimeoutObj);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- /* Now register our C EventImpl, which will dispatch
- * to the Python callbacks passed in as args.
- */
- virEventRegisterImpl(libvirt_virEventAddHandleFunc,
- libvirt_virEventUpdateHandleFunc,
- libvirt_virEventRemoveHandleFunc,
- libvirt_virEventAddTimeoutFunc,
- libvirt_virEventUpdateTimeoutFunc,
- libvirt_virEventRemoveTimeoutFunc);
-
- LIBVIRT_END_ALLOW_THREADS;
-
- return VIR_PY_INT_SUCCESS;
-}
-
-static PyObject *
-libvirt_virEventInvokeHandleCallback(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- int watch, fd, event;
- PyObject *py_f;
- PyObject *py_opaque;
- virEventHandleCallback cb;
- void *opaque;
-
- if (!PyArg_ParseTuple
- (args, (char *) "iiiOO:virEventInvokeHandleCallback",
- &watch, &fd, &event, &py_f, &py_opaque
- ))
- return VIR_PY_INT_FAIL;
-
- cb = (virEventHandleCallback) PyvirEventHandleCallback_Get(py_f);
- opaque = (void *) PyvirVoidPtr_Get(py_opaque);
-
- if (cb) {
- LIBVIRT_BEGIN_ALLOW_THREADS;
- cb(watch, fd, event, opaque);
- LIBVIRT_END_ALLOW_THREADS;
- }
-
- return VIR_PY_INT_SUCCESS;
-}
-
-static PyObject *
-libvirt_virEventInvokeTimeoutCallback(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- int timer;
- PyObject *py_f;
- PyObject *py_opaque;
- virEventTimeoutCallback cb;
- void *opaque;
-
- if (!PyArg_ParseTuple
- (args, (char *) "iOO:virEventInvokeTimeoutCallback",
- &timer, &py_f, &py_opaque
- ))
- return VIR_PY_INT_FAIL;
-
- cb = (virEventTimeoutCallback) PyvirEventTimeoutCallback_Get(py_f);
- opaque = (void *) PyvirVoidPtr_Get(py_opaque);
- if (cb) {
- LIBVIRT_BEGIN_ALLOW_THREADS;
- cb(timer, opaque);
- LIBVIRT_END_ALLOW_THREADS;
- }
-
- return VIR_PY_INT_SUCCESS;
-}
-
-static void
-libvirt_virEventHandleCallback(int watch,
- int fd,
- int events,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject *)opaque;
- PyObject *pyobj_ret;
- PyObject *python_cb;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Lookup the python callback */
- python_cb = libvirt_lookupPythonFunc("_dispatchEventHandleCallback");
- if (!python_cb) {
- goto cleanup;
- }
-
- Py_INCREF(pyobj_cbData);
-
- /* Call the pure python dispatcher */
- pyobj_ret = PyObject_CallFunction(python_cb,
- (char *)"iiiO",
- watch, fd, events, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- }
-
-cleanup:
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static PyObject *
-libvirt_virEventAddHandle(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval;
- PyObject *pyobj_cbData;
- virEventHandleCallback cb = libvirt_virEventHandleCallback;
- int events;
- int fd;
- int ret;
-
- if (!PyArg_ParseTuple(args, (char *) "iiO:virEventAddHandle",
- &fd, &events, &pyobj_cbData)) {
- DEBUG("%s failed to parse tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
-
- Py_INCREF(pyobj_cbData);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virEventAddHandle(fd, events, cb, pyobj_cbData, NULL);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (ret < 0) {
- Py_DECREF(pyobj_cbData);
- }
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static void
-libvirt_virEventTimeoutCallback(int timer,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject *)opaque;
- PyObject *pyobj_ret;
- PyObject *python_cb;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Lookup the python callback */
- python_cb = libvirt_lookupPythonFunc("_dispatchEventTimeoutCallback");
- if (!python_cb) {
- goto cleanup;
- }
-
- Py_INCREF(pyobj_cbData);
-
- /* Call the pure python dispatcher */
- pyobj_ret = PyObject_CallFunction(python_cb,
- (char *)"iO",
- timer, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- }
-
-cleanup:
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static PyObject *
-libvirt_virEventAddTimeout(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval;
- PyObject *pyobj_cbData;
- virEventTimeoutCallback cb = libvirt_virEventTimeoutCallback;
- int timeout;
- int ret;
-
- if (!PyArg_ParseTuple(args, (char *) "iO:virEventAddTimeout",
- &timeout, &pyobj_cbData)) {
- DEBUG("%s failed to parse tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
-
- Py_INCREF(pyobj_cbData);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virEventAddTimeout(timeout, cb, pyobj_cbData, NULL);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (ret < 0) {
- Py_DECREF(pyobj_cbData);
- }
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static void
-libvirt_virConnectDomainEventFreeFunc(void *opaque)
-{
- PyObject *pyobj_conn = (PyObject*)opaque;
- LIBVIRT_ENSURE_THREAD_STATE;
- Py_DECREF(pyobj_conn);
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static int
-libvirt_virConnectDomainEventLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- int event,
- int detail,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventLifecycleCallback",
- (char*)"OiiO",
- pyobj_dom,
- event, detail,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventGenericCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventGenericCallback",
- (char*)"OO",
- pyobj_dom, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- long long utcoffset,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventRTCChangeCallback",
- (char*)"OLO",
- pyobj_dom,
- (PY_LONG_LONG)utcoffset,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventWatchdogCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- int action,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventWatchdogCallback",
- (char*)"OiO",
- pyobj_dom,
- action,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- const char *srcPath,
- const char *devAlias,
- int action,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventIOErrorCallback",
- (char*)"OssiO",
- pyobj_dom,
- srcPath, devAlias, action,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventIOErrorReasonCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- const char *srcPath,
- const char *devAlias,
- int action,
- const char *reason,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventIOErrorReasonCallback",
- (char*)"OssisO",
- pyobj_dom,
- srcPath, devAlias, action, reason,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- int phase,
- virDomainEventGraphicsAddressPtr local,
- virDomainEventGraphicsAddressPtr remote,
- const char *authScheme,
- virDomainEventGraphicsSubjectPtr subject,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- PyObject *pyobj_local;
- PyObject *pyobj_remote;
- PyObject *pyobj_subject;
- int ret = -1;
- size_t i;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- pyobj_local = PyDict_New();
- PyDict_SetItem(pyobj_local,
- libvirt_constcharPtrWrap("family"),
- libvirt_intWrap(local->family));
- PyDict_SetItem(pyobj_local,
- libvirt_constcharPtrWrap("node"),
- libvirt_constcharPtrWrap(local->node));
- PyDict_SetItem(pyobj_local,
- libvirt_constcharPtrWrap("service"),
- libvirt_constcharPtrWrap(local->service));
-
- pyobj_remote = PyDict_New();
- PyDict_SetItem(pyobj_remote,
- libvirt_constcharPtrWrap("family"),
- libvirt_intWrap(remote->family));
- PyDict_SetItem(pyobj_remote,
- libvirt_constcharPtrWrap("node"),
- libvirt_constcharPtrWrap(remote->node));
- PyDict_SetItem(pyobj_remote,
- libvirt_constcharPtrWrap("service"),
- libvirt_constcharPtrWrap(remote->service));
-
- pyobj_subject = PyList_New(subject->nidentity);
- for (i = 0; i < subject->nidentity; i++) {
- PyObject *pair = PyTuple_New(2);
- PyTuple_SetItem(pair, 0, libvirt_constcharPtrWrap(subject->identities[i].type));
- PyTuple_SetItem(pair, 1, libvirt_constcharPtrWrap(subject->identities[i].name));
-
- PyList_SetItem(pyobj_subject, i, pair);
- }
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventGraphicsCallback",
- (char*)"OiOOsOO",
- pyobj_dom,
- phase, pyobj_local, pyobj_remote,
- authScheme, pyobj_subject,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventBlockJobCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- const char *path,
- int type,
- int status,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"dispatchDomainEventBlockPullCallback",
- (char*)"OsiiO",
- pyobj_dom, path, type, status, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
-#if DEBUG_ERROR
- printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
-#endif
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- const char *oldSrcPath,
- const char *newSrcPath,
- const char *devAlias,
- int reason,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
-
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventDiskChangeCallback",
- (char*)"OsssiO",
- pyobj_dom,
- oldSrcPath, newSrcPath,
- devAlias, reason, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- const char *devAlias,
- int reason,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
-
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventTrayChangeCallback",
- (char*)"OsiO",
- pyobj_dom,
- devAlias, reason, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventPMWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- int reason,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
-
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventPMWakeupCallback",
- (char*)"OiO",
- pyobj_dom,
- reason,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventPMSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- int reason,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
-
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventPMSuspendCallback",
- (char*)"OiO",
- pyobj_dom,
- reason,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- unsigned long long actual,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventBalloonChangeCallback",
- (char*)"OLO",
- pyobj_dom,
- (PY_LONG_LONG)actual,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventPMSuspendDiskCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- int reason,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
-
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventPMSuspendDiskCallback",
- (char*)"OiO",
- pyobj_dom,
- reason,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static int
-libvirt_virConnectDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
- virDomainPtr dom,
- const char *devAlias,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_dom;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
- int ret = -1;
-
- LIBVIRT_ENSURE_THREAD_STATE;
- /* Create a python instance of this virDomainPtr */
- virDomainRef(dom);
-
- pyobj_dom = libvirt_virDomainPtrWrap(dom);
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchDomainEventDeviceRemovedCallback",
- (char*)"OsO",
- pyobj_dom, devAlias, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
- Py_DECREF(pyobj_dom);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- ret = 0;
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
- return ret;
-}
-
-static PyObject *
-libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- PyObject *py_retval; /* return value */
- PyObject *pyobj_conn; /* virConnectPtr */
- PyObject *pyobj_dom;
- PyObject *pyobj_cbData; /* hash of callback data */
- int eventID;
- virConnectPtr conn;
- int ret = 0;
- virConnectDomainEventGenericCallback cb = NULL;
- virDomainPtr dom;
-
- if (!PyArg_ParseTuple
- (args, (char *) "OOiO:virConnectDomainEventRegisterAny",
- &pyobj_conn, &pyobj_dom, &eventID, &pyobj_cbData)) {
- DEBUG("%s failed parsing tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
-
- DEBUG("libvirt_virConnectDomainEventRegister(%p %p %d %p) called\n",
- pyobj_conn, pyobj_dom, eventID, pyobj_cbData);
- conn = PyvirConnect_Get(pyobj_conn);
- if (pyobj_dom == Py_None)
- dom = NULL;
- else
- dom = PyvirDomain_Get(pyobj_dom);
-
- switch ((virDomainEventID) eventID) {
- case VIR_DOMAIN_EVENT_ID_LIFECYCLE:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventLifecycleCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_REBOOT:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventGenericCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_RTC_CHANGE:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventRTCChangeCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_WATCHDOG:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventWatchdogCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_IO_ERROR:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventIOErrorCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventIOErrorReasonCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_GRAPHICS:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventGraphicsCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_CONTROL_ERROR:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventGenericCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_BLOCK_JOB:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventBlockJobCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_DISK_CHANGE:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventDiskChangeCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_TRAY_CHANGE:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventTrayChangeCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_PMWAKEUP:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventPMWakeupCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_PMSUSPEND:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventPMSuspendCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventBalloonChangeCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventPMSuspendDiskCallback);
- break;
- case VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED:
- cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventDeviceRemovedCallback);
- break;
-
- case VIR_DOMAIN_EVENT_ID_LAST:
- break;
- }
-
- if (!cb) {
- return VIR_PY_INT_FAIL;
- }
-
- Py_INCREF(pyobj_cbData);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virConnectDomainEventRegisterAny(conn, dom, eventID,
- cb, pyobj_cbData,
- libvirt_virConnectDomainEventFreeFunc);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (ret < 0) {
- Py_DECREF(pyobj_cbData);
- }
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectDomainEventDeregisterAny(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- PyObject *py_retval;
- PyObject *pyobj_conn;
- int callbackID;
- virConnectPtr conn;
- int ret = 0;
-
- if (!PyArg_ParseTuple
- (args, (char *) "Oi:virConnectDomainEventDeregister",
- &pyobj_conn, &callbackID))
- return NULL;
-
- DEBUG("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn);
-
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- ret = virConnectDomainEventDeregisterAny(conn, callbackID);
-
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-
-static void
-libvirt_virConnectCloseCallbackDispatch(virConnectPtr conn ATTRIBUTE_UNUSED,
- int reason,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject*)opaque;
- PyObject *pyobj_ret;
- PyObject *pyobj_conn;
- PyObject *dictKey;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- Py_INCREF(pyobj_cbData);
-
- dictKey = libvirt_constcharPtrWrap("conn");
- pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the Callback Dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_conn,
- (char*)"_dispatchCloseCallback",
- (char*)"iO",
- reason,
- pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static PyObject *
-libvirt_virConnectRegisterCloseCallback(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- PyObject *py_retval; /* return value */
- PyObject *pyobj_conn; /* virConnectPtr */
- PyObject *pyobj_cbData; /* hash of callback data */
- virConnectPtr conn;
- int ret = 0;
-
- if (!PyArg_ParseTuple
- (args, (char *) "OO:virConnectRegisterCloseCallback",
- &pyobj_conn, &pyobj_cbData)) {
- DEBUG("%s failed parsing tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
-
- DEBUG("libvirt_virConnectRegisterCloseCallback(%p %p) called\n",
- pyobj_conn, pyobj_cbData);
- conn = PyvirConnect_Get(pyobj_conn);
-
- Py_INCREF(pyobj_cbData);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virConnectRegisterCloseCallback(conn,
- libvirt_virConnectCloseCallbackDispatch,
- pyobj_cbData,
- libvirt_virConnectDomainEventFreeFunc);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (ret < 0) {
- Py_DECREF(pyobj_cbData);
- }
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virConnectUnregisterCloseCallback(ATTRIBUTE_UNUSED PyObject * self,
- PyObject * args)
-{
- PyObject *py_retval;
- PyObject *pyobj_conn;
- virConnectPtr conn;
- int ret = 0;
-
- if (!PyArg_ParseTuple
- (args, (char *) "O:virConnectDomainEventUnregister",
- &pyobj_conn))
- return NULL;
-
- DEBUG("libvirt_virConnectDomainEventUnregister(%p) called\n",
- pyobj_conn);
-
- conn = PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
-
- ret = virConnectUnregisterCloseCallback(conn,
- libvirt_virConnectCloseCallbackDispatch);
-
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static void
-libvirt_virStreamEventFreeFunc(void *opaque)
-{
- PyObject *pyobj_stream = (PyObject*)opaque;
- LIBVIRT_ENSURE_THREAD_STATE;
- Py_DECREF(pyobj_stream);
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static void
-libvirt_virStreamEventCallback(virStreamPtr st ATTRIBUTE_UNUSED,
- int events,
- void *opaque)
-{
- PyObject *pyobj_cbData = (PyObject *)opaque;
- PyObject *pyobj_stream;
- PyObject *pyobj_ret;
- PyObject *dictKey;
-
- LIBVIRT_ENSURE_THREAD_STATE;
-
- Py_INCREF(pyobj_cbData);
- dictKey = libvirt_constcharPtrWrap("stream");
- pyobj_stream = PyDict_GetItem(pyobj_cbData, dictKey);
- Py_DECREF(dictKey);
-
- /* Call the pure python dispatcher */
- pyobj_ret = PyObject_CallMethod(pyobj_stream,
- (char *)"_dispatchStreamEventCallback",
- (char *)"iO",
- events, pyobj_cbData);
-
- Py_DECREF(pyobj_cbData);
-
- if (!pyobj_ret) {
- DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
- PyErr_Print();
- } else {
- Py_DECREF(pyobj_ret);
- }
-
- LIBVIRT_RELEASE_THREAD_STATE;
-}
-
-static PyObject *
-libvirt_virStreamEventAddCallback(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval;
- PyObject *pyobj_stream;
- PyObject *pyobj_cbData;
- virStreamPtr stream;
- virStreamEventCallback cb = libvirt_virStreamEventCallback;
- int ret;
- int events;
-
- if (!PyArg_ParseTuple(args, (char *) "OiO:virStreamEventAddCallback",
- &pyobj_stream, &events, &pyobj_cbData)) {
- DEBUG("%s failed to parse tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
-
- DEBUG("libvirt_virStreamEventAddCallback(%p, %d, %p) called\n",
- pyobj_stream, events, pyobj_cbData);
- stream = PyvirStream_Get(pyobj_stream);
-
- Py_INCREF(pyobj_cbData);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virStreamEventAddCallback(stream, events, cb, pyobj_cbData,
- libvirt_virStreamEventFreeFunc);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (ret < 0) {
- Py_DECREF(pyobj_cbData);
- }
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virStreamRecv(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_stream;
- virStreamPtr stream;
- char *buf = NULL;
- int ret;
- int nbytes;
-
- if (!PyArg_ParseTuple(args, (char *) "Oi:virStreamRecv",
- &pyobj_stream, &nbytes)) {
- DEBUG("%s failed to parse tuple\n", __FUNCTION__);
- return VIR_PY_NONE;
- }
- stream = PyvirStream_Get(pyobj_stream);
-
- if (VIR_ALLOC_N_QUIET(buf, nbytes+1 > 0 ? nbytes+1 : 1) < 0)
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virStreamRecv(stream, buf, nbytes);
- LIBVIRT_END_ALLOW_THREADS;
-
- buf[ret > -1 ? ret : 0] = '\0';
- DEBUG("StreamRecv ret=%d strlen=%d\n", ret, (int) strlen(buf));
-
- if (ret == -2)
- return libvirt_intWrap(ret);
- if (ret < 0)
- return VIR_PY_NONE;
- return libvirt_charPtrSizeWrap((char *) buf, (Py_ssize_t) ret);
-}
-
-static PyObject *
-libvirt_virStreamSend(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval;
- PyObject *pyobj_stream;
- virStreamPtr stream;
- char *data;
- int datalen;
- int ret;
- int nbytes;
-
- if (!PyArg_ParseTuple(args, (char *) "Oz#i:virStreamRecv",
- &pyobj_stream, &data, &datalen, &nbytes)) {
- DEBUG("%s failed to parse tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
- stream = PyvirStream_Get(pyobj_stream);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virStreamSend(stream, data, nbytes);
- LIBVIRT_END_ALLOW_THREADS;
-
- DEBUG("StreamSend ret=%d\n", ret);
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainSendKey(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *py_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *pyobj_list;
- int codeset;
- int holdtime;
- unsigned int flags;
- int ret;
- size_t i;
- unsigned int keycodes[VIR_DOMAIN_SEND_KEY_MAX_KEYS];
- unsigned int nkeycodes;
-
- if (!PyArg_ParseTuple(args, (char *)"OiiOii:virDomainSendKey",
- &pyobj_domain, &codeset, &holdtime, &pyobj_list,
- &nkeycodes, &flags)) {
- DEBUG("%s failed to parse tuple\n", __FUNCTION__);
- return VIR_PY_INT_FAIL;
- }
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (!PyList_Check(pyobj_list)) {
- return VIR_PY_INT_FAIL;
- }
-
- if (nkeycodes != PyList_Size(pyobj_list) ||
- nkeycodes > VIR_DOMAIN_SEND_KEY_MAX_KEYS) {
- return VIR_PY_INT_FAIL;
- }
-
- for (i = 0; i < nkeycodes; i++) {
- keycodes[i] = (int)PyInt_AsLong(PyList_GetItem(pyobj_list, i));
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virDomainSendKey(domain, codeset, holdtime, keycodes, nkeycodes, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- DEBUG("virDomainSendKey ret=%d\n", ret);
-
- py_retval = libvirt_intWrap(ret);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainMigrateGetCompressionCache(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_domain;
- virDomainPtr domain;
- unsigned int flags;
- unsigned long long cacheSize;
- int rc;
-
- if (!PyArg_ParseTuple(args,
- (char *) "Oi:virDomainMigrateGetCompressionCache",
- &pyobj_domain, &flags))
- return VIR_PY_NONE;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- rc = virDomainMigrateGetCompressionCache(domain, &cacheSize, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (rc < 0)
- return VIR_PY_NONE;
-
- return libvirt_ulonglongWrap(cacheSize);
-}
-
-static PyObject *
-libvirt_virDomainMigrateGetMaxSpeed(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval;
- int c_retval;
- unsigned long bandwidth;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- unsigned int flags = 0;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainMigrateGetMaxSpeed",
- &pyobj_domain, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainMigrateGetMaxSpeed(domain, &bandwidth, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_INT_FAIL;
- py_retval = libvirt_ulongWrap(bandwidth);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_domain;
- virDomainPtr domain;
- PyObject *pyobj_dconn;
- virConnectPtr dconn;
- PyObject *dict;
- unsigned int flags;
- virTypedParameterPtr params;
- int nparams;
- virDomainPtr ddom = NULL;
-
- if (!PyArg_ParseTuple(args, (char *) "OOOi:virDomainMigrate3",
- &pyobj_domain, &pyobj_dconn, &dict, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
- dconn = (virConnectPtr) PyvirConnect_Get(pyobj_dconn);
-
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0)
- return NULL;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ddom = virDomainMigrate3(domain, dconn, params, nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- virTypedParamsFree(params, nparams);
- return libvirt_virDomainPtrWrap(ddom);
-}
-
-static PyObject *
-libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- PyObject *pyobj_domain;
- virDomainPtr domain;
- char *dconnuri;
- PyObject *dict;
- unsigned int flags;
- virTypedParameterPtr params;
- int nparams;
- int ret = -1;
-
- if (!PyArg_ParseTuple(args, (char *) "OzOi:virDomainMigrate3",
- &pyobj_domain, &dconnuri, &dict, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0)
- return NULL;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virDomainMigrateToURI3(domain, dconnuri, params, nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- virTypedParamsFree(params, nparams);
- return libvirt_intWrap(ret);
-}
-
-static PyObject *
-libvirt_virDomainBlockPeek(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval = NULL;
- int c_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- const char *disk;
- unsigned long long offset;
- size_t size;
- char *buf;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"OzLni:virDomainBlockPeek", &pyobj_domain,
- &disk, &offset, &size, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (VIR_ALLOC_N_QUIET(buf, size) < 0)
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainBlockPeek(domain, disk, offset, size, buf, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0) {
- py_retval = VIR_PY_NONE;
- goto cleanup;
- }
-
- py_retval = PyString_FromStringAndSize(buf, size);
-
-cleanup:
- VIR_FREE(buf);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virDomainMemoryPeek(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval = NULL;
- int c_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- unsigned long long start;
- size_t size;
- char *buf;
- unsigned int flags;
-
- if (!PyArg_ParseTuple(args, (char *)"OLni:virDomainMemoryPeek", &pyobj_domain,
- &start, &size, &flags))
- return NULL;
-
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (VIR_ALLOC_N_QUIET(buf, size) < 0)
- return VIR_PY_NONE;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainMemoryPeek(domain, start, size, buf, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0) {
- py_retval = VIR_PY_NONE;
- goto cleanup;
- }
-
- py_retval = PyString_FromStringAndSize(buf, size);
-
-cleanup:
- VIR_FREE(buf);
- return py_retval;
-}
-
-static PyObject *
-libvirt_virNodeSetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virConnectPtr conn;
- PyObject *pyobj_conn, *info;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- Py_ssize_t size = 0;
- unsigned int flags;
- virTypedParameterPtr params, new_params = NULL;
-
- if (!PyArg_ParseTuple(args,
- (char *)"OOi:virNodeSetMemoryParameters",
- &pyobj_conn, &info, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- if ((size = PyDict_Size(info)) < 0)
- return NULL;
-
- if (size == 0) {
- PyErr_Format(PyExc_LookupError,
- "Need non-empty dictionary to set attributes");
- return NULL;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeGetMemoryParameters(conn, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_INT_FAIL;
-
- if (nparams == 0) {
- PyErr_Format(PyExc_LookupError,
- "no settable attributes");
- return NULL;
- }
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeGetMemoryParameters(conn, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- new_params = setPyVirTypedParameter(info, params, nparams);
- if (!new_params)
- goto cleanup;
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeSetMemoryParameters(conn, new_params, size, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_INT_FAIL;
- goto cleanup;
- }
-
- ret = VIR_PY_INT_SUCCESS;
-
-cleanup:
- virTypedParamsFree(params, nparams);
- VIR_FREE(new_params);
- return ret;
-}
-
-static PyObject *
-libvirt_virNodeGetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virConnectPtr conn;
- PyObject *pyobj_conn;
- PyObject *ret = NULL;
- int i_retval;
- int nparams = 0;
- unsigned int flags;
- virTypedParameterPtr params;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virNodeGetMemoryParameters",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeGetMemoryParameters(conn, NULL, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if (!nparams)
- return PyDict_New();
-
- if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
- return PyErr_NoMemory();
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeGetMemoryParameters(conn, params, &nparams, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0) {
- ret = VIR_PY_NONE;
- goto cleanup;
- }
-
- ret = getPyVirTypedParameter(params, nparams);
-
-cleanup:
- virTypedParamsFree(params, nparams);
- return ret;
-}
-
-static PyObject *
-libvirt_virNodeGetCPUMap(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args)
-{
- virConnectPtr conn;
- PyObject *pyobj_conn;
- PyObject *ret = NULL;
- PyObject *pycpumap = NULL;
- PyObject *pyused = NULL;
- PyObject *pycpunum = NULL;
- PyObject *pyonline = NULL;
- int i_retval;
- unsigned char *cpumap = NULL;
- unsigned int online = 0;
- unsigned int flags;
- size_t i;
-
- if (!PyArg_ParseTuple(args, (char *)"Oi:virNodeGetCPUMap",
- &pyobj_conn, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- i_retval = virNodeGetCPUMap(conn, &cpumap, &online, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (i_retval < 0)
- return VIR_PY_NONE;
-
- if ((ret = PyTuple_New(3)) == NULL)
- goto error;
-
- /* 0: number of CPUs */
- if ((pycpunum = PyLong_FromLong(i_retval)) == NULL ||
- PyTuple_SetItem(ret, 0, pycpunum) < 0)
- goto error;
-
- /* 1: CPU map */
- if ((pycpumap = PyList_New(i_retval)) == NULL)
- goto error;
-
- for (i = 0; i < i_retval; i++) {
- if ((pyused = PyBool_FromLong(VIR_CPU_USED(cpumap, i))) == NULL)
- goto error;
- if (PyList_SetItem(pycpumap, i, pyused) < 0)
- goto error;
- }
-
- if (PyTuple_SetItem(ret, 1, pycpumap) < 0)
- goto error;
-
- /* 2: number of online CPUs */
- if ((pyonline = PyLong_FromLong(online)) == NULL ||
- PyTuple_SetItem(ret, 2, pyonline) < 0)
- goto error;
-
-cleanup:
- VIR_FREE(cpumap);
- return ret;
-error:
- Py_XDECREF(ret);
- Py_XDECREF(pycpumap);
- Py_XDECREF(pyused);
- Py_XDECREF(pycpunum);
- Py_XDECREF(pyonline);
- ret = NULL;
- goto cleanup;
-}
-
-
-static PyObject *
-libvirt_virDomainCreateWithFiles(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval = NULL;
- int c_retval;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- PyObject *pyobj_files;
- unsigned int flags;
- unsigned int nfiles;
- int *files = NULL;
- size_t i;
-
- if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainCreateWithFiles",
- &pyobj_domain, &pyobj_files, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- nfiles = PyList_Size(pyobj_files);
-
- if (VIR_ALLOC_N_QUIET(files, nfiles) < 0)
- return PyErr_NoMemory();
-
- for (i = 0; i < nfiles; i++) {
- PyObject *pyfd;
- int fd;
-
- pyfd = PyList_GetItem(pyobj_files, i);
-
- if (libvirt_intUnwrap(pyfd, &fd) < 0)
- goto cleanup;
-
- files[i] = fd;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainCreateWithFiles(domain, nfiles, files, flags);
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_intWrap((int) c_retval);
-
-cleanup:
- VIR_FREE(files);
- return py_retval;
-}
-
-
-static PyObject *
-libvirt_virDomainCreateXMLWithFiles(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
- PyObject *py_retval = NULL;
- virDomainPtr c_retval;
- virConnectPtr conn;
- PyObject *pyobj_conn;
- char * xmlDesc;
- PyObject *pyobj_files;
- unsigned int flags;
- unsigned int nfiles;
- int *files = NULL;
- size_t i;
-
- if (!PyArg_ParseTuple(args, (char *)"OzOi:virDomainCreateXMLWithFiles",
- &pyobj_conn, &xmlDesc, &pyobj_files, &flags))
- return NULL;
- conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
-
- nfiles = PyList_Size(pyobj_files);
-
- if (VIR_ALLOC_N_QUIET(files, nfiles) < 0)
- return PyErr_NoMemory();
-
- for (i = 0; i < nfiles; i++) {
- PyObject *pyfd;
- int fd;
-
- pyfd = PyList_GetItem(pyobj_files, i);
-
- if (libvirt_intUnwrap(pyfd, &fd) < 0)
- goto cleanup;
-
- files[i] = fd;
- }
-
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainCreateXMLWithFiles(conn, xmlDesc, nfiles, files, flags);
- LIBVIRT_END_ALLOW_THREADS;
- py_retval = libvirt_virDomainPtrWrap((virDomainPtr) c_retval);
-
-cleanup:
- VIR_FREE(files);
- return py_retval;
-}
-
-
-/************************************************************************
- * *
- * The registration stuff *
- * *
- ************************************************************************/
-static PyMethodDef libvirtMethods[] = {
-#include "libvirt-export.c"
- {(char *) "virGetVersion", libvirt_virGetVersion, METH_VARARGS, NULL},
- {(char *) "virConnectGetVersion", libvirt_virConnectGetVersion, METH_VARARGS, NULL},
- {(char *) "virConnectGetCPUModelNames", libvirt_virConnectGetCPUModelNames, METH_VARARGS, NULL},
- {(char *) "virConnectGetLibVersion", libvirt_virConnectGetLibVersion, METH_VARARGS, NULL},
- {(char *) "virConnectOpenAuth", libvirt_virConnectOpenAuth, METH_VARARGS, NULL},
- {(char *) "virConnectListDomainsID", libvirt_virConnectListDomainsID, METH_VARARGS, NULL},
- {(char *) "virConnectListDefinedDomains", libvirt_virConnectListDefinedDomains, METH_VARARGS, NULL},
- {(char *) "virConnectListAllDomains", libvirt_virConnectListAllDomains, METH_VARARGS, NULL},
- {(char *) "virConnectDomainEventRegister", libvirt_virConnectDomainEventRegister, METH_VARARGS, NULL},
- {(char *) "virConnectDomainEventDeregister", libvirt_virConnectDomainEventDeregister, METH_VARARGS, NULL},
- {(char *) "virConnectDomainEventRegisterAny", libvirt_virConnectDomainEventRegisterAny, METH_VARARGS, NULL},
- {(char *) "virConnectDomainEventDeregisterAny", libvirt_virConnectDomainEventDeregisterAny, METH_VARARGS, NULL},
- {(char *) "virConnectRegisterCloseCallback", libvirt_virConnectRegisterCloseCallback, METH_VARARGS, NULL},
- {(char *) "virConnectUnregisterCloseCallback", libvirt_virConnectUnregisterCloseCallback, METH_VARARGS, NULL},
- {(char *) "virStreamEventAddCallback", libvirt_virStreamEventAddCallback, METH_VARARGS, NULL},
- {(char *) "virStreamRecv", libvirt_virStreamRecv, METH_VARARGS, NULL},
- {(char *) "virStreamSend", libvirt_virStreamSend, METH_VARARGS, NULL},
- {(char *) "virDomainGetInfo", libvirt_virDomainGetInfo, METH_VARARGS, NULL},
- {(char *) "virDomainGetState", libvirt_virDomainGetState, METH_VARARGS, NULL},
- {(char *) "virDomainGetControlInfo", libvirt_virDomainGetControlInfo, METH_VARARGS, NULL},
- {(char *) "virDomainGetBlockInfo", libvirt_virDomainGetBlockInfo, METH_VARARGS, NULL},
- {(char *) "virNodeGetInfo", libvirt_virNodeGetInfo, METH_VARARGS, NULL},
- {(char *) "virNodeGetCPUStats", libvirt_virNodeGetCPUStats, METH_VARARGS, NULL},
- {(char *) "virNodeGetMemoryStats", libvirt_virNodeGetMemoryStats, METH_VARARGS, NULL},
- {(char *) "virDomainGetUUID", libvirt_virDomainGetUUID, METH_VARARGS, NULL},
- {(char *) "virDomainGetUUIDString", libvirt_virDomainGetUUIDString, METH_VARARGS, NULL},
- {(char *) "virDomainLookupByUUID", libvirt_virDomainLookupByUUID, METH_VARARGS, NULL},
- {(char *) "virRegisterErrorHandler", libvirt_virRegisterErrorHandler, METH_VARARGS, NULL},
- {(char *) "virGetLastError", libvirt_virGetLastError, METH_VARARGS, NULL},
- {(char *) "virConnGetLastError", libvirt_virConnGetLastError, METH_VARARGS, NULL},
- {(char *) "virConnectListNetworks", libvirt_virConnectListNetworks, METH_VARARGS, NULL},
- {(char *) "virConnectListDefinedNetworks", libvirt_virConnectListDefinedNetworks, METH_VARARGS, NULL},
- {(char *) "virConnectListAllNetworks", libvirt_virConnectListAllNetworks, METH_VARARGS, NULL},
- {(char *) "virNetworkGetUUID", libvirt_virNetworkGetUUID, METH_VARARGS, NULL},
- {(char *) "virNetworkGetUUIDString", libvirt_virNetworkGetUUIDString, METH_VARARGS, NULL},
- {(char *) "virNetworkLookupByUUID", libvirt_virNetworkLookupByUUID, METH_VARARGS, NULL},
- {(char *) "virDomainGetAutostart", libvirt_virDomainGetAutostart, METH_VARARGS, NULL},
- {(char *) "virNetworkGetAutostart", libvirt_virNetworkGetAutostart, METH_VARARGS, NULL},
- {(char *) "virDomainBlockStats", libvirt_virDomainBlockStats, METH_VARARGS, NULL},
- {(char *) "virDomainBlockStatsFlags", libvirt_virDomainBlockStatsFlags, METH_VARARGS, NULL},
- {(char *) "virDomainGetCPUStats", libvirt_virDomainGetCPUStats, METH_VARARGS, NULL},
- {(char *) "virDomainInterfaceStats", libvirt_virDomainInterfaceStats, METH_VARARGS, NULL},
- {(char *) "virDomainMemoryStats", libvirt_virDomainMemoryStats, METH_VARARGS, NULL},
- {(char *) "virNodeGetCellsFreeMemory", libvirt_virNodeGetCellsFreeMemory, METH_VARARGS, NULL},
- {(char *) "virDomainGetSchedulerType", libvirt_virDomainGetSchedulerType, METH_VARARGS, NULL},
- {(char *) "virDomainGetSchedulerParameters", libvirt_virDomainGetSchedulerParameters, METH_VARARGS, NULL},
- {(char *) "virDomainGetSchedulerParametersFlags", libvirt_virDomainGetSchedulerParametersFlags, METH_VARARGS, NULL},
- {(char *) "virDomainSetSchedulerParameters", libvirt_virDomainSetSchedulerParameters, METH_VARARGS, NULL},
- {(char *) "virDomainSetSchedulerParametersFlags", libvirt_virDomainSetSchedulerParametersFlags, METH_VARARGS, NULL},
- {(char *) "virDomainSetBlkioParameters", libvirt_virDomainSetBlkioParameters, METH_VARARGS, NULL},
- {(char *) "virDomainGetBlkioParameters", libvirt_virDomainGetBlkioParameters, METH_VARARGS, NULL},
- {(char *) "virDomainSetMemoryParameters", libvirt_virDomainSetMemoryParameters, METH_VARARGS, NULL},
- {(char *) "virDomainGetMemoryParameters", libvirt_virDomainGetMemoryParameters, METH_VARARGS, NULL},
- {(char *) "virDomainSetNumaParameters", libvirt_virDomainSetNumaParameters, METH_VARARGS, NULL},
- {(char *) "virDomainGetNumaParameters", libvirt_virDomainGetNumaParameters, METH_VARARGS, NULL},
- {(char *) "virDomainSetInterfaceParameters", libvirt_virDomainSetInterfaceParameters, METH_VARARGS, NULL},
- {(char *) "virDomainGetInterfaceParameters", libvirt_virDomainGetInterfaceParameters, METH_VARARGS, NULL},
- {(char *) "virDomainGetVcpus", libvirt_virDomainGetVcpus, METH_VARARGS, NULL},
- {(char *) "virDomainPinVcpu", libvirt_virDomainPinVcpu, METH_VARARGS, NULL},
- {(char *) "virDomainPinVcpuFlags", libvirt_virDomainPinVcpuFlags, METH_VARARGS, NULL},
- {(char *) "virDomainGetVcpuPinInfo", libvirt_virDomainGetVcpuPinInfo, METH_VARARGS, NULL},
- {(char *) "virDomainGetEmulatorPinInfo", libvirt_virDomainGetEmulatorPinInfo, METH_VARARGS, NULL},
- {(char *) "virDomainPinEmulator", libvirt_virDomainPinEmulator, METH_VARARGS, NULL},
- {(char *) "virConnectListStoragePools", libvirt_virConnectListStoragePools, METH_VARARGS, NULL},
- {(char *) "virConnectListDefinedStoragePools", libvirt_virConnectListDefinedStoragePools, METH_VARARGS, NULL},
- {(char *) "virConnectListAllStoragePools", libvirt_virConnectListAllStoragePools, METH_VARARGS, NULL},
- {(char *) "virStoragePoolGetAutostart", libvirt_virStoragePoolGetAutostart, METH_VARARGS, NULL},
- {(char *) "virStoragePoolListVolumes", libvirt_virStoragePoolListVolumes, METH_VARARGS, NULL},
- {(char *) "virStoragePoolListAllVolumes", libvirt_virStoragePoolListAllVolumes, METH_VARARGS, NULL},
- {(char *) "virStoragePoolGetInfo", libvirt_virStoragePoolGetInfo, METH_VARARGS, NULL},
- {(char *) "virStorageVolGetInfo", libvirt_virStorageVolGetInfo, METH_VARARGS, NULL},
- {(char *) "virStoragePoolGetUUID", libvirt_virStoragePoolGetUUID, METH_VARARGS, NULL},
- {(char *) "virStoragePoolGetUUIDString", libvirt_virStoragePoolGetUUIDString, METH_VARARGS, NULL},
- {(char *) "virStoragePoolLookupByUUID", libvirt_virStoragePoolLookupByUUID, METH_VARARGS, NULL},
- {(char *) "virEventRegisterImpl", libvirt_virEventRegisterImpl, METH_VARARGS, NULL},
- {(char *) "virEventAddHandle", libvirt_virEventAddHandle, METH_VARARGS, NULL},
- {(char *) "virEventAddTimeout", libvirt_virEventAddTimeout, METH_VARARGS, NULL},
- {(char *) "virEventInvokeHandleCallback", libvirt_virEventInvokeHandleCallback, METH_VARARGS, NULL},
- {(char *) "virEventInvokeTimeoutCallback", libvirt_virEventInvokeTimeoutCallback, METH_VARARGS, NULL},
- {(char *) "virNodeListDevices", libvirt_virNodeListDevices, METH_VARARGS, NULL},
- {(char *) "virConnectListAllNodeDevices", libvirt_virConnectListAllNodeDevices, METH_VARARGS, NULL},
- {(char *) "virNodeDeviceListCaps", libvirt_virNodeDeviceListCaps, METH_VARARGS, NULL},
- {(char *) "virSecretGetUUID", libvirt_virSecretGetUUID, METH_VARARGS, NULL},
- {(char *) "virSecretGetUUIDString", libvirt_virSecretGetUUIDString, METH_VARARGS, NULL},
- {(char *) "virSecretLookupByUUID", libvirt_virSecretLookupByUUID, METH_VARARGS, NULL},
- {(char *) "virConnectListSecrets", libvirt_virConnectListSecrets, METH_VARARGS, NULL},
- {(char *) "virConnectListAllSecrets", libvirt_virConnectListAllSecrets, METH_VARARGS, NULL},
- {(char *) "virSecretGetValue", libvirt_virSecretGetValue, METH_VARARGS, NULL},
- {(char *) "virSecretSetValue", libvirt_virSecretSetValue, METH_VARARGS, NULL},
- {(char *) "virNWFilterGetUUID", libvirt_virNWFilterGetUUID, METH_VARARGS, NULL},
- {(char *) "virNWFilterGetUUIDString", libvirt_virNWFilterGetUUIDString, METH_VARARGS, NULL},
- {(char *) "virNWFilterLookupByUUID", libvirt_virNWFilterLookupByUUID, METH_VARARGS, NULL},
- {(char *) "virConnectListNWFilters", libvirt_virConnectListNWFilters, METH_VARARGS, NULL},
- {(char *) "virConnectListAllNWFilters", libvirt_virConnectListAllNWFilters, METH_VARARGS, NULL},
- {(char *) "virConnectListInterfaces", libvirt_virConnectListInterfaces, METH_VARARGS, NULL},
- {(char *) "virConnectListDefinedInterfaces", libvirt_virConnectListDefinedInterfaces, METH_VARARGS, NULL},
- {(char *) "virConnectListAllInterfaces", libvirt_virConnectListAllInterfaces, METH_VARARGS, NULL},
- {(char *) "virConnectBaselineCPU", libvirt_virConnectBaselineCPU, METH_VARARGS, NULL},
- {(char *) "virDomainGetJobInfo", libvirt_virDomainGetJobInfo, METH_VARARGS, NULL},
- {(char *) "virDomainGetJobStats", libvirt_virDomainGetJobStats, METH_VARARGS, NULL},
- {(char *) "virDomainSnapshotListNames", libvirt_virDomainSnapshotListNames, METH_VARARGS, NULL},
- {(char *) "virDomainListAllSnapshots", libvirt_virDomainListAllSnapshots, METH_VARARGS, NULL},
- {(char *) "virDomainSnapshotListChildrenNames", libvirt_virDomainSnapshotListChildrenNames, METH_VARARGS, NULL},
- {(char *) "virDomainSnapshotListAllChildren", libvirt_virDomainSnapshotListAllChildren, METH_VARARGS, NULL},
- {(char *) "virDomainRevertToSnapshot", libvirt_virDomainRevertToSnapshot, METH_VARARGS, NULL},
- {(char *) "virDomainGetBlockJobInfo", libvirt_virDomainGetBlockJobInfo, METH_VARARGS, NULL},
- {(char *) "virDomainSetBlockIoTune", libvirt_virDomainSetBlockIoTune, METH_VARARGS, NULL},
- {(char *) "virDomainGetBlockIoTune", libvirt_virDomainGetBlockIoTune, METH_VARARGS, NULL},
- {(char *) "virDomainSendKey", libvirt_virDomainSendKey, METH_VARARGS, NULL},
- {(char *) "virDomainMigrateGetCompressionCache", libvirt_virDomainMigrateGetCompressionCache, METH_VARARGS, NULL},
- {(char *) "virDomainMigrateGetMaxSpeed", libvirt_virDomainMigrateGetMaxSpeed, METH_VARARGS, NULL},
- {(char *) "virDomainMigrate3", libvirt_virDomainMigrate3, METH_VARARGS, NULL},
- {(char *) "virDomainMigrateToURI3", libvirt_virDomainMigrateToURI3, METH_VARARGS, NULL},
- {(char *) "virDomainBlockPeek", libvirt_virDomainBlockPeek, METH_VARARGS, NULL},
- {(char *) "virDomainMemoryPeek", libvirt_virDomainMemoryPeek, METH_VARARGS, NULL},
- {(char *) "virDomainGetDiskErrors", libvirt_virDomainGetDiskErrors, METH_VARARGS, NULL},
- {(char *) "virNodeGetMemoryParameters", libvirt_virNodeGetMemoryParameters, METH_VARARGS, NULL},
- {(char *) "virNodeSetMemoryParameters", libvirt_virNodeSetMemoryParameters, METH_VARARGS, NULL},
- {(char *) "virNodeGetCPUMap", libvirt_virNodeGetCPUMap, METH_VARARGS, NULL},
- {(char *) "virDomainCreateXMLWithFiles", libvirt_virDomainCreateXMLWithFiles, METH_VARARGS, NULL},
- {(char *) "virDomainCreateWithFiles", libvirt_virDomainCreateWithFiles, METH_VARARGS, NULL},
- {NULL, NULL, 0, NULL}
-};
-
-void
-#ifndef __CYGWIN__
-initlibvirtmod
-#else
-initcygvirtmod
-#endif
- (void)
-{
- static int initialized = 0;
-
- if (initialized != 0)
- return;
-
- if (virInitialize() < 0)
- return;
-
- /* initialize the python extension module */
- Py_InitModule((char *)
-#ifndef __CYGWIN__
- "libvirtmod"
-#else
- "cygvirtmod"
-#endif
- , libvirtMethods);
-
- initialized = 1;
-}
diff --git a/python/libvirt-override.py b/python/libvirt-override.py
deleted file mode 100644
index ccfec48..0000000
--- a/python/libvirt-override.py
+++ /dev/null
@@ -1,209 +0,0 @@
-#
-# Manually written part of python bindings for libvirt
-#
-
-# On cygwin, the DLL is called cygvirtmod.dll
-try:
- import libvirtmod
-except ImportError, lib_e:
- try:
- import cygvirtmod as libvirtmod
- except ImportError, cyg_e:
- if str(cyg_e).count("No module named"):
- raise lib_e
-
-import types
-
-# The root of all libvirt errors.
-class libvirtError(Exception):
- def __init__(self, defmsg, conn=None, dom=None, net=None, pool=None, vol=None):
-
- # Never call virConnGetLastError().
- # virGetLastError() is now thread local
- err = virGetLastError()
- if err is None:
- msg = defmsg
- else:
- msg = err[2]
-
- Exception.__init__(self, msg)
-
- self.err = err
-
- def get_error_code(self):
- if self.err is None:
- return None
- return self.err[0]
-
- def get_error_domain(self):
- if self.err is None:
- return None
- return self.err[1]
-
- def get_error_message(self):
- if self.err is None:
- return None
- return self.err[2]
-
- def get_error_level(self):
- if self.err is None:
- return None
- return self.err[3]
-
- def get_str1(self):
- if self.err is None:
- return None
- return self.err[4]
-
- def get_str2(self):
- if self.err is None:
- return None
- return self.err[5]
-
- def get_str3(self):
- if self.err is None:
- return None
- return self.err[6]
-
- def get_int1(self):
- if self.err is None:
- return None
- return self.err[7]
-
- def get_int2(self):
- if self.err is None:
- return None
- return self.err[8]
-
-#
-# register the libvirt global error handler
-#
-def registerErrorHandler(f, ctx):
- """Register a Python function for error reporting.
- The function is called back as f(ctx, error), with error
- being a list of information about the error being raised.
- Returns 1 in case of success."""
- return libvirtmod.virRegisterErrorHandler(f,ctx)
-
-def openAuth(uri, auth, flags=0):
- ret = libvirtmod.virConnectOpenAuth(uri, auth, flags)
- if ret is None:raise libvirtError('virConnectOpenAuth() failed')
- return virConnect(_obj=ret)
-
-
-#
-# Return library version.
-#
-def getVersion (name = None):
- """If no name parameter is passed (or name is None) then the
- version of the libvirt library is returned as an integer.
-
- If a name is passed and it refers to a driver linked to the
- libvirt library, then this returns a tuple of (library version,
- driver version).
-
- If the name passed refers to a non-existent driver, then you
- will get the exception 'no support for hypervisor'.
-
- Versions numbers are integers: 1000000*major + 1000*minor + release."""
- if name is None:
- ret = libvirtmod.virGetVersion ()
- else:
- ret = libvirtmod.virGetVersion (name)
- if ret is None: raise libvirtError ("virGetVersion() failed")
- return ret
-
-
-#
-# Invoke an EventHandle callback
-#
-def _eventInvokeHandleCallback(watch, fd, event, opaque, opaquecompat=None):
- """
- Invoke the Event Impl Handle Callback in C
- """
- # libvirt 0.9.2 and earlier required custom event loops to know
- # that opaque=(cb, original_opaque) and pass the values individually
- # to this wrapper. This should handle the back compat case, and make
- # future invocations match the virEventHandleCallback prototype
- if opaquecompat:
- callback = opaque
- opaque = opaquecompat
- else:
- callback = opaque[0]
- opaque = opaque[1]
-
- libvirtmod.virEventInvokeHandleCallback(watch, fd, event, callback, opaque)
-
-#
-# Invoke an EventTimeout callback
-#
-def _eventInvokeTimeoutCallback(timer, opaque, opaquecompat=None):
- """
- Invoke the Event Impl Timeout Callback in C
- """
- # libvirt 0.9.2 and earlier required custom event loops to know
- # that opaque=(cb, original_opaque) and pass the values individually
- # to this wrapper. This should handle the back compat case, and make
- # future invocations match the virEventTimeoutCallback prototype
- if opaquecompat:
- callback = opaque
- opaque = opaquecompat
- else:
- callback = opaque[0]
- opaque = opaque[1]
-
- libvirtmod.virEventInvokeTimeoutCallback(timer, callback, opaque)
-
-def _dispatchEventHandleCallback(watch, fd, events, cbData):
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(watch, fd, events, opaque)
- return 0
-
-def _dispatchEventTimeoutCallback(timer, cbData):
- cb = cbData["cb"]
- opaque = cbData["opaque"]
-
- cb(timer, opaque)
- return 0
-
-def virEventAddHandle(fd, events, cb, opaque):
- """
- register a callback for monitoring file handle events
-
- @fd: file handle to monitor for events
- @events: bitset of events to watch from virEventHandleType constants
- @cb: callback to invoke when an event occurs
- @opaque: user data to pass to callback
-
- Example callback prototype is:
- def cb(watch, # int id of the handle
- fd, # int file descriptor the event occurred on
- events, # int bitmap of events that have occurred
- opaque): # opaque data passed to eventAddHandle
- """
- cbData = {"cb" : cb, "opaque" : opaque}
- ret = libvirtmod.virEventAddHandle(fd, events, cbData)
- if ret == -1: raise libvirtError ('virEventAddHandle() failed')
- return ret
-
-def virEventAddTimeout(timeout, cb, opaque):
- """
- register a callback for a timer event
-
- @timeout: time between events in milliseconds
- @cb: callback to invoke when an event occurs
- @opaque: user data to pass to callback
-
- Setting timeout to -1 will disable the timer. Setting the timeout
- to zero will cause it to fire on every event loop iteration.
-
- Example callback prototype is:
- def cb(timer, # int id of the timer
- opaque): # opaque data passed to eventAddTimeout
- """
- cbData = {"cb" : cb, "opaque" : opaque}
- ret = libvirtmod.virEventAddTimeout(timeout, cbData)
- if ret == -1: raise libvirtError ('virEventAddTimeout() failed')
- return ret
diff --git a/python/libvirt-qemu-override-api.xml b/python/libvirt-qemu-override-api.xml
deleted file mode 100644
index ca0dae9..0000000
--- a/python/libvirt-qemu-override-api.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0"?>
-<api name='libvir-qemu-python'>
- <symbols>
- <function name='virDomainQemuMonitorCommand' file='python-qemu'>
- <info>Send an arbitrary monitor command through qemu monitor of domain</info>
- <return type='str *' info='the command output or None in case of error'/>
- <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
- <arg name='cmd' type='const char *' info='the command which will be passed to QEMU monitor'/>
- <arg name='flags' type='unsigned int' info='an OR'ed set of virDomainQemuMonitorCommandFlags'/>
- </function>
- <function name='virDomainQemuAgentCommand' file='python-qemu'>
- <info>Send a Guest Agent command to domain</info>
- <return type='str *' info='the command output'/>
- <arg name='domain' type='virDomainPtr' info='pointer to the domain'/>
- <arg name='cmd' type='const char *' info='guest agent command on domain'/>
- <arg name='timeout' type='int' info='timeout seconds'/>
- <arg name='flags' type='unsigned int' info='execution flags'/>
- </function>
- </symbols>
-</api>
diff --git a/python/libvirt-qemu-override.c b/python/libvirt-qemu-override.c
deleted file mode 100644
index 6249031..0000000
--- a/python/libvirt-qemu-override.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * libvir.c: this modules implements the main part of the glue of the
- * libvir library and the Python interpreter. It provides the
- * entry points where an automatically generated stub is
- * unpractical
- *
- * Copyright (C) 2011-2012 Red Hat, Inc.
- *
- * Daniel Veillard <veillard(a)redhat.com>
- */
-
-#include <config.h>
-
-/* Horrible kludge to work around even more horrible name-space pollution
- via Python.h. That file includes /usr/include/python2.5/pyconfig*.h,
- which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
-#undef HAVE_PTHREAD_H
-
-#include <Python.h>
-#include <libvirt/libvirt-qemu.h>
-#include <libvirt/virterror.h>
-#include "typewrappers.h"
-#include "libvirt-qemu.h"
-#include "viralloc.h"
-
-#ifndef __CYGWIN__
-extern void initlibvirtmod_qemu(void);
-#else
-extern void initcygvirtmod_qemu(void);
-#endif
-
-#if 0
-# define DEBUG_ERROR 1
-#endif
-
-#if DEBUG_ERROR
-# define DEBUG(fmt, ...) \
- printf(fmt, __VA_ARGS__)
-#else
-# define DEBUG(fmt, ...) \
- do {} while (0)
-#endif
-
-/* The two-statement sequence "Py_INCREF(Py_None); return Py_None;"
- is so common that we encapsulate it here. Now, each use is simply
- return VIR_PY_NONE; */
-#define VIR_PY_NONE (Py_INCREF (Py_None), Py_None)
-#define VIR_PY_INT_FAIL (libvirt_intWrap(-1))
-#define VIR_PY_INT_SUCCESS (libvirt_intWrap(0))
-
-/************************************************************************
- * *
- * Statistics *
- * *
- ************************************************************************/
-
-static PyObject *
-libvirt_qemu_virDomainQemuMonitorCommand(PyObject *self ATTRIBUTE_UNUSED,
- PyObject *args) {
- PyObject *py_retval;
- char *result = NULL;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- unsigned int flags;
- char *cmd;
- int c_retval;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainQemuMonitorCommand",
- &pyobj_domain, &cmd, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (domain == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- c_retval = virDomainQemuMonitorCommand(domain, cmd, &result, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (c_retval < 0)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromString(result);
- VIR_FREE(result);
- return py_retval;
-}
-
-static PyObject *
-libvirt_qemu_virDomainQemuAgentCommand(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
-{
- PyObject *py_retval;
- char *result = NULL;
- virDomainPtr domain;
- PyObject *pyobj_domain;
- int timeout;
- unsigned int flags;
- char *cmd;
-
- if (!PyArg_ParseTuple(args, (char *)"Ozii:virDomainQemuAgentCommand",
- &pyobj_domain, &cmd, &timeout, &flags))
- return NULL;
- domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
-
- if (domain == NULL)
- return VIR_PY_NONE;
- LIBVIRT_BEGIN_ALLOW_THREADS;
- result = virDomainQemuAgentCommand(domain, cmd, timeout, flags);
- LIBVIRT_END_ALLOW_THREADS;
-
- if (!result)
- return VIR_PY_NONE;
-
- py_retval = PyString_FromString(result);
- VIR_FREE(result);
- return py_retval;
-}
-/************************************************************************
- * *
- * The registration stuff *
- * *
- ************************************************************************/
-static PyMethodDef libvirtQemuMethods[] = {
-#include "libvirt-qemu-export.c"
- {(char *) "virDomainQemuMonitorCommand", libvirt_qemu_virDomainQemuMonitorCommand, METH_VARARGS, NULL},
- {(char *) "virDomainQemuAgentCommand", libvirt_qemu_virDomainQemuAgentCommand, METH_VARARGS, NULL},
- {NULL, NULL, 0, NULL}
-};
-
-void
-#ifndef __CYGWIN__
-initlibvirtmod_qemu
-#else
-initcygvirtmod_qemu
-#endif
- (void)
-{
- static int initialized = 0;
-
- if (initialized != 0)
- return;
-
- if (virInitialize() < 0)
- return;
-
- /* initialize the python extension module */
- Py_InitModule((char *)
-#ifndef __CYGWIN__
- "libvirtmod_qemu"
-#else
- "cygvirtmod_qemu"
-#endif
- , libvirtQemuMethods);
-
- initialized = 1;
-}
diff --git a/python/sanitytest.py b/python/sanitytest.py
deleted file mode 100644
index ace6792..0000000
--- a/python/sanitytest.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/python
-
-import libvirt
-
-globals = dir(libvirt)
-
-# Sanity test that the generator hasn't gone wrong
-
-# Look for core classes
-for clsname in ["virConnect",
- "virDomain",
- "virDomainSnapshot",
- "virInterface",
- "virNWFilter",
- "virNodeDevice",
- "virNetwork",
- "virSecret",
- "virStoragePool",
- "virStorageVol",
- "virStream",
- ]:
- assert(clsname in globals)
- assert(object in getattr(libvirt, clsname).__bases__)
-
-# Constants
-assert("VIR_CONNECT_RO" in globals)
-
-# Error related bits
-assert("libvirtError" in globals)
-assert("VIR_ERR_AUTH_FAILED" in globals)
-assert("virGetLastError" in globals)
-
-# Some misc methods
-assert("virInitialize" in globals)
-assert("virEventAddHandle" in globals)
-assert("virEventRegisterDefaultImpl" in globals)
diff --git a/python/typewrappers.c b/python/typewrappers.c
deleted file mode 100644
index 9ba8790..0000000
--- a/python/typewrappers.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * types.c: converter functions between the internal representation
- * and the Python objects
- *
- * Copyright (C) 2005, 2007, 2012 Red Hat, Inc.
- *
- * Daniel Veillard <veillard(a)redhat.com>
- */
-
-#include <config.h>
-
-/* Horrible kludge to work around even more horrible name-space pollution
- * via Python.h. That file includes /usr/include/python2.5/pyconfig*.h,
- * which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
-#undef HAVE_PTHREAD_H
-
-#include "typewrappers.h"
-
-#include "viralloc.h"
-
-#ifndef Py_CAPSULE_H
-typedef void(*PyCapsule_Destructor)(void *, void *);
-#endif
-
-static PyObject *
-libvirt_buildPyObject(void *cobj,
- const char *name,
- PyCapsule_Destructor destr)
-{
- PyObject *ret;
-
-#ifdef Py_CAPSULE_H
- ret = PyCapsule_New(cobj, name, destr);
-#else
- ret = PyCObject_FromVoidPtrAndDesc(cobj, (void *) name, destr);
-#endif /* _TEST_CAPSULE */
-
- return ret;
-}
-
-PyObject *
-libvirt_intWrap(int val)
-{
- PyObject *ret;
- ret = PyInt_FromLong((long) val);
- return ret;
-}
-
-PyObject *
-libvirt_longWrap(long val)
-{
- PyObject *ret;
- ret = PyInt_FromLong(val);
- return ret;
-}
-
-PyObject *
-libvirt_ulongWrap(unsigned long val)
-{
- PyObject *ret;
- ret = PyLong_FromLong(val);
- return ret;
-}
-
-PyObject *
-libvirt_longlongWrap(long long val)
-{
- PyObject *ret;
- ret = PyLong_FromUnsignedLongLong((unsigned long long) val);
- return ret;
-}
-
-PyObject *
-libvirt_ulonglongWrap(unsigned long long val)
-{
- PyObject *ret;
- ret = PyLong_FromUnsignedLongLong(val);
- return ret;
-}
-
-PyObject *
-libvirt_charPtrSizeWrap(char *str, Py_ssize_t size)
-{
- PyObject *ret;
-
- if (str == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- ret = PyString_FromStringAndSize(str, size);
- VIR_FREE(str);
- return ret;
-}
-
-PyObject *
-libvirt_charPtrWrap(char *str)
-{
- PyObject *ret;
-
- if (str == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- ret = PyString_FromString(str);
- VIR_FREE(str);
- return ret;
-}
-
-PyObject *
-libvirt_constcharPtrWrap(const char *str)
-{
- PyObject *ret;
-
- if (str == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- ret = PyString_FromString(str);
- return ret;
-}
-
-int
-libvirt_intUnwrap(PyObject *obj, int *val)
-{
- long long_val;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- /* If obj is type of PyInt_Type, PyInt_AsLong converts it
- * to C long type directly. If it is of PyLong_Type, PyInt_AsLong
- * will call PyLong_AsLong() to deal with it automatically.
- */
- long_val = PyInt_AsLong(obj);
- if ((long_val == -1) && PyErr_Occurred())
- return -1;
-
-#if LONG_MAX != INT_MAX
- if (long_val >= INT_MIN && long_val <= INT_MAX) {
- *val = long_val;
- } else {
- PyErr_SetString(PyExc_OverflowError,
- "Python int too large to convert to C int");
- return -1;
- }
-#else
- *val = long_val;
-#endif
- return 0;
-}
-
-int
-libvirt_uintUnwrap(PyObject *obj, unsigned int *val)
-{
- long long_val;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- long_val = PyInt_AsLong(obj);
- if ((long_val == -1) && PyErr_Occurred())
- return -1;
-
- if (long_val >= 0 && long_val <= UINT_MAX) {
- *val = long_val;
- } else {
- PyErr_SetString(PyExc_OverflowError,
- "Python int too large to convert to C unsigned int");
- return -1;
- }
- return 0;
-}
-
-int
-libvirt_longUnwrap(PyObject *obj, long *val)
-{
- long long_val;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- long_val = PyInt_AsLong(obj);
- if ((long_val == -1) && PyErr_Occurred())
- return -1;
-
- *val = long_val;
- return 0;
-}
-
-int
-libvirt_ulongUnwrap(PyObject *obj, unsigned long *val)
-{
- long long_val;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- long_val = PyInt_AsLong(obj);
- if ((long_val == -1) && PyErr_Occurred())
- return -1;
-
- if (long_val >= 0) {
- *val = long_val;
- } else {
- PyErr_SetString(PyExc_OverflowError,
- "negative Python int cannot be converted to C unsigned long");
- return -1;
- }
- return 0;
-}
-
-int
-libvirt_longlongUnwrap(PyObject *obj, long long *val)
-{
- long long llong_val = -1;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- /* If obj is of PyInt_Type, PyLong_AsLongLong
- * will call PyInt_AsLong() to handle it automatically.
- */
- if (PyInt_Check(obj) || PyLong_Check(obj))
- llong_val = PyLong_AsLongLong(obj);
- else
- PyErr_SetString(PyExc_TypeError, "an integer is required");
-
- if ((llong_val == -1) && PyErr_Occurred())
- return -1;
-
- *val = llong_val;
- return 0;
-}
-
-int
-libvirt_ulonglongUnwrap(PyObject *obj, unsigned long long *val)
-{
- unsigned long long ullong_val = -1;
- long long llong_val;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- /* The PyLong_AsUnsignedLongLong doesn't check the type of
- * obj, only accept argument of PyLong_Type, so we check it instead.
- */
- if (PyInt_Check(obj)) {
- llong_val = PyInt_AsLong(obj);
- if (llong_val < 0)
- PyErr_SetString(PyExc_OverflowError,
- "negative Python int cannot be converted to C unsigned long long");
- else
- ullong_val = llong_val;
- } else if (PyLong_Check(obj)) {
- ullong_val = PyLong_AsUnsignedLongLong(obj);
- } else {
- PyErr_SetString(PyExc_TypeError, "an integer is required");
- }
-
- if ((ullong_val == -1) && PyErr_Occurred())
- return -1;
-
- *val = ullong_val;
- return 0;
-}
-
-int
-libvirt_doubleUnwrap(PyObject *obj, double *val)
-{
- double double_val;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- double_val = PyFloat_AsDouble(obj);
- if ((double_val == -1) && PyErr_Occurred())
- return -1;
-
- *val = double_val;
- return 0;
-}
-
-int
-libvirt_boolUnwrap(PyObject *obj, bool *val)
-{
- int ret;
-
- if (!obj) {
- PyErr_SetString(PyExc_TypeError, "unexpected type");
- return -1;
- }
-
- if ((ret = PyObject_IsTrue(obj)) < 0)
- return ret;
-
- *val = ret > 0;
- return 0;
-}
-
-PyObject *
-libvirt_virDomainPtrWrap(virDomainPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virDomainPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virNetworkPtrWrap(virNetworkPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virNetworkPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virInterfacePtrWrap(virInterfacePtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virInterfacePtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virStoragePoolPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virStorageVolPtrWrap(virStorageVolPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virStorageVolPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virConnectPtrWrap(virConnectPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virConnectPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virNodeDevicePtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virSecretPtrWrap(virSecretPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virSecretPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virNWFilterPtrWrap(virNWFilterPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virNWFilterPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virStreamPtrWrap(virStreamPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virStreamPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virDomainSnapshotPtrWrap(virDomainSnapshotPtr node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virDomainSnapshotPtr", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virEventHandleCallbackWrap(virEventHandleCallback node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- printf("%s: WARNING - Wrapping None\n", __func__);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virEventHandleCallback", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- printf("%s: WARNING - Wrapping None\n", __func__);
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virEventTimeoutCallback", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virFreeCallbackWrap(virFreeCallback node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "virFreeCallback", NULL);
- return ret;
-}
-
-PyObject *
-libvirt_virVoidPtrWrap(void* node)
-{
- PyObject *ret;
-
- if (node == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- ret = libvirt_buildPyObject(node, "void*", NULL);
- return ret;
-}
diff --git a/python/typewrappers.h b/python/typewrappers.h
deleted file mode 100644
index d871d3f..0000000
--- a/python/typewrappers.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * libvirt_wrap.h: type wrappers for libvir python bindings
- *
- * Copyright (C) 2005, 2011-2012 Red Hat, Inc.
- *
- * Daniel Veillard <veillard(a)redhat.com>
- */
-
-#include <Python.h>
-#include <stdbool.h>
-#include <libvirt/libvirt.h>
-#include <libvirt/virterror.h>
-
-#ifdef __GNUC__
-# ifdef ATTRIBUTE_UNUSED
-# undef ATTRIBUTE_UNUSED
-# endif
-# ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-# endif /* ATTRIBUTE_UNUSED */
-#else
-# define ATTRIBUTE_UNUSED
-#endif
-
-/* Work around really old python. */
-#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5
-typedef ssize_t Py_ssize_t;
-#endif
-
-#define PyvirConnect_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirConnect_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virConnectPtr obj;
-} PyvirConnect_Object;
-
-
-#define PyvirDomain_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirDomain_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virDomainPtr obj;
-} PyvirDomain_Object;
-
-
-#define PyvirNetwork_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirNetwork_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virNetworkPtr obj;
-} PyvirNetwork_Object;
-
-
-#define PyvirInterface_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirInterface_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virInterfacePtr obj;
-} PyvirInterface_Object;
-
-
-#define PyvirStoragePool_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirStoragePool_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virStoragePoolPtr obj;
-} PyvirStoragePool_Object;
-
-
-#define PyvirStorageVol_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirStorageVol_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virStorageVolPtr obj;
-} PyvirStorageVol_Object;
-
-
-#define PyvirNodeDevice_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirNodeDevice_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virNodeDevicePtr obj;
-} PyvirNodeDevice_Object;
-
-#define PyvirSecret_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirSecret_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virSecretPtr obj;
-} PyvirSecret_Object;
-
-#define PyvirNWFilter_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirNWFilter_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virNWFilterPtr obj;
-} PyvirNWFilter_Object;
-
-
-#define PyvirStream_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirStream_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virStreamPtr obj;
-} PyvirStream_Object;
-
-
-#define PyvirDomainSnapshot_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirDomainSnapshot_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virDomainSnapshotPtr obj;
-} PyvirDomainSnapshot_Object;
-
-
-#define PyvirEventHandleCallback_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirEventHandleCallback_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virEventHandleCallback obj;
-} PyvirEventHandleCallback_Object;
-
-#define PyvirEventTimeoutCallback_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirEventTimeoutCallback_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virEventTimeoutCallback obj;
-} PyvirEventTimeoutCallback_Object;
-
-#define PyvirFreeCallback_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirFreeCallback_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- virFreeCallback obj;
-} PyvirFreeCallback_Object;
-
-#define PyvirVoidPtr_Get(v) (((v) == Py_None) ? NULL : \
- (((PyvirVoidPtr_Object *)(v))->obj))
-
-typedef struct {
- PyObject_HEAD
- void* obj;
-} PyvirVoidPtr_Object;
-
-PyObject * libvirt_intWrap(int val);
-PyObject * libvirt_longWrap(long val);
-PyObject * libvirt_ulongWrap(unsigned long val);
-PyObject * libvirt_longlongWrap(long long val);
-PyObject * libvirt_ulonglongWrap(unsigned long long val);
-PyObject * libvirt_charPtrWrap(char *str);
-PyObject * libvirt_charPtrSizeWrap(char *str, Py_ssize_t size);
-PyObject * libvirt_constcharPtrWrap(const char *str);
-int libvirt_intUnwrap(PyObject *obj, int *val);
-int libvirt_uintUnwrap(PyObject *obj, unsigned int *val);
-int libvirt_longUnwrap(PyObject *obj, long *val);
-int libvirt_ulongUnwrap(PyObject *obj, unsigned long *val);
-int libvirt_longlongUnwrap(PyObject *obj, long long *val);
-int libvirt_ulonglongUnwrap(PyObject *obj, unsigned long long *val);
-int libvirt_doubleUnwrap(PyObject *obj, double *val);
-int libvirt_boolUnwrap(PyObject *obj, bool *val);
-PyObject * libvirt_virConnectPtrWrap(virConnectPtr node);
-PyObject * libvirt_virDomainPtrWrap(virDomainPtr node);
-PyObject * libvirt_virNetworkPtrWrap(virNetworkPtr node);
-PyObject * libvirt_virInterfacePtrWrap(virInterfacePtr node);
-PyObject * libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node);
-PyObject * libvirt_virStorageVolPtrWrap(virStorageVolPtr node);
-PyObject * libvirt_virEventHandleCallbackWrap(virEventHandleCallback node);
-PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node);
-PyObject * libvirt_virFreeCallbackWrap(virFreeCallback node);
-PyObject * libvirt_virVoidPtrWrap(void* node);
-PyObject * libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node);
-PyObject * libvirt_virSecretPtrWrap(virSecretPtr node);
-PyObject * libvirt_virNWFilterPtrWrap(virNWFilterPtr node);
-PyObject * libvirt_virStreamPtrWrap(virStreamPtr node);
-PyObject * libvirt_virDomainSnapshotPtrWrap(virDomainSnapshotPtr node);
-
-
-/* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl):
- * LIBVIRT_STMT_START { statements; } LIBVIRT_STMT_END;
- * can be used as a single statement, as in
- * if (x) LIBVIRT_STMT_START { ... } LIBVIRT_STMT_END; else ...
- *
- * When GCC is compiling C code in non-ANSI mode, it will use the
- * compiler __extension__ to wrap the statements within `({' and '})' braces.
- * When compiling on platforms where configure has defined
- * HAVE_DOWHILE_MACROS, statements will be wrapped with `do' and `while (0)'.
- * For any other platforms (SunOS4 is known to have this issue), wrap the
- * statements with `if (1)' and `else (void) 0'.
- */
-#if !(defined (LIBVIRT_STMT_START) && defined (LIBVIRT_STMT_END))
-# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
-# define LIBVIRT_STMT_START (void) __extension__ (
-# define LIBVIRT_STMT_END )
-# else /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
-# if defined (HAVE_DOWHILE_MACROS)
-# define LIBVIRT_STMT_START do
-# define LIBVIRT_STMT_END while (0)
-# else /* !HAVE_DOWHILE_MACROS */
-# define LIBVIRT_STMT_START if (1)
-# define LIBVIRT_STMT_END else (void) 0
-# endif /* !HAVE_DOWHILE_MACROS */
-# endif /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
-#endif
-
-#define LIBVIRT_BEGIN_ALLOW_THREADS \
- LIBVIRT_STMT_START { \
- PyThreadState *_save = NULL; \
- if (PyEval_ThreadsInitialized()) \
- _save = PyEval_SaveThread();
-
-#define LIBVIRT_END_ALLOW_THREADS \
- if (PyEval_ThreadsInitialized()) \
- PyEval_RestoreThread(_save); \
- } LIBVIRT_STMT_END
-
-#define LIBVIRT_ENSURE_THREAD_STATE \
- LIBVIRT_STMT_START { \
- PyGILState_STATE _save = PyGILState_UNLOCKED; \
- if (PyEval_ThreadsInitialized()) \
- _save = PyGILState_Ensure();
-
-#define LIBVIRT_RELEASE_THREAD_STATE \
- if (PyEval_ThreadsInitialized()) \
- PyGILState_Release(_save); \
- } LIBVIRT_STMT_END
diff --git a/run.in b/run.in
index 5d4a04c..2211f24 100644
--- a/run.in
+++ b/run.in
@@ -58,15 +58,6 @@ export LIBVIRT_LOCK_MANAGER_PLUGIN_DIR="$b/src/.libs"
export VIRTLOCKD_PATH="$b/src/virtlockd"
export LIBVIRTD_PATH="$b/daemon/libvirtd"
-# For Python.
-export PYTHON=@PYTHON@
-if [ -z "$PYTHONPATH" ]; then
- PYTHONPATH="$b/python:$b/python/.libs"
-else
- PYTHONPATH="$b/python:$b/python/.libs:$PYTHONPATH"
-fi
-export PYTHONPATH
-
# This is a cheap way to find some use-after-free and uninitialized
# read problems when using glibc.
random_val="$(awk 'BEGIN{srand(); print 1+int(255*rand())}' < /dev/null)"
--
1.8.3.1
2
5
We have now pushed the python binding code to its new GIT repository
location. If you intend to work on python bindings, please get yourself
a checkout of the following
http://libvirt.org/git/?p=libvirt-python.git;a=summary
git://libvirt.org/libvirt-python.git
The python binding will generally be released at the same time as major
libvirt releases, if new manually written bindings were required. If
all new APIs were correctly handled by the code generator, we will not
need to do a release.
The minor maint branches will also be separate for libvirt.git vs
libvirt-python.git. It is unlikely we'll need to do maint branches
for the python code most of the time. If we do though, there is no
need to synchronize with libvirt maint releases.
Regards,
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 :|
1
0