mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-10-22 19:34:08 +03:00
Compare commits
354 Commits
v2.1.0
...
v0.9.11-ma
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd0d348ed0 | ||
|
|
bffb94488b | ||
|
|
9dc3c58641 | ||
|
|
fd62b68001 | ||
|
|
7165cbb4c7 | ||
|
|
324c883e99 | ||
|
|
5dd76a504f | ||
|
|
5399dfe627 | ||
|
|
343e6ca680 | ||
|
|
84d7e1f83c | ||
|
|
c58e501cc6 | ||
|
|
416fc2e4cc | ||
|
|
d23e735fb4 | ||
|
|
71e88fc577 | ||
|
|
f4d50d0596 | ||
|
|
83b70f7423 | ||
|
|
32aeec7baf | ||
|
|
85ed730711 | ||
|
|
01247d0c4e | ||
|
|
3390e973a1 | ||
|
|
fff0ce1116 | ||
|
|
2f450cf25e | ||
|
|
e474a208e0 | ||
|
|
7ae53f1593 | ||
|
|
83c58870dc | ||
|
|
0231e37a53 | ||
|
|
d0e1501518 | ||
|
|
6b3edda207 | ||
|
|
a5e743c330 | ||
|
|
b20b391fe0 | ||
|
|
9eb2b57325 | ||
|
|
35472c9274 | ||
|
|
5c881f35c7 | ||
|
|
ff05b2c4f9 | ||
|
|
6ca5649625 | ||
|
|
39a427e8ba | ||
|
|
ca1cebdb9e | ||
|
|
1917cc05a3 | ||
|
|
35ca0db359 | ||
|
|
2abde0ac07 | ||
|
|
fe98b65947 | ||
|
|
db7159a150 | ||
|
|
220c90e4bb | ||
|
|
ee92a735cb | ||
|
|
b50e896cee | ||
|
|
c1e7b1fbd1 | ||
|
|
71d4ccb253 | ||
|
|
80550d01ae | ||
|
|
083962fa05 | ||
|
|
b520cf07f0 | ||
|
|
dd2f524c6b | ||
|
|
d325704a3f | ||
|
|
997d97c34e | ||
|
|
7725e01c1f | ||
|
|
f4c9a872b6 | ||
|
|
adcd86527e | ||
|
|
38e6d7b981 | ||
|
|
3fcc90968c | ||
|
|
b2c5a91197 | ||
|
|
d6bce88ca3 | ||
|
|
758a066ab3 | ||
|
|
086c3fbab1 | ||
|
|
e9c00cbc63 | ||
|
|
f8e651117f | ||
|
|
6180670cd2 | ||
|
|
4d695acd86 | ||
|
|
400a5a9290 | ||
|
|
e48596773f | ||
|
|
2c5b4c5621 | ||
|
|
419cb87283 | ||
|
|
4779cf0ff5 | ||
|
|
5badf8c44b | ||
|
|
8cb0d0893f | ||
|
|
b1dcd198fa | ||
|
|
6f42946997 | ||
|
|
2fd84d39b4 | ||
|
|
69cba17cb0 | ||
|
|
c02482bdd8 | ||
|
|
20d781692a | ||
|
|
9649b0a8b4 | ||
|
|
819df25518 | ||
|
|
3883ef0360 | ||
|
|
b9964013c3 | ||
|
|
9a7bbc246b | ||
|
|
d13b354bf0 | ||
|
|
eddceda2f3 | ||
|
|
c27523e635 | ||
|
|
f81800cf23 | ||
|
|
d4ffc36fbc | ||
|
|
40b0176129 | ||
|
|
cba63bbc22 | ||
|
|
a69e46813f | ||
|
|
cf640bdf8e | ||
|
|
f7ebe9d012 | ||
|
|
00b610c8e9 | ||
|
|
4da16535d0 | ||
|
|
3fb882a3fe | ||
|
|
9af9f46b09 | ||
|
|
95b065590f | ||
|
|
b20e330d67 | ||
|
|
ca2765a2a0 | ||
|
|
b1b449b3e2 | ||
|
|
da284a74fb | ||
|
|
dfd51bfc21 | ||
|
|
87924a1345 | ||
|
|
6fba8c1f37 | ||
|
|
870094c1e1 | ||
|
|
568e6651ba | ||
|
|
aa57eae7b1 | ||
|
|
2a71d969e4 | ||
|
|
9a5d10efc9 | ||
|
|
8512c27e23 | ||
|
|
20b07c28ec | ||
|
|
da54890f52 | ||
|
|
d838a6bca8 | ||
|
|
2a6cfe8ee8 | ||
|
|
9fc5b7da1d | ||
|
|
cba21fd98d | ||
|
|
d020d73f30 | ||
|
|
66d095e673 | ||
|
|
340ab1c91c | ||
|
|
91b4315b81 | ||
|
|
49cb53fae9 | ||
|
|
855d8612a2 | ||
|
|
e858eda3a0 | ||
|
|
bba793dcf5 | ||
|
|
e8603e5f73 | ||
|
|
4cb2da8cd4 | ||
|
|
9373f0b71b | ||
|
|
d312193630 | ||
|
|
5814e39b32 | ||
|
|
d2c5e42fdd | ||
|
|
7223766077 | ||
|
|
762fcc7760 | ||
|
|
794d6c40a1 | ||
|
|
f1c2127bec | ||
|
|
45d6729f98 | ||
|
|
56f97e14ab | ||
|
|
96aedd9aa1 | ||
|
|
27e6e9f212 | ||
|
|
d66fa967b3 | ||
|
|
89a3feb8b6 | ||
|
|
04d6469141 | ||
|
|
3c3aaaf95f | ||
|
|
e570f87a3d | ||
|
|
52c4d49ca3 | ||
|
|
e6c5ae46f7 | ||
|
|
0889bdb844 | ||
|
|
73908b1d10 | ||
|
|
661a2e83ef | ||
|
|
934e7c2217 | ||
|
|
a570ecd600 | ||
|
|
dd85b621cf | ||
|
|
9225f9e12f | ||
|
|
a016b20fa4 | ||
|
|
17c787562d | ||
|
|
6503cb1217 | ||
|
|
2e2a81be22 | ||
|
|
a52a99f5d3 | ||
|
|
a25ac3ac7e | ||
|
|
a9846e98c7 | ||
|
|
95ae1a06bc | ||
|
|
84daddb0b9 | ||
|
|
5840d413ad | ||
|
|
29263ec243 | ||
|
|
55157abb0b | ||
|
|
c7bd2b052f | ||
|
|
4b5a793070 | ||
|
|
9274256d5b | ||
|
|
65a405dd04 | ||
|
|
b24a9f3e12 | ||
|
|
33ada8f147 | ||
|
|
07fdce4fd3 | ||
|
|
f6e7865d27 | ||
|
|
2a75b756d0 | ||
|
|
25a35c9ce5 | ||
|
|
5b3c356015 | ||
|
|
114b726f0d | ||
|
|
4e1e20c3a7 | ||
|
|
b5df0ffe74 | ||
|
|
bd670db3f0 | ||
|
|
1ae2604552 | ||
|
|
aa7d50ce82 | ||
|
|
ab73fe59be | ||
|
|
37b07d90bb | ||
|
|
b3f0d2ecba | ||
|
|
0089a2058f | ||
|
|
dfa1548496 | ||
|
|
c82cbf1d48 | ||
|
|
da5eb7f119 | ||
|
|
9096dc1a5f | ||
|
|
cb724f8d13 | ||
|
|
af57c143d4 | ||
|
|
eb6ef1f53e | ||
|
|
b4bbe640ef | ||
|
|
0f031d181f | ||
|
|
99f07394f4 | ||
|
|
52ab82bd1c | ||
|
|
7fba39bc52 | ||
|
|
e39afdb898 | ||
|
|
3e416ba91f | ||
|
|
f44e18ed93 | ||
|
|
328d7da106 | ||
|
|
158e70fc3b | ||
|
|
d4d8774468 | ||
|
|
3600eec4d1 | ||
|
|
67f5578681 | ||
|
|
fc8700e919 | ||
|
|
c82da02253 | ||
|
|
50f508efca | ||
|
|
e240feae95 | ||
|
|
5b66c62d47 | ||
|
|
f9ff58276f | ||
|
|
50b594e486 | ||
|
|
6b184ba1ce | ||
|
|
19d309025b | ||
|
|
73cfdbff65 | ||
|
|
9a42097bf4 | ||
|
|
7f756f519c | ||
|
|
3291646d45 | ||
|
|
e88212d583 | ||
|
|
d8a1c6b70c | ||
|
|
856a23c2bc | ||
|
|
ecd9a50b76 | ||
|
|
6ef9ea9bbf | ||
|
|
a0be049f67 | ||
|
|
48b9eb2d55 | ||
|
|
d1186c589f | ||
|
|
df4b23c9de | ||
|
|
d8978c90f9 | ||
|
|
6884836d95 | ||
|
|
4f1b3e4243 | ||
|
|
b5b4faea50 | ||
|
|
1d3218ab5e | ||
|
|
fd9f487aca | ||
|
|
41a3072338 | ||
|
|
8f755aa295 | ||
|
|
0ddca6ab09 | ||
|
|
ce5d17b316 | ||
|
|
443e37da42 | ||
|
|
3cc52164b1 | ||
|
|
d617c987b7 | ||
|
|
18c1491697 | ||
|
|
05aa969fc9 | ||
|
|
f6936215f1 | ||
|
|
68563e7ad6 | ||
|
|
b5f86fc038 | ||
|
|
282bd9dc61 | ||
|
|
a14f23f05c | ||
|
|
cd94771b1d | ||
|
|
cf2d303d0c | ||
|
|
2b25ea3e15 | ||
|
|
ab26f4e372 | ||
|
|
052ef069b1 | ||
|
|
655d3b2b87 | ||
|
|
707624b3d9 | ||
|
|
656875281a | ||
|
|
20c0657406 | ||
|
|
7dc3258a3c | ||
|
|
8d19662026 | ||
|
|
e28cfeb11d | ||
|
|
d0714c927c | ||
|
|
4a9f92f283 | ||
|
|
f065174ede | ||
|
|
763f71e51f | ||
|
|
180fb3b2b4 | ||
|
|
588b16bbd5 | ||
|
|
e36af9f8c1 | ||
|
|
aa829d7bcd | ||
|
|
75a5c8225b | ||
|
|
2cb6a0e887 | ||
|
|
0f28a21bb6 | ||
|
|
45e60ff0f1 | ||
|
|
6bbfd92d22 | ||
|
|
d070e1d1bc | ||
|
|
30e02e12c1 | ||
|
|
30aede2279 | ||
|
|
fae6eb83e7 | ||
|
|
ce43e865a1 | ||
|
|
9404d15dc1 | ||
|
|
f587a073c6 | ||
|
|
7910b77c29 | ||
|
|
3d8345422e | ||
|
|
99e11c19af | ||
|
|
da62dd1d13 | ||
|
|
05cee1a9ab | ||
|
|
54c3a530c7 | ||
|
|
18adb6cf82 | ||
|
|
d9f909d4cd | ||
|
|
f80cf4938a | ||
|
|
b5c7516e46 | ||
|
|
b109b1140c | ||
|
|
e173e81ed9 | ||
|
|
0129b9ac1d | ||
|
|
d63f0754e3 | ||
|
|
5531a13c5f | ||
|
|
6e2847b277 | ||
|
|
acae5f8633 | ||
|
|
c954ad8a3e | ||
|
|
3cf61dd5f0 | ||
|
|
372a14c673 | ||
|
|
1d655dd1bb | ||
|
|
622c0c7f70 | ||
|
|
881dd9dc43 | ||
|
|
ac620c2e4a | ||
|
|
8a55d381ae | ||
|
|
834bb44834 | ||
|
|
e3f725a171 | ||
|
|
dde004a70f | ||
|
|
b38be9da8c | ||
|
|
3dab791fc7 | ||
|
|
d2aec1138f | ||
|
|
9963f590c1 | ||
|
|
e3cac12ca8 | ||
|
|
0efe7ecc2d | ||
|
|
f2be8879b8 | ||
|
|
92d9128a77 | ||
|
|
61544d310e | ||
|
|
455d222457 | ||
|
|
3f76415724 | ||
|
|
4ceabdf570 | ||
|
|
4ecd1d6983 | ||
|
|
cea0c393aa | ||
|
|
7175699cbb | ||
|
|
413d8670ec | ||
|
|
965e7f1452 | ||
|
|
27ef74ff40 | ||
|
|
9b72feecc3 | ||
|
|
8dce8b828c | ||
|
|
3f62b1135e | ||
|
|
28f8deb29a | ||
|
|
f9d589cc41 | ||
|
|
194d0b8b0a | ||
|
|
ad8a04697f | ||
|
|
47e6324545 | ||
|
|
f25ef09fb5 | ||
|
|
c5031e2d1d | ||
|
|
a791cde7cb | ||
|
|
cc8b3237c5 | ||
|
|
3506eb7a7b | ||
|
|
07530184d5 | ||
|
|
a6c441662d | ||
|
|
2bfb07cb05 | ||
|
|
df7a458f66 | ||
|
|
26fdec39b4 | ||
|
|
cf51433172 | ||
|
|
e9df9ab66e | ||
|
|
bc5355bb57 | ||
|
|
8a98a23900 | ||
|
|
8fca254f5d | ||
|
|
779ac7ab69 | ||
|
|
cde4c634e7 | ||
|
|
d3b7ad3f33 | ||
|
|
b2ff41d81f |
5
.ctags
5
.ctags
@@ -1,5 +0,0 @@
|
|||||||
--recurse
|
|
||||||
--exclude=*.orig
|
|
||||||
--exclude=*.html
|
|
||||||
--exclude=*.html.in
|
|
||||||
--langmap=c:+.h.in
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
(
|
|
||||||
(c-mode . (
|
|
||||||
(c-file-style . "K&R")
|
|
||||||
(indent-tabs-mode . nil)
|
|
||||||
(c-indent-level . 4)
|
|
||||||
(c-basic-offset . 4)
|
|
||||||
))
|
|
||||||
(html-mode . (
|
|
||||||
(indent-tabs-mode . nil)
|
|
||||||
))
|
|
||||||
(sh-mode . (
|
|
||||||
(indent-tabs-mode . nil)
|
|
||||||
))
|
|
||||||
(nxml-mode . (
|
|
||||||
(indent-tabs-mode . nil)
|
|
||||||
))
|
|
||||||
(perl-mode . (
|
|
||||||
(indent-tabs-mode . nil)
|
|
||||||
))
|
|
||||||
)
|
|
||||||
160
.gitignore
vendored
160
.gitignore
vendored
@@ -1,34 +1,23 @@
|
|||||||
*#*#
|
*#*#
|
||||||
*.#*#
|
*.#*#
|
||||||
*.[18]
|
|
||||||
*.[18].in
|
|
||||||
*.a
|
*.a
|
||||||
*.cov
|
*.cov
|
||||||
*.exe
|
*.exe
|
||||||
*.exe.manifest
|
|
||||||
*.gcda
|
*.gcda
|
||||||
*.gcno
|
*.gcno
|
||||||
*.gcov
|
*.gcov
|
||||||
*.html
|
*.html
|
||||||
*.i
|
*.i
|
||||||
*.init
|
|
||||||
*.la
|
*.la
|
||||||
*.lo
|
*.lo
|
||||||
*.loT
|
*.loT
|
||||||
*.o
|
*.o
|
||||||
*.orig
|
*.orig
|
||||||
*.pem
|
|
||||||
*.pyc
|
*.pyc
|
||||||
*.rej
|
*.rej
|
||||||
*.s
|
*.s
|
||||||
*.service
|
|
||||||
*.socket
|
|
||||||
*.swp
|
|
||||||
*~
|
*~
|
||||||
.#*
|
|
||||||
.deps
|
.deps
|
||||||
.dirstamp
|
|
||||||
.gdb_history
|
|
||||||
.git
|
.git
|
||||||
.git-module-status
|
.git-module-status
|
||||||
.libs
|
.libs
|
||||||
@@ -36,16 +25,16 @@
|
|||||||
.memdump
|
.memdump
|
||||||
.sc-start-sc_*
|
.sc-start-sc_*
|
||||||
/ABOUT-NLS
|
/ABOUT-NLS
|
||||||
/AUTHORS
|
/COPYING
|
||||||
/ChangeLog
|
/ChangeLog
|
||||||
/GNUmakefile
|
/GNUmakefile
|
||||||
/INSTALL
|
/INSTALL
|
||||||
/NEWS
|
/NEWS
|
||||||
/aclocal.m4
|
/aclocal.m4
|
||||||
/autom4te.cache
|
/autom4te.cache
|
||||||
|
/build-aux
|
||||||
/build-aux/
|
/build-aux/
|
||||||
/build/
|
/build/
|
||||||
/confdefs.h
|
|
||||||
/config.cache
|
/config.cache
|
||||||
/config.guess
|
/config.guess
|
||||||
/config.h
|
/config.h
|
||||||
@@ -56,153 +45,130 @@
|
|||||||
/config.sub
|
/config.sub
|
||||||
/configure
|
/configure
|
||||||
/configure.lineno
|
/configure.lineno
|
||||||
/conftest.*
|
|
||||||
/daemon/*_dispatch.h
|
/daemon/*_dispatch.h
|
||||||
/daemon/libvirt_qemud
|
/daemon/libvirt_qemud
|
||||||
/daemon/libvirtd
|
/daemon/libvirtd
|
||||||
/daemon/libvirtd*.logrotate
|
/daemon/libvirtd*.logrotate
|
||||||
/daemon/libvirtd.policy
|
/daemon/libvirtd.8
|
||||||
/daemon/test_libvirtd.aug
|
/daemon/libvirtd.8.in
|
||||||
/docs/aclperms.htmlinc
|
/daemon/libvirtd.init
|
||||||
|
/daemon/libvirtd.pod
|
||||||
|
/daemon/libvirtd.service
|
||||||
/docs/apibuild.py.stamp
|
/docs/apibuild.py.stamp
|
||||||
/docs/devhelp/libvirt.devhelp
|
/docs/devhelp/libvirt.devhelp
|
||||||
/docs/hvsupport.html.in
|
/docs/hvsupport.html.in
|
||||||
/docs/libvirt-admin-*.xml
|
|
||||||
/docs/libvirt-api.xml
|
/docs/libvirt-api.xml
|
||||||
/docs/libvirt-lxc-*.xml
|
|
||||||
/docs/libvirt-qemu-*.xml
|
/docs/libvirt-qemu-*.xml
|
||||||
/docs/libvirt-refs.xml
|
/docs/libvirt-refs.xml
|
||||||
/docs/search.php
|
|
||||||
/docs/todo.html.in
|
/docs/todo.html.in
|
||||||
/examples/admin/client_close
|
/examples/domain-events/events-c/event-test
|
||||||
/examples/admin/client_info
|
|
||||||
/examples/admin/client_limits
|
|
||||||
/examples/admin/list_clients
|
|
||||||
/examples/admin/list_servers
|
|
||||||
/examples/admin/threadpool_params
|
|
||||||
/examples/object-events/event-test
|
|
||||||
/examples/dominfo/info1
|
/examples/dominfo/info1
|
||||||
/examples/domsuspend/suspend
|
/examples/domsuspend/suspend
|
||||||
/examples/dommigrate/dommigrate
|
|
||||||
/examples/domtop/domtop
|
|
||||||
/examples/hellolibvirt/hellolibvirt
|
/examples/hellolibvirt/hellolibvirt
|
||||||
/examples/openauth/openauth
|
/examples/openauth/openauth
|
||||||
/examples/rename/rename
|
|
||||||
/gnulib/lib/*
|
/gnulib/lib/*
|
||||||
/gnulib/m4/*
|
/gnulib/m4/*
|
||||||
/gnulib/tests/*
|
/gnulib/tests/*
|
||||||
/include/libvirt/libvirt-common.h
|
/include/libvirt/libvirt.h
|
||||||
/libtool
|
/libtool
|
||||||
/libvirt-*.tar.xz
|
/libvirt-*.tar.gz
|
||||||
/libvirt-[0-9]*
|
/libvirt-[0-9]*
|
||||||
/libvirt*.pc
|
/libvirt.pc
|
||||||
/libvirt.spec
|
/libvirt.spec
|
||||||
/ltconfig
|
/ltconfig
|
||||||
/ltmain.sh
|
/ltmain.sh
|
||||||
/m4/*
|
/m4/*
|
||||||
/maint.mk
|
/maint.mk
|
||||||
/mingw-libvirt.spec
|
/mingw32-libvirt.spec
|
||||||
/mkinstalldirs
|
/mkinstalldirs
|
||||||
/po/*
|
/po/*
|
||||||
/proxy/
|
/proxy/
|
||||||
/python/
|
/python/generated.stamp
|
||||||
/run
|
/python/generator.py.stamp
|
||||||
|
/python/libvirt-export.c
|
||||||
|
/python/libvirt-qemu-export.c
|
||||||
|
/python/libvirt-qemu.[ch]
|
||||||
|
/python/libvirt.[ch]
|
||||||
|
/python/libvirt.py
|
||||||
|
/python/libvirt_qemu.py
|
||||||
/sc_*
|
/sc_*
|
||||||
/src/.*.stamp
|
|
||||||
/src/*.pc
|
|
||||||
/src/access/org.libvirt.api.policy
|
|
||||||
/src/access/viraccessapicheck.c
|
|
||||||
/src/access/viraccessapicheck.h
|
|
||||||
/src/access/viraccessapichecklxc.c
|
|
||||||
/src/access/viraccessapichecklxc.h
|
|
||||||
/src/access/viraccessapicheckqemu.c
|
|
||||||
/src/access/viraccessapicheckqemu.h
|
|
||||||
/src/admin/admin_client.h
|
|
||||||
/src/admin/admin_protocol.[ch]
|
|
||||||
/src/esx/*.generated.*
|
/src/esx/*.generated.*
|
||||||
/src/hyperv/*.generated.*
|
/src/hyperv/*.generated.*
|
||||||
/src/libvirt*.def
|
/src/libvirt*.def
|
||||||
/src/libvirt.syms
|
/src/libvirt.syms
|
||||||
/src/libvirt_access.syms
|
|
||||||
/src/libvirt_access.xml
|
|
||||||
/src/libvirt_access_lxc.syms
|
|
||||||
/src/libvirt_access_lxc.xml
|
|
||||||
/src/libvirt_access_qemu.syms
|
|
||||||
/src/libvirt_access_qemu.xml
|
|
||||||
/src/libvirt_admin.syms
|
|
||||||
/src/libvirt_*.stp
|
/src/libvirt_*.stp
|
||||||
/src/libvirt_*helper
|
/src/libvirt_*helper
|
||||||
/src/libvirt_*probes.h
|
|
||||||
/src/libvirt_lxc
|
/src/libvirt_lxc
|
||||||
/src/locking/libxl-lockd.conf
|
|
||||||
/src/locking/libxl-sanlock.conf
|
|
||||||
/src/locking/lock_daemon_dispatch_stubs.h
|
|
||||||
/src/locking/lock_protocol.[ch]
|
|
||||||
/src/locking/qemu-lockd.conf
|
|
||||||
/src/locking/qemu-sanlock.conf
|
/src/locking/qemu-sanlock.conf
|
||||||
/src/locking/test_libvirt_sanlock.aug
|
/src/probes.h
|
||||||
/src/logging/log_daemon_dispatch_stubs.h
|
|
||||||
/src/logging/log_protocol.[ch]
|
|
||||||
/src/lxc/lxc_controller_dispatch.h
|
|
||||||
/src/lxc/lxc_monitor_dispatch.h
|
|
||||||
/src/lxc/lxc_monitor_protocol.c
|
|
||||||
/src/lxc/lxc_monitor_protocol.h
|
|
||||||
/src/lxc/lxc_protocol.[ch]
|
|
||||||
/src/lxc/test_libvirtd_lxc.aug
|
|
||||||
/src/qemu/test_libvirtd_qemu.aug
|
|
||||||
/src/remote/*_client_bodies.h
|
/src/remote/*_client_bodies.h
|
||||||
/src/remote/*_protocol.[ch]
|
/src/remote/*_protocol.[ch]
|
||||||
/src/rpc/virkeepaliveprotocol.[ch]
|
/src/rpc/virkeepaliveprotocol.[ch]
|
||||||
/src/rpc/virnetprotocol.[ch]
|
/src/rpc/virnetprotocol.[ch]
|
||||||
/src/test_libvirt*.aug
|
|
||||||
/src/test_virtlockd.aug
|
|
||||||
/src/test_virtlogd.aug
|
|
||||||
/src/util/virkeymaps.h
|
/src/util/virkeymaps.h
|
||||||
/src/virt-aa-helper
|
/src/virt-aa-helper
|
||||||
/src/virtlockd
|
|
||||||
/src/virtlogd
|
|
||||||
/tests/*.log
|
/tests/*.log
|
||||||
/tests/*.pid
|
/tests/*.pid
|
||||||
/tests/*.trs
|
/tests/*xml2*test
|
||||||
/tests/*test
|
|
||||||
/tests/commandhelper
|
/tests/commandhelper
|
||||||
/tests/qemucapsprobe
|
/tests/commandtest
|
||||||
!/tests/virsh-self-test
|
/tests/conftest
|
||||||
!/tests/virt-aa-helper-test
|
/tests/cputest
|
||||||
/tests/objectlocking
|
/tests/domainsnapshotxml2xmltest
|
||||||
/tests/objectlocking-files.txt
|
/tests/esxutilstest
|
||||||
/tests/objectlocking.cm[ix]
|
/tests/eventtest
|
||||||
|
/tests/hashtest
|
||||||
|
/tests/jsontest
|
||||||
|
/tests/networkxml2argvtest
|
||||||
|
/tests/nodeinfotest
|
||||||
|
/tests/nwfilterxml2xmltest
|
||||||
|
/tests/object-locking
|
||||||
|
/tests/object-locking-files.txt
|
||||||
|
/tests/object-locking.cm[ix]
|
||||||
|
/tests/openvzutilstest
|
||||||
|
/tests/qemuargv2xmltest
|
||||||
|
/tests/qemuhelptest
|
||||||
|
/tests/qemumonitortest
|
||||||
|
/tests/qemuxmlnstest
|
||||||
|
/tests/qparamtest
|
||||||
/tests/reconnect
|
/tests/reconnect
|
||||||
|
/tests/secaatest
|
||||||
|
/tests/seclabeltest
|
||||||
|
/tests/sexpr2xmltest
|
||||||
|
/tests/shunloadtest
|
||||||
|
/tests/sockettest
|
||||||
/tests/ssh
|
/tests/ssh
|
||||||
/tests/test_file_access.txt
|
/tests/statstest
|
||||||
/tests/test_conf
|
/tests/utiltest
|
||||||
/tools/libvirt-guests.sh
|
/tests/virauthconfigtest
|
||||||
/tools/virt-login-shell
|
/tests/virbuftest
|
||||||
|
/tests/virhashtest
|
||||||
|
/tests/virkeyfiletest
|
||||||
|
/tests/virnet*test
|
||||||
|
/tests/virshtest
|
||||||
|
/tests/virtimetest
|
||||||
|
/tests/viruritest
|
||||||
|
/tests/vmx2xmltest
|
||||||
|
/tests/xencapstest
|
||||||
|
/tests/xmconfigtest
|
||||||
|
/tools/*.[18]
|
||||||
|
/tools/libvirt-guests.init
|
||||||
|
/tools/libvirt-guests.service
|
||||||
/tools/virsh
|
/tools/virsh
|
||||||
/tools/virsh-*-edit.c
|
/tools/virsh-*-edit.c
|
||||||
/tools/virt-admin
|
|
||||||
/tools/virt-*-validate
|
/tools/virt-*-validate
|
||||||
/tools/virt-sanlock-cleanup
|
/tools/virt-sanlock-cleanup
|
||||||
/tools/wireshark/src/plugin.c
|
|
||||||
/tools/wireshark/src/libvirt
|
|
||||||
/update.log
|
/update.log
|
||||||
GPATH
|
|
||||||
GRTAGS
|
|
||||||
GTAGS
|
|
||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
TAGS
|
TAGS
|
||||||
coverage
|
coverage
|
||||||
cscope.files
|
cscope.files
|
||||||
cscope.in.out
|
|
||||||
cscope.out
|
cscope.out
|
||||||
cscope.po.out
|
|
||||||
results.log
|
results.log
|
||||||
stamp-h
|
stamp-h
|
||||||
stamp-h.in
|
stamp-h.in
|
||||||
stamp-h1
|
stamp-h1
|
||||||
tags
|
|
||||||
!/build-aux/*.pl
|
|
||||||
!/gnulib/lib/Makefile.am
|
!/gnulib/lib/Makefile.am
|
||||||
!/gnulib/tests/Makefile.am
|
!/gnulib/tests/Makefile.am
|
||||||
!/m4/virt-*.m4
|
!/m4/virt-*.m4
|
||||||
|
|||||||
1
.gnulib
1
.gnulib
Submodule .gnulib deleted from 68b6adebef
63
.mailmap
63
.mailmap
@@ -1,63 +0,0 @@
|
|||||||
# 'git shortlog --help' and look for mailmap for the format of each line
|
|
||||||
|
|
||||||
# Email consolidation:
|
|
||||||
# <Preferred address in AUTHORS> <other alias used by same author>
|
|
||||||
|
|
||||||
<bozzolan@gmail.com> <redshift@gmx.com>
|
|
||||||
<charles_duffy@messageone.com> <charles@dyfis.net>
|
|
||||||
<claudio.bley@gmail.com> <cbley@av-test.de>
|
|
||||||
<dfj@redhat.com> <dfj@dfj.bne.redhat.com>
|
|
||||||
<dpkshetty@gmail.com> <deepakcs@linux.vnet.ibm.com>
|
|
||||||
<dpkshetty@gmail.com> <deepakcs@redhat.com>
|
|
||||||
<eblake@redhat.com> <ebb9@byu.net>
|
|
||||||
<gdolley@arpnetworks.com> <gdolley@ucla.edu>
|
|
||||||
<gerhard.stenzel@de.ibm.com> <gstenzel@linux.vnet.ibm.com>
|
|
||||||
<jamie@canonical.com> <jamie@ubuntu.com>
|
|
||||||
<laine@redhat.com> <laine@laine.org>
|
|
||||||
<meyering@redhat.com> <jim@meyering.net>
|
|
||||||
<socketpair@gmail.com> <socketpair gmail com>
|
|
||||||
<soren@linux2go.dk> <soren@ubuntu.com>
|
|
||||||
<jfehlig@suse.com> <jfehlig@novell.com>
|
|
||||||
<jfehlig@suse.com> <jfehlig@linux-ypgk.site>
|
|
||||||
<jclift@redhat.com> <justin@salasaga.org>
|
|
||||||
<berrange@redhat.com> <dan@berrange.com>
|
|
||||||
<soren@linux2go.dk> <soren@canonical.com>
|
|
||||||
<cfergeau@redhat.com> <teuf@gnome.org>
|
|
||||||
<wency@cn.fujitsu.com> <wency cn fujitsu com>
|
|
||||||
<cardoe@cardoe.com> <cardoe@gentoo.org>
|
|
||||||
<fsimonce@redhat.com> <federico.simoncelli@gmail.com>
|
|
||||||
<marcandre.lureau@redhat.com> <marcandre.lureau@gmail.com>
|
|
||||||
<supriyak@linux.vnet.ibm.com> <supriyak@in.ibm.com>
|
|
||||||
<neil@aldur.co.uk> <neil@brightbox.co.uk>
|
|
||||||
<stefanb@us.ibm.com> <stefanb@linux.vnet.ibm.com>
|
|
||||||
<stefanb@us.ibm.com> <stefannb@linux.vnet.ibm.com>
|
|
||||||
<josh.durgin@inktank.com> <joshd@hq.newdream.net>
|
|
||||||
<josh.durgin@inktank.com> <josh.durgin@dreamhost.com>
|
|
||||||
<gerd@egidy.de> <lists@egidy.de>
|
|
||||||
<gerd@egidy.de> <gerd.von.egidy@intra2net.com>
|
|
||||||
<benoar@dolka.fr> <benjamin.cama@telecom-bretagne.eu>
|
|
||||||
<zhlcindy@linux.vnet.ibm.com> <zhlcindy@gmail.com>
|
|
||||||
<serge.hallyn@canonical.com> <serue@us.ibm.com>
|
|
||||||
<pritesh.kothari@sun.com> <Pritesh.Kothari@Sun.COM>
|
|
||||||
|
|
||||||
# Name consolidation:
|
|
||||||
# Preferred author spelling <preferred email>
|
|
||||||
Alex Jia <ajia@redhat.com>
|
|
||||||
Royce Lv <lvroyce@linux.vnet.ibm.com>
|
|
||||||
Daniel J Walsh <dwalsh@redhat.com>
|
|
||||||
Ján Tomko <jtomko@redhat.com>
|
|
||||||
Gerd von Egidy <gerd@egidy.de>
|
|
||||||
MATSUDA Daiki <matsudadik@intellilink.co.jp>
|
|
||||||
Tang Chen <tangchen@cn.fujitsu.com>
|
|
||||||
Peng Zhou <ailvpeng25@gmail.com>
|
|
||||||
Dirk Herrendoerfer <d.herrendoerfer@herrendoerfer.name>
|
|
||||||
Thibault VINCENT <thibault.vincent@smartjog.com>
|
|
||||||
Aurelien Rougemont <beorn@binaries.fr>
|
|
||||||
Serge E. Hallyn <serge.hallyn@canonical.com>
|
|
||||||
Henrik Persson E <henrik.e.persson@ericsson.com>
|
|
||||||
Philipp Hahn <hahn@univention.de>
|
|
||||||
Marco Bozzolan <bozzolan@gmail.com>
|
|
||||||
Marco Bozzolan <redshift@gmx.com>
|
|
||||||
Pritesh Kothari <pritesh.kothari@sun.com>
|
|
||||||
Wang Yufei (James) <james.wangyufei@huawei.com>
|
|
||||||
Deepak C Shetty <dpkshetty@gmail.com>
|
|
||||||
101
AUTHORS.in
101
AUTHORS.in
@@ -1,101 +0,0 @@
|
|||||||
libvirt Authors
|
|
||||||
===============
|
|
||||||
|
|
||||||
The libvirt project was initiated by:
|
|
||||||
|
|
||||||
Daniel Veillard <veillard@redhat.com> or <daniel@veillard.com>
|
|
||||||
|
|
||||||
The primary maintainers and people with commit access rights:
|
|
||||||
|
|
||||||
Alex Jia <ajia@redhat.com>
|
|
||||||
Andrea Bolognani <abologna@redhat.com>
|
|
||||||
Cédric Bosdonnat <cbosdonnat@suse.com>
|
|
||||||
Christophe Fergeau <cfergeau@redhat.com>
|
|
||||||
Claudio Bley <claudio.bley@gmail.com>
|
|
||||||
Cole Robinson <crobinso@redhat.com>
|
|
||||||
Daniel Berrange <berrange@redhat.com>
|
|
||||||
Daniel Veillard <veillard@redhat.com>
|
|
||||||
Doug Goldstein <cardoe@gentoo.org>
|
|
||||||
Eric Blake <eblake@redhat.com>
|
|
||||||
Erik Skultety <eskultet@redhat.com>
|
|
||||||
Gao Feng <gaofeng@cn.fujitsu.com>
|
|
||||||
Guido Günther <agx@sigxcpu.org>
|
|
||||||
Ján Tomko <jtomko@redhat.com>
|
|
||||||
Jim Fehlig <jfehlig@suse.com>
|
|
||||||
Jiří Denemark <jdenemar@redhat.com>
|
|
||||||
John Ferlan <jferlan@redhat.com>
|
|
||||||
Laine Stump <laine@redhat.com>
|
|
||||||
Mark McLoughlin <markmc@redhat.com>
|
|
||||||
Martin Kletzander <mkletzan@redhat.com>
|
|
||||||
Matthias Bolte <matthias.bolte@googlemail.com>
|
|
||||||
Maxim Nestratov <mnestratov@virtuozzo.com>
|
|
||||||
Michal Prívozník <mprivozn@redhat.com>
|
|
||||||
Pavel Hrdina <phrdina@redhat.com>
|
|
||||||
Peter Krempa <pkrempa@redhat.com>
|
|
||||||
Richard W.M. Jones <rjones@redhat.com>
|
|
||||||
Roman Bogorodskiy <bogorodskiy@gmail.com>
|
|
||||||
Stefan Berger <stefanb@us.ibm.com>
|
|
||||||
Wen Congyang <wency@cn.fujitsu.com>
|
|
||||||
|
|
||||||
Previous maintainers:
|
|
||||||
|
|
||||||
Anthony Liguori <aliguori@us.ibm.com>
|
|
||||||
Atsushi SAKAI <sakaia@jp.fujitsu.com>
|
|
||||||
Chris Lalancette <clalance@redhat.com>
|
|
||||||
Dan Smith <danms@us.ibm.com>
|
|
||||||
Dave Allan <dallan@redhat.com>
|
|
||||||
Dave Leskovec <dlesko@linux.vnet.ibm.com>
|
|
||||||
Dmitry Guryanov <dguryanov@parallels.com>
|
|
||||||
Guannan Ren <gren@redhat.com>
|
|
||||||
Jim Meyering <meyering@redhat.com>
|
|
||||||
John Levon <john.levon@sun.com>
|
|
||||||
Justin Clift <jclift@redhat.com>
|
|
||||||
Karel Zak <kzak@redhat.com>
|
|
||||||
Osier Yang <jyang@redhat.com>
|
|
||||||
|
|
||||||
Patches have also been contributed by:
|
|
||||||
|
|
||||||
Abel Míguez Rodríguez <amiguezr@pdi.ucm.es>
|
|
||||||
Amit Shah <amit.shah@redhat.com>
|
|
||||||
Andrew Puch <apuch@redhat.com>
|
|
||||||
Anton Protopopov <aspsk2@gmail.com>
|
|
||||||
Ben Guthro <ben.guthro@gmail.com>
|
|
||||||
Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
|
|
||||||
Daniel Hokka Zakrisson <daniel@hozac.com>
|
|
||||||
Dan Wendlandt <dan@nicira.com>
|
|
||||||
David Lively <dlively@virtualiron.com>
|
|
||||||
David Lutterkort <dlutter@redhat.com>
|
|
||||||
Evgeniy Sokolov <evg@openvz.org>
|
|
||||||
Hugh Brock <hbrock@redhat.com>
|
|
||||||
Itamar Heim <iheim@redhat.com>
|
|
||||||
James Morris <jmorris@namei.org>
|
|
||||||
Javier Fontan <jfontan@gmail.com>
|
|
||||||
Jeremy Katz <katzj@redhat.com>
|
|
||||||
Kaitlin Rupert <kaitlin@linux.vnet.ibm.com>
|
|
||||||
Kazuki Mizushima <mizushima.kazuk@jp.fujitsu.com>
|
|
||||||
Mads Chr. Olesen <shiyee@shiyee.dk>
|
|
||||||
Mark Johnson <johnson.nh@gmail.com>
|
|
||||||
Markus Armbruster <armbru@redhat.com>
|
|
||||||
Masayuki Sunou <fj1826dm@aa.jp.fujitsu.com>
|
|
||||||
Matthias Witte <witte@netzquadrat.de>
|
|
||||||
Michel Ponceau <michel.ponceau@bull.net>
|
|
||||||
Nobuhiro Itou <fj0873gn@aa.jp.fujitsu.com>
|
|
||||||
Pete Vetere <pvetere@redhat.com>
|
|
||||||
Philippe Berthault <philippe.berthault@Bull.net>
|
|
||||||
Saori Fukuta <fukuta.saori@jp.fujitsu.com>
|
|
||||||
Shigeki Sakamoto <fj0588di@aa.jp.fujitsu.com>
|
|
||||||
Shuveb Hussain <shuveb@binarykarma.com>
|
|
||||||
Stefan de Konink <dekonink@kinkrsoftware.nl>
|
|
||||||
Takahashi Tomohiro <takatom@jp.fujitsu.com>
|
|
||||||
Tatsuro Enokura <fj7716hz@aa.jp.fujitsu.com>
|
|
||||||
|
|
||||||
#authorslist#
|
|
||||||
|
|
||||||
[....send patches to get your name here....]
|
|
||||||
|
|
||||||
The libvirt logo was designed by Diana Fong
|
|
||||||
|
|
||||||
-- End
|
|
||||||
;; Local Variables:
|
|
||||||
;; coding: utf-8
|
|
||||||
;; End:
|
|
||||||
339
COPYING
339
COPYING
@@ -1,339 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
||||||
502
COPYING.LESSER
502
COPYING.LESSER
@@ -1,502 +0,0 @@
|
|||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 2.1, February 1999
|
|
||||||
|
|
||||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
[This is the first released version of the Lesser GPL. It also counts
|
|
||||||
as the successor of the GNU Library Public License, version 2, hence
|
|
||||||
the version number 2.1.]
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
Licenses are intended to guarantee your freedom to share and change
|
|
||||||
free software--to make sure the software is free for all its users.
|
|
||||||
|
|
||||||
This license, the Lesser General Public License, applies to some
|
|
||||||
specially designated software packages--typically libraries--of the
|
|
||||||
Free Software Foundation and other authors who decide to use it. You
|
|
||||||
can use it too, but we suggest you first think carefully about whether
|
|
||||||
this license or the ordinary General Public License is the better
|
|
||||||
strategy to use in any particular case, based on the explanations below.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom of use,
|
|
||||||
not price. Our General Public Licenses are designed to make sure that
|
|
||||||
you have the freedom to distribute copies of free software (and charge
|
|
||||||
for this service if you wish); that you receive source code or can get
|
|
||||||
it if you want it; that you can change the software and use pieces of
|
|
||||||
it in new free programs; and that you are informed that you can do
|
|
||||||
these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
distributors to deny you these rights or to ask you to surrender these
|
|
||||||
rights. These restrictions translate to certain responsibilities for
|
|
||||||
you if you distribute copies of the library or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of the library, whether gratis
|
|
||||||
or for a fee, you must give the recipients all the rights that we gave
|
|
||||||
you. You must make sure that they, too, receive or can get the source
|
|
||||||
code. If you link other code with the library, you must provide
|
|
||||||
complete object files to the recipients, so that they can relink them
|
|
||||||
with the library after making changes to the library and recompiling
|
|
||||||
it. And you must show them these terms so they know their rights.
|
|
||||||
|
|
||||||
We protect your rights with a two-step method: (1) we copyright the
|
|
||||||
library, and (2) we offer you this license, which gives you legal
|
|
||||||
permission to copy, distribute and/or modify the library.
|
|
||||||
|
|
||||||
To protect each distributor, we want to make it very clear that
|
|
||||||
there is no warranty for the free library. Also, if the library is
|
|
||||||
modified by someone else and passed on, the recipients should know
|
|
||||||
that what they have is not the original version, so that the original
|
|
||||||
author's reputation will not be affected by problems that might be
|
|
||||||
introduced by others.
|
|
||||||
|
|
||||||
Finally, software patents pose a constant threat to the existence of
|
|
||||||
any free program. We wish to make sure that a company cannot
|
|
||||||
effectively restrict the users of a free program by obtaining a
|
|
||||||
restrictive license from a patent holder. Therefore, we insist that
|
|
||||||
any patent license obtained for a version of the library must be
|
|
||||||
consistent with the full freedom of use specified in this license.
|
|
||||||
|
|
||||||
Most GNU software, including some libraries, is covered by the
|
|
||||||
ordinary GNU General Public License. This license, the GNU Lesser
|
|
||||||
General Public License, applies to certain designated libraries, and
|
|
||||||
is quite different from the ordinary General Public License. We use
|
|
||||||
this license for certain libraries in order to permit linking those
|
|
||||||
libraries into non-free programs.
|
|
||||||
|
|
||||||
When a program is linked with a library, whether statically or using
|
|
||||||
a shared library, the combination of the two is legally speaking a
|
|
||||||
combined work, a derivative of the original library. The ordinary
|
|
||||||
General Public License therefore permits such linking only if the
|
|
||||||
entire combination fits its criteria of freedom. The Lesser General
|
|
||||||
Public License permits more lax criteria for linking other code with
|
|
||||||
the library.
|
|
||||||
|
|
||||||
We call this license the "Lesser" General Public License because it
|
|
||||||
does Less to protect the user's freedom than the ordinary General
|
|
||||||
Public License. It also provides other free software developers Less
|
|
||||||
of an advantage over competing non-free programs. These disadvantages
|
|
||||||
are the reason we use the ordinary General Public License for many
|
|
||||||
libraries. However, the Lesser license provides advantages in certain
|
|
||||||
special circumstances.
|
|
||||||
|
|
||||||
For example, on rare occasions, there may be a special need to
|
|
||||||
encourage the widest possible use of a certain library, so that it becomes
|
|
||||||
a de-facto standard. To achieve this, non-free programs must be
|
|
||||||
allowed to use the library. A more frequent case is that a free
|
|
||||||
library does the same job as widely used non-free libraries. In this
|
|
||||||
case, there is little to gain by limiting the free library to free
|
|
||||||
software only, so we use the Lesser General Public License.
|
|
||||||
|
|
||||||
In other cases, permission to use a particular library in non-free
|
|
||||||
programs enables a greater number of people to use a large body of
|
|
||||||
free software. For example, permission to use the GNU C Library in
|
|
||||||
non-free programs enables many more people to use the whole GNU
|
|
||||||
operating system, as well as its variant, the GNU/Linux operating
|
|
||||||
system.
|
|
||||||
|
|
||||||
Although the Lesser General Public License is Less protective of the
|
|
||||||
users' freedom, it does ensure that the user of a program that is
|
|
||||||
linked with the Library has the freedom and the wherewithal to run
|
|
||||||
that program using a modified version of the Library.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow. Pay close attention to the difference between a
|
|
||||||
"work based on the library" and a "work that uses the library". The
|
|
||||||
former contains code derived from the library, whereas the latter must
|
|
||||||
be combined with the library in order to run.
|
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License Agreement applies to any software library or other
|
|
||||||
program which contains a notice placed by the copyright holder or
|
|
||||||
other authorized party saying it may be distributed under the terms of
|
|
||||||
this Lesser General Public License (also called "this License").
|
|
||||||
Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
A "library" means a collection of software functions and/or data
|
|
||||||
prepared so as to be conveniently linked with application programs
|
|
||||||
(which use some of those functions and data) to form executables.
|
|
||||||
|
|
||||||
The "Library", below, refers to any such software library or work
|
|
||||||
which has been distributed under these terms. A "work based on the
|
|
||||||
Library" means either the Library or any derivative work under
|
|
||||||
copyright law: that is to say, a work containing the Library or a
|
|
||||||
portion of it, either verbatim or with modifications and/or translated
|
|
||||||
straightforwardly into another language. (Hereinafter, translation is
|
|
||||||
included without limitation in the term "modification".)
|
|
||||||
|
|
||||||
"Source code" for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For a library, complete source code means
|
|
||||||
all the source code for all modules it contains, plus any associated
|
|
||||||
interface definition files, plus the scripts used to control compilation
|
|
||||||
and installation of the library.
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running a program using the Library is not restricted, and output from
|
|
||||||
such a program is covered only if its contents constitute a work based
|
|
||||||
on the Library (independent of the use of the Library in a tool for
|
|
||||||
writing it). Whether that is true depends on what the Library does
|
|
||||||
and what the program that uses the Library does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Library's
|
|
||||||
complete source code as you receive it, in any medium, provided that
|
|
||||||
you conspicuously and appropriately publish on each copy an
|
|
||||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
|
||||||
all the notices that refer to this License and to the absence of any
|
|
||||||
warranty; and distribute a copy of this License along with the
|
|
||||||
Library.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy,
|
|
||||||
and you may at your option offer warranty protection in exchange for a
|
|
||||||
fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Library or any portion
|
|
||||||
of it, thus forming a work based on the Library, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The modified work must itself be a software library.
|
|
||||||
|
|
||||||
b) You must cause the files modified to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
c) You must cause the whole of the work to be licensed at no
|
|
||||||
charge to all third parties under the terms of this License.
|
|
||||||
|
|
||||||
d) If a facility in the modified Library refers to a function or a
|
|
||||||
table of data to be supplied by an application program that uses
|
|
||||||
the facility, other than as an argument passed when the facility
|
|
||||||
is invoked, then you must make a good faith effort to ensure that,
|
|
||||||
in the event an application does not supply such function or
|
|
||||||
table, the facility still operates, and performs whatever part of
|
|
||||||
its purpose remains meaningful.
|
|
||||||
|
|
||||||
(For example, a function in a library to compute square roots has
|
|
||||||
a purpose that is entirely well-defined independent of the
|
|
||||||
application. Therefore, Subsection 2d requires that any
|
|
||||||
application-supplied function or table used by this function must
|
|
||||||
be optional: if the application does not supply it, the square
|
|
||||||
root function must still compute square roots.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Library,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Library, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote
|
|
||||||
it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Library.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Library
|
|
||||||
with the Library (or with a work based on the Library) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
|
||||||
License instead of this License to a given copy of the Library. To do
|
|
||||||
this, you must alter all the notices that refer to this License, so
|
|
||||||
that they refer to the ordinary GNU General Public License, version 2,
|
|
||||||
instead of to this License. (If a newer version than version 2 of the
|
|
||||||
ordinary GNU General Public License has appeared, then you can specify
|
|
||||||
that version instead if you wish.) Do not make any other change in
|
|
||||||
these notices.
|
|
||||||
|
|
||||||
Once this change is made in a given copy, it is irreversible for
|
|
||||||
that copy, so the ordinary GNU General Public License applies to all
|
|
||||||
subsequent copies and derivative works made from that copy.
|
|
||||||
|
|
||||||
This option is useful when you wish to copy part of the code of
|
|
||||||
the Library into a program that is not a library.
|
|
||||||
|
|
||||||
4. You may copy and distribute the Library (or a portion or
|
|
||||||
derivative of it, under Section 2) in object code or executable form
|
|
||||||
under the terms of Sections 1 and 2 above provided that you accompany
|
|
||||||
it with the complete corresponding machine-readable source code, which
|
|
||||||
must be distributed under the terms of Sections 1 and 2 above on a
|
|
||||||
medium customarily used for software interchange.
|
|
||||||
|
|
||||||
If distribution of object code is made by offering access to copy
|
|
||||||
from a designated place, then offering equivalent access to copy the
|
|
||||||
source code from the same place satisfies the requirement to
|
|
||||||
distribute the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
5. A program that contains no derivative of any portion of the
|
|
||||||
Library, but is designed to work with the Library by being compiled or
|
|
||||||
linked with it, is called a "work that uses the Library". Such a
|
|
||||||
work, in isolation, is not a derivative work of the Library, and
|
|
||||||
therefore falls outside the scope of this License.
|
|
||||||
|
|
||||||
However, linking a "work that uses the Library" with the Library
|
|
||||||
creates an executable that is a derivative of the Library (because it
|
|
||||||
contains portions of the Library), rather than a "work that uses the
|
|
||||||
library". The executable is therefore covered by this License.
|
|
||||||
Section 6 states terms for distribution of such executables.
|
|
||||||
|
|
||||||
When a "work that uses the Library" uses material from a header file
|
|
||||||
that is part of the Library, the object code for the work may be a
|
|
||||||
derivative work of the Library even though the source code is not.
|
|
||||||
Whether this is true is especially significant if the work can be
|
|
||||||
linked without the Library, or if the work is itself a library. The
|
|
||||||
threshold for this to be true is not precisely defined by law.
|
|
||||||
|
|
||||||
If such an object file uses only numerical parameters, data
|
|
||||||
structure layouts and accessors, and small macros and small inline
|
|
||||||
functions (ten lines or less in length), then the use of the object
|
|
||||||
file is unrestricted, regardless of whether it is legally a derivative
|
|
||||||
work. (Executables containing this object code plus portions of the
|
|
||||||
Library will still fall under Section 6.)
|
|
||||||
|
|
||||||
Otherwise, if the work is a derivative of the Library, you may
|
|
||||||
distribute the object code for the work under the terms of Section 6.
|
|
||||||
Any executables containing that work also fall under Section 6,
|
|
||||||
whether or not they are linked directly with the Library itself.
|
|
||||||
|
|
||||||
6. As an exception to the Sections above, you may also combine or
|
|
||||||
link a "work that uses the Library" with the Library to produce a
|
|
||||||
work containing portions of the Library, and distribute that work
|
|
||||||
under terms of your choice, provided that the terms permit
|
|
||||||
modification of the work for the customer's own use and reverse
|
|
||||||
engineering for debugging such modifications.
|
|
||||||
|
|
||||||
You must give prominent notice with each copy of the work that the
|
|
||||||
Library is used in it and that the Library and its use are covered by
|
|
||||||
this License. You must supply a copy of this License. If the work
|
|
||||||
during execution displays copyright notices, you must include the
|
|
||||||
copyright notice for the Library among them, as well as a reference
|
|
||||||
directing the user to the copy of this License. Also, you must do one
|
|
||||||
of these things:
|
|
||||||
|
|
||||||
a) Accompany the work with the complete corresponding
|
|
||||||
machine-readable source code for the Library including whatever
|
|
||||||
changes were used in the work (which must be distributed under
|
|
||||||
Sections 1 and 2 above); and, if the work is an executable linked
|
|
||||||
with the Library, with the complete machine-readable "work that
|
|
||||||
uses the Library", as object code and/or source code, so that the
|
|
||||||
user can modify the Library and then relink to produce a modified
|
|
||||||
executable containing the modified Library. (It is understood
|
|
||||||
that the user who changes the contents of definitions files in the
|
|
||||||
Library will not necessarily be able to recompile the application
|
|
||||||
to use the modified definitions.)
|
|
||||||
|
|
||||||
b) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (1) uses at run time a
|
|
||||||
copy of the library already present on the user's computer system,
|
|
||||||
rather than copying library functions into the executable, and (2)
|
|
||||||
will operate properly with a modified version of the library, if
|
|
||||||
the user installs one, as long as the modified version is
|
|
||||||
interface-compatible with the version that the work was made with.
|
|
||||||
|
|
||||||
c) Accompany the work with a written offer, valid for at
|
|
||||||
least three years, to give the same user the materials
|
|
||||||
specified in Subsection 6a, above, for a charge no more
|
|
||||||
than the cost of performing this distribution.
|
|
||||||
|
|
||||||
d) If distribution of the work is made by offering access to copy
|
|
||||||
from a designated place, offer equivalent access to copy the above
|
|
||||||
specified materials from the same place.
|
|
||||||
|
|
||||||
e) Verify that the user has already received a copy of these
|
|
||||||
materials or that you have already sent this user a copy.
|
|
||||||
|
|
||||||
For an executable, the required form of the "work that uses the
|
|
||||||
Library" must include any data and utility programs needed for
|
|
||||||
reproducing the executable from it. However, as a special exception,
|
|
||||||
the materials to be distributed need not include anything that is
|
|
||||||
normally distributed (in either source or binary form) with the major
|
|
||||||
components (compiler, kernel, and so on) of the operating system on
|
|
||||||
which the executable runs, unless that component itself accompanies
|
|
||||||
the executable.
|
|
||||||
|
|
||||||
It may happen that this requirement contradicts the license
|
|
||||||
restrictions of other proprietary libraries that do not normally
|
|
||||||
accompany the operating system. Such a contradiction means you cannot
|
|
||||||
use both them and the Library together in an executable that you
|
|
||||||
distribute.
|
|
||||||
|
|
||||||
7. You may place library facilities that are a work based on the
|
|
||||||
Library side-by-side in a single library together with other library
|
|
||||||
facilities not covered by this License, and distribute such a combined
|
|
||||||
library, provided that the separate distribution of the work based on
|
|
||||||
the Library and of the other library facilities is otherwise
|
|
||||||
permitted, and provided that you do these two things:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work
|
|
||||||
based on the Library, uncombined with any other library
|
|
||||||
facilities. This must be distributed under the terms of the
|
|
||||||
Sections above.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library of the fact
|
|
||||||
that part of it is a work based on the Library, and explaining
|
|
||||||
where to find the accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
8. You may not copy, modify, sublicense, link with, or distribute
|
|
||||||
the Library except as expressly provided under this License. Any
|
|
||||||
attempt otherwise to copy, modify, sublicense, link with, or
|
|
||||||
distribute the Library is void, and will automatically terminate your
|
|
||||||
rights under this License. However, parties who have received copies,
|
|
||||||
or rights, from you under this License will not have their licenses
|
|
||||||
terminated so long as such parties remain in full compliance.
|
|
||||||
|
|
||||||
9. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Library or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Library (or any work based on the
|
|
||||||
Library), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Library or works based on it.
|
|
||||||
|
|
||||||
10. Each time you redistribute the Library (or any work based on the
|
|
||||||
Library), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute, link with or modify the Library
|
|
||||||
subject to these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties with
|
|
||||||
this License.
|
|
||||||
|
|
||||||
11. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Library at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Library by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Library.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under any
|
|
||||||
particular circumstance, the balance of the section is intended to apply,
|
|
||||||
and the section as a whole is intended to apply in other circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
12. If the distribution and/or use of the Library is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Library under this License may add
|
|
||||||
an explicit geographical distribution limitation excluding those countries,
|
|
||||||
so that distribution is permitted only in or among countries not thus
|
|
||||||
excluded. In such case, this License incorporates the limitation as if
|
|
||||||
written in the body of this License.
|
|
||||||
|
|
||||||
13. The Free Software Foundation may publish revised and/or new
|
|
||||||
versions of the Lesser General Public License from time to time.
|
|
||||||
Such new versions will be similar in spirit to the present version,
|
|
||||||
but may differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Library
|
|
||||||
specifies a version number of this License which applies to it and
|
|
||||||
"any later version", you have the option of following the terms and
|
|
||||||
conditions either of that version or of any later version published by
|
|
||||||
the Free Software Foundation. If the Library does not specify a
|
|
||||||
license version number, you may choose any version ever published by
|
|
||||||
the Free Software Foundation.
|
|
||||||
|
|
||||||
14. If you wish to incorporate parts of the Library into other free
|
|
||||||
programs whose distribution conditions are incompatible with these,
|
|
||||||
write to the author to ask for permission. For software which is
|
|
||||||
copyrighted by the Free Software Foundation, write to the Free
|
|
||||||
Software Foundation; we sometimes make exceptions for this. Our
|
|
||||||
decision will be guided by the two goals of preserving the free status
|
|
||||||
of all derivatives of our free software and of promoting the sharing
|
|
||||||
and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
|
||||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
|
||||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
|
||||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
|
||||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
|
||||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
|
||||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
|
||||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
|
||||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
|
||||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
|
||||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
|
||||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
|
||||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
|
||||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
|
||||||
DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Libraries
|
|
||||||
|
|
||||||
If you develop a new library, and you want it to be of the greatest
|
|
||||||
possible use to the public, we recommend making it free software that
|
|
||||||
everyone can redistribute and change. You can do so by permitting
|
|
||||||
redistribution under these terms (or, alternatively, under the terms of the
|
|
||||||
ordinary General Public License).
|
|
||||||
|
|
||||||
To apply these terms, attach the following notices to the library. It is
|
|
||||||
safest to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least the
|
|
||||||
"copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the library's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
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, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
|
||||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1990
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
That's all there is to it!
|
|
||||||
16699
ChangeLog-old
16699
ChangeLog-old
File diff suppressed because it is too large
Load Diff
113
Makefile.am
113
Makefile.am
@@ -1,113 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
## 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/>.
|
|
||||||
|
|
||||||
LCOV = lcov
|
|
||||||
GENHTML = genhtml
|
|
||||||
|
|
||||||
SUBDIRS = . gnulib/lib include/libvirt src daemon tools docs gnulib/tests \
|
|
||||||
tests po examples
|
|
||||||
|
|
||||||
XZ_OPT ?= -v -T0
|
|
||||||
export XZ_OPT
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
config-post.h \
|
|
||||||
ChangeLog-old \
|
|
||||||
libvirt.spec libvirt.spec.in \
|
|
||||||
mingw-libvirt.spec.in \
|
|
||||||
libvirt.pc.in \
|
|
||||||
libvirt-qemu.pc.in \
|
|
||||||
libvirt-lxc.pc.in \
|
|
||||||
libvirt-admin.pc.in \
|
|
||||||
autobuild.sh \
|
|
||||||
Makefile.nonreentrant \
|
|
||||||
autogen.sh \
|
|
||||||
cfg.mk \
|
|
||||||
run.in \
|
|
||||||
AUTHORS.in
|
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
|
||||||
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc
|
|
||||||
|
|
||||||
NEWS: $(top_srcdir)/docs/news.xsl $(top_srcdir)/docs/news.html.in
|
|
||||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
|
||||||
$(XSLTPROC) --nonet $(top_srcdir)/docs/news.xsl \
|
|
||||||
$(top_srcdir)/docs/news.html.in \
|
|
||||||
| perl -0777 -pe 's/\n\n+$$/\n/' \
|
|
||||||
| perl -pe 's/[ \t]+$$//' \
|
|
||||||
> $@-t && mv $@-t $@ ; fi
|
|
||||||
|
|
||||||
$(top_srcdir)/HACKING: $(top_srcdir)/docs/hacking1.xsl \
|
|
||||||
$(top_srcdir)/docs/hacking2.xsl \
|
|
||||||
$(top_srcdir)/docs/wrapstring.xsl \
|
|
||||||
$(top_srcdir)/docs/hacking.html.in
|
|
||||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
|
||||||
$(XSLTPROC) --nonet $(top_srcdir)/docs/hacking1.xsl \
|
|
||||||
$(top_srcdir)/docs/hacking.html.in | \
|
|
||||||
$(XSLTPROC) --nonet $(top_srcdir)/docs/hacking2.xsl - \
|
|
||||||
| perl -0777 -pe 's/\n\n+$$/\n/' \
|
|
||||||
> $@-t && mv $@-t $@ ; fi;
|
|
||||||
|
|
||||||
rpm: clean
|
|
||||||
@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.xz)
|
|
||||||
|
|
||||||
check-local: all tests
|
|
||||||
|
|
||||||
check-access:
|
|
||||||
@($(MAKE) $(AM_MAKEFLAGS) -C tests check-access)
|
|
||||||
|
|
||||||
cov: clean-cov
|
|
||||||
$(MKDIR_P) $(top_builddir)/coverage
|
|
||||||
$(LCOV) -c -o $(top_builddir)/coverage/libvirt.info.tmp \
|
|
||||||
-d $(top_builddir)/src -d $(top_builddir)/daemon \
|
|
||||||
-d $(top_builddir)/tests
|
|
||||||
$(LCOV) -r $(top_builddir)/coverage/libvirt.info.tmp \
|
|
||||||
-o $(top_builddir)/coverage/libvirt.info
|
|
||||||
rm $(top_builddir)/coverage/libvirt.info.tmp
|
|
||||||
$(GENHTML) --show-details -t "libvirt" -o $(top_builddir)/coverage \
|
|
||||||
--legend $(top_builddir)/coverage/libvirt.info
|
|
||||||
|
|
||||||
clean-cov:
|
|
||||||
rm -rf $(top_builddir)/coverage
|
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = .git-module-status
|
|
||||||
|
|
||||||
dist-hook: gen-ChangeLog gen-AUTHORS
|
|
||||||
|
|
||||||
# Generate the ChangeLog file (with all entries since the switch to git)
|
|
||||||
# and insert it into the directory we're about to use to create a tarball.
|
|
||||||
gen_start_date = 2009-07-04
|
|
||||||
.PHONY: gen-ChangeLog
|
|
||||||
gen-ChangeLog:
|
|
||||||
$(AM_V_GEN)if test -d .git; then \
|
|
||||||
$(top_srcdir)/build-aux/gitlog-to-changelog \
|
|
||||||
--since=$(gen_start_date) > $(distdir)/cl-t; \
|
|
||||||
rm -f $(distdir)/ChangeLog; \
|
|
||||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
.PHONY: gen-AUTHORS
|
|
||||||
gen-AUTHORS:
|
|
||||||
$(AM_V_GEN)if test -d $(srcdir)/.git; then \
|
|
||||||
out="`cd $(srcdir) && git log --pretty=format:'%aN <%aE>' | sort -u`" && \
|
|
||||||
perl -p -e "s/#authorslist#// and print '$$out'" \
|
|
||||||
< $(srcdir)/AUTHORS.in > $(distdir)/AUTHORS-tmp && \
|
|
||||||
mv -f $(distdir)/AUTHORS-tmp $(distdir)/AUTHORS ; \
|
|
||||||
fi
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
## Copyright (C) 2009-2010, 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/>.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Generated by running the following on Fedora 9:
|
|
||||||
#
|
|
||||||
# nm -D --defined-only /lib/libc.so.6 \
|
|
||||||
# | grep '_r$' \
|
|
||||||
# | awk '{print $3}' \
|
|
||||||
# | grep -v __ \
|
|
||||||
# | grep -v qsort \ # Red herring since we don't need to pass extra args to qsort comparator
|
|
||||||
# | grep -v readdir \ # This is safe as long as each DIR * instance is only used by one thread
|
|
||||||
# | sort \
|
|
||||||
# | uniq \
|
|
||||||
# | sed -e 's/_r//'
|
|
||||||
#
|
|
||||||
# Also manually add in all inet_* functions some of which
|
|
||||||
# are not threadsafe and do not have _r variants. They are
|
|
||||||
# all deprecated in favour of getnameinfo/getaddrinfo
|
|
||||||
#
|
|
||||||
|
|
||||||
NON_REENTRANT =
|
|
||||||
NON_REENTRANT += asctime
|
|
||||||
NON_REENTRANT += ctime
|
|
||||||
NON_REENTRANT += drand48
|
|
||||||
NON_REENTRANT += ecvt
|
|
||||||
NON_REENTRANT += erand48
|
|
||||||
NON_REENTRANT += ether_aton
|
|
||||||
NON_REENTRANT += ether_ntoa
|
|
||||||
NON_REENTRANT += fcvt
|
|
||||||
NON_REENTRANT += fgetgrent
|
|
||||||
NON_REENTRANT += fgetpwent
|
|
||||||
NON_REENTRANT += fgetspent
|
|
||||||
NON_REENTRANT += getaliasbyname
|
|
||||||
NON_REENTRANT += getaliasent
|
|
||||||
NON_REENTRANT += getdate
|
|
||||||
NON_REENTRANT += getgrent
|
|
||||||
NON_REENTRANT += getgrgid
|
|
||||||
NON_REENTRANT += getgrnam
|
|
||||||
NON_REENTRANT += gethostbyaddr
|
|
||||||
NON_REENTRANT += gethostbyname2
|
|
||||||
NON_REENTRANT += gethostbyname
|
|
||||||
NON_REENTRANT += gethostent
|
|
||||||
NON_REENTRANT += getlogin
|
|
||||||
NON_REENTRANT += getmntent
|
|
||||||
NON_REENTRANT += getnetbyaddr
|
|
||||||
NON_REENTRANT += getnetbyname
|
|
||||||
NON_REENTRANT += getnetent
|
|
||||||
NON_REENTRANT += getnetgrent
|
|
||||||
NON_REENTRANT += getprotobyname
|
|
||||||
NON_REENTRANT += getprotobynumber
|
|
||||||
NON_REENTRANT += getprotoent
|
|
||||||
NON_REENTRANT += getpwent
|
|
||||||
NON_REENTRANT += getpwnam
|
|
||||||
NON_REENTRANT += getpwuid
|
|
||||||
NON_REENTRANT += getrpcbyname
|
|
||||||
NON_REENTRANT += getrpcbynumber
|
|
||||||
NON_REENTRANT += getrpcent
|
|
||||||
NON_REENTRANT += getservbyname
|
|
||||||
NON_REENTRANT += getservbyport
|
|
||||||
NON_REENTRANT += getservent
|
|
||||||
NON_REENTRANT += getspent
|
|
||||||
NON_REENTRANT += getspnam
|
|
||||||
NON_REENTRANT += getutent
|
|
||||||
NON_REENTRANT += getutid
|
|
||||||
NON_REENTRANT += getutline
|
|
||||||
NON_REENTRANT += gmtime
|
|
||||||
NON_REENTRANT += hcreate
|
|
||||||
NON_REENTRANT += hdestroy
|
|
||||||
NON_REENTRANT += hsearch
|
|
||||||
NON_REENTRANT += initstate
|
|
||||||
NON_REENTRANT += jrand48
|
|
||||||
NON_REENTRANT += lcong48
|
|
||||||
NON_REENTRANT += localtime
|
|
||||||
NON_REENTRANT += lrand48
|
|
||||||
NON_REENTRANT += mrand48
|
|
||||||
NON_REENTRANT += nrand48
|
|
||||||
NON_REENTRANT += ptsname
|
|
||||||
NON_REENTRANT += qecvt
|
|
||||||
NON_REENTRANT += qfcvt
|
|
||||||
NON_REENTRANT += random
|
|
||||||
NON_REENTRANT += rand
|
|
||||||
NON_REENTRANT += seed48
|
|
||||||
NON_REENTRANT += setstate
|
|
||||||
NON_REENTRANT += sgetspent
|
|
||||||
NON_REENTRANT += srand48
|
|
||||||
NON_REENTRANT += srandom
|
|
||||||
NON_REENTRANT += strerror
|
|
||||||
NON_REENTRANT += strtok
|
|
||||||
NON_REENTRANT += tmpnam
|
|
||||||
NON_REENTRANT += ttyname
|
|
||||||
NON_REENTRANT += inet_addr
|
|
||||||
NON_REENTRANT += inet_aton
|
|
||||||
NON_REENTRANT += inet_lnaof
|
|
||||||
NON_REENTRANT += inet_makeaddr
|
|
||||||
NON_REENTRANT += inet_netof
|
|
||||||
NON_REENTRANT += inet_network
|
|
||||||
NON_REENTRANT += inet_nsap_addr
|
|
||||||
NON_REENTRANT += inet_nsap_ntoa
|
|
||||||
NON_REENTRANT += inet_ntoa
|
|
||||||
NON_REENTRANT += inet_ntop
|
|
||||||
NON_REENTRANT += inet_pton
|
|
||||||
|
|
||||||
# Separate two nothings by space to get one space in a variable
|
|
||||||
space =
|
|
||||||
space +=
|
|
||||||
# The space needs to be in a variable otherwise it would be ignored.
|
|
||||||
# And there must be no spaces around the commas because they would
|
|
||||||
# not be ignored, logically.
|
|
||||||
NON_REENTRANT_RE=$(subst $(space),|,$(NON_REENTRANT))
|
|
||||||
14
README
14
README
@@ -1,13 +1 @@
|
|||||||
|
This branch is no longer maintained upstream.
|
||||||
LibVirt : simple API for virtualization
|
|
||||||
|
|
||||||
Libvirt is a C toolkit to interact with the virtualization capabilities
|
|
||||||
of recent versions of Linux (and other OSes). It is free software
|
|
||||||
available under the GNU Lesser General Public License. Virtualization of
|
|
||||||
the Linux Operating System means the ability to run multiple instances of
|
|
||||||
Operating Systems concurrently on a single hardware system where the basic
|
|
||||||
resources are driven by a Linux instance. The library aim at providing
|
|
||||||
long term stable C API initially for the Xen paravirtualization but
|
|
||||||
should be able to integrate other virtualization mechanisms if needed.
|
|
||||||
|
|
||||||
Daniel Veillard <veillard@redhat.com>
|
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
-*- outline -*-
|
|
||||||
|
|
||||||
These notes intend to help people working on the checked-out sources.
|
|
||||||
These requirements do not apply when building from a distribution tarball.
|
|
||||||
See also HACKING for more detailed libvirt contribution guidelines.
|
|
||||||
|
|
||||||
* Requirements
|
|
||||||
|
|
||||||
We've opted to keep only the highest-level sources in the GIT repository.
|
|
||||||
This eases our maintenance burden, (fewer merges etc.), but imposes more
|
|
||||||
requirements on anyone wishing to build from the just-checked-out sources.
|
|
||||||
Note the requirements to build the released archive are much less and
|
|
||||||
are just the requirements of the standard ./configure && make procedure.
|
|
||||||
Specific development tools and versions will be checked for and listed by
|
|
||||||
the bootstrap script.
|
|
||||||
|
|
||||||
Valgrind <http://valgrind.org/> is also highly recommended, if
|
|
||||||
Valgrind supports your architecture.
|
|
||||||
|
|
||||||
While building from a just-cloned source tree may require installing a
|
|
||||||
few prerequisites, later, a plain `git pull && make' should be sufficient.
|
|
||||||
|
|
||||||
* First GIT checkout
|
|
||||||
|
|
||||||
You can get a copy of the source repository like this:
|
|
||||||
|
|
||||||
$ git clone git://libvirt.org/libvirt
|
|
||||||
$ cd libvirt
|
|
||||||
|
|
||||||
As an optional step, if you already have a copy of the gnulib git
|
|
||||||
repository on your hard drive, then you can use it as a reference to
|
|
||||||
reduce download time and disk space requirements:
|
|
||||||
|
|
||||||
$ export GNULIB_SRCDIR=/path/to/gnulib
|
|
||||||
|
|
||||||
The next step is to get all required pieces from gnulib,
|
|
||||||
to run autoreconf, and to invoke ./configure:
|
|
||||||
|
|
||||||
$ ./autogen.sh
|
|
||||||
|
|
||||||
And there you are! Just
|
|
||||||
|
|
||||||
$ make
|
|
||||||
$ make check
|
|
||||||
|
|
||||||
At this point, there should be no difference between your local copy,
|
|
||||||
and the GIT master copy:
|
|
||||||
|
|
||||||
$ git diff
|
|
||||||
|
|
||||||
should output no difference.
|
|
||||||
|
|
||||||
Enjoy!
|
|
||||||
|
|
||||||
Local Variables:
|
|
||||||
indent-tabs-mode: nil
|
|
||||||
End:
|
|
||||||
22
TODO
22
TODO
@@ -1,22 +0,0 @@
|
|||||||
libvirt TODO list
|
|
||||||
=================
|
|
||||||
|
|
||||||
The TODO list changes frequently, so is maintained online
|
|
||||||
in the libvirt bugzilla
|
|
||||||
|
|
||||||
http://bugzilla.redhat.com/
|
|
||||||
|
|
||||||
Search against
|
|
||||||
|
|
||||||
Product: Virtualization Tools
|
|
||||||
Component: libvirt
|
|
||||||
Subject: RFE
|
|
||||||
|
|
||||||
Or browse dependent bugs under
|
|
||||||
|
|
||||||
https://bugzilla.redhat.com/show_bug.cgi?id=libvirtTodo
|
|
||||||
|
|
||||||
Summarized reports automatically generated from bugzilla
|
|
||||||
and provided online at
|
|
||||||
|
|
||||||
http://libvirt.org/todo.html
|
|
||||||
122
autobuild.sh
122
autobuild.sh
@@ -1,122 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
set -v
|
|
||||||
|
|
||||||
# Make things clean.
|
|
||||||
|
|
||||||
test -n "$1" && RESULTS=$1 || RESULTS=results.log
|
|
||||||
: ${AUTOBUILD_INSTALL_ROOT=$HOME/builder}
|
|
||||||
|
|
||||||
# If run under the autobuilder, we must use --nodeps with rpmbuild;
|
|
||||||
# but this can lead to odd error diagnosis for normal development.
|
|
||||||
nodeps=
|
|
||||||
if test "${AUTOBUILD_COUNTER+set}"; then
|
|
||||||
nodeps=--nodeps
|
|
||||||
fi
|
|
||||||
|
|
||||||
test -f Makefile && make -k distclean || :
|
|
||||||
rm -rf coverage
|
|
||||||
|
|
||||||
rm -rf build
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
|
|
||||||
# Run with options not normally exercised by the rpm build, for
|
|
||||||
# more complete code coverage.
|
|
||||||
../autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \
|
|
||||||
--enable-expensive-tests \
|
|
||||||
--enable-test-coverage \
|
|
||||||
--disable-nls \
|
|
||||||
--enable-werror \
|
|
||||||
--enable-static
|
|
||||||
|
|
||||||
# If the MAKEFLAGS envvar does not yet include a -j option,
|
|
||||||
# add -jN where N depends on the number of processors.
|
|
||||||
case $MAKEFLAGS in
|
|
||||||
*-j*) ;;
|
|
||||||
*) n=$(getconf _NPROCESSORS_ONLN 2> /dev/null)
|
|
||||||
test "$n" -gt 0 || n=1
|
|
||||||
n=$(expr $n + 1)
|
|
||||||
MAKEFLAGS="$MAKEFLAGS -j$n"
|
|
||||||
export MAKEFLAGS
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
# set -o pipefail is a bashism; this use of exec is the POSIX alternative
|
|
||||||
exec 3>&1
|
|
||||||
st=$(
|
|
||||||
exec 4>&1 >&3
|
|
||||||
{ make check syntax-check 2>&1 3>&- 4>&-; echo $? >&4; } | tee "$RESULTS"
|
|
||||||
)
|
|
||||||
exec 3>&-
|
|
||||||
test "$st" = 0
|
|
||||||
test -x /usr/bin/lcov && make cov
|
|
||||||
|
|
||||||
rm -f *.tar.xz
|
|
||||||
make dist
|
|
||||||
|
|
||||||
if test -n "$AUTOBUILD_COUNTER" ; then
|
|
||||||
EXTRA_RELEASE=".auto$AUTOBUILD_COUNTER"
|
|
||||||
else
|
|
||||||
NOW=`date +"%s"`
|
|
||||||
EXTRA_RELEASE=".$USER$NOW"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -f /usr/bin/rpmbuild ; then
|
|
||||||
rpmbuild $nodeps \
|
|
||||||
--define "extra_release $EXTRA_RELEASE" \
|
|
||||||
--define "_sourcedir `pwd`" \
|
|
||||||
-ba --clean libvirt.spec
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test mingw32 cross-compile
|
|
||||||
if test -x /usr/bin/i686-w64-mingw32-gcc ; then
|
|
||||||
make distclean
|
|
||||||
|
|
||||||
PKG_CONFIG_LIBDIR="/usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/i686-w64-mingw32/sys-root/mingw/share/pkgconfig" \
|
|
||||||
PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig" \
|
|
||||||
CC="i686-w64-mingw32-gcc" \
|
|
||||||
../configure \
|
|
||||||
--build=$(uname -m)-w64-linux \
|
|
||||||
--host=i686-w64-mingw32 \
|
|
||||||
--prefix="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw" \
|
|
||||||
--enable-expensive-tests \
|
|
||||||
--enable-werror
|
|
||||||
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test mingw64 cross-compile
|
|
||||||
if test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
|
|
||||||
make distclean
|
|
||||||
|
|
||||||
PKG_CONFIG_LIBDIR="/usr/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/x86_64-w64-mingw32/sys-root/mingw/share/pkgconfig" \
|
|
||||||
PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig" \
|
|
||||||
CC="x86_64-w64-mingw32-gcc" \
|
|
||||||
../configure \
|
|
||||||
--build=$(uname -m)-w64-linux \
|
|
||||||
--host=x86_64-w64-mingw32 \
|
|
||||||
--prefix="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw" \
|
|
||||||
--enable-expensive-tests \
|
|
||||||
--enable-werror
|
|
||||||
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if test -x /usr/bin/i686-w64-mingw32-gcc && test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
|
|
||||||
if test -f /usr/bin/rpmbuild ; then
|
|
||||||
rpmbuild $nodeps \
|
|
||||||
--define "extra_release $EXTRA_RELEASE" \
|
|
||||||
--define "_sourcedir `pwd`" \
|
|
||||||
-ba --clean mingw-libvirt.spec
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
117
autogen.sh
117
autogen.sh
@@ -1,117 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Run this to generate all the initial makefiles, etc.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
srcdir=`dirname "$0"`
|
|
||||||
test -z "$srcdir" && srcdir=.
|
|
||||||
|
|
||||||
THEDIR=`pwd`
|
|
||||||
cd "$srcdir"
|
|
||||||
|
|
||||||
test -f src/libvirt.c || {
|
|
||||||
echo "You must run this script in the top-level libvirt directory"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
EXTRA_ARGS=
|
|
||||||
no_git=
|
|
||||||
if test "x$1" = "x--no-git"; then
|
|
||||||
no_git=" $1"
|
|
||||||
shift
|
|
||||||
case "$1 $2" in
|
|
||||||
--gnulib-srcdir=*) no_git="$no_git $1"; shift ;;
|
|
||||||
--gnulib-srcdir\ *) no_git="$no_git $1=$2"; shift; shift;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test -z "$NOCONFIGURE" ; then
|
|
||||||
if test "x$1" = "x--system"; then
|
|
||||||
shift
|
|
||||||
prefix=/usr
|
|
||||||
libdir=$prefix/lib
|
|
||||||
sysconfdir=/etc
|
|
||||||
localstatedir=/var
|
|
||||||
if [ -d /usr/lib64 ]; then
|
|
||||||
libdir=$prefix/lib64
|
|
||||||
fi
|
|
||||||
EXTRA_ARGS="--prefix=$prefix --sysconfdir=$sysconfdir --localstatedir=$localstatedir --libdir=$libdir"
|
|
||||||
echo "Running ./configure with $EXTRA_ARGS $@"
|
|
||||||
else
|
|
||||||
if test -z "$*" && test ! -f "$THEDIR/config.status"; then
|
|
||||||
echo "I am going to run ./configure with no arguments - if you wish"
|
|
||||||
echo "to pass any to it, please specify them on the $0 command line."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Compute the hash we'll use to determine whether rerunning bootstrap
|
|
||||||
# is required. The first is just the SHA1 that selects a gnulib snapshot.
|
|
||||||
# The second ensures that whenever we change the set of gnulib modules used
|
|
||||||
# by this package, we rerun bootstrap to pull in the matching set of files.
|
|
||||||
# The third ensures that whenever we change the set of local gnulib diffs,
|
|
||||||
# we rerun bootstrap to pull in those diffs.
|
|
||||||
bootstrap_hash()
|
|
||||||
{
|
|
||||||
if test "$no_git"; then
|
|
||||||
echo no-git
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
git submodule status | sed 's/^[ +-]//;s/ .*//'
|
|
||||||
git hash-object bootstrap.conf
|
|
||||||
git ls-tree -d HEAD gnulib/local | awk '{print $3}'
|
|
||||||
}
|
|
||||||
|
|
||||||
# Ensure that whenever we pull in a gnulib update or otherwise change to a
|
|
||||||
# different version (i.e., when switching branches), we also rerun ./bootstrap.
|
|
||||||
# Also, running 'make rpm' tends to litter the po/ directory, and some people
|
|
||||||
# like to run 'git clean -x -f po' to fix it; but only ./bootstrap regenerates
|
|
||||||
# the required file po/Makevars.
|
|
||||||
# Only run bootstrap from a git checkout, never from a tarball.
|
|
||||||
if test -d .git || test -f .git; then
|
|
||||||
curr_status=.git-module-status t=
|
|
||||||
if test "$no_git"; then
|
|
||||||
t=no-git
|
|
||||||
elif test -d .gnulib; then
|
|
||||||
t=$(bootstrap_hash; git diff .gnulib)
|
|
||||||
fi
|
|
||||||
case $t:${CLEAN_SUBMODULE+set} in
|
|
||||||
*:set) ;;
|
|
||||||
*-dirty*)
|
|
||||||
echo "error: gnulib submodule is dirty, please investigate" 2>&1
|
|
||||||
echo "set env-var CLEAN_SUBMODULE to discard gnulib changes" 2>&1
|
|
||||||
exit 1 ;;
|
|
||||||
esac
|
|
||||||
# Keep this test in sync with cfg.mk:_update_required
|
|
||||||
if test "$t" = "$(cat $curr_status 2>/dev/null)" \
|
|
||||||
&& test -f "po/Makevars" && test -f AUTHORS; then
|
|
||||||
# good, it's up to date, all we need is autoreconf
|
|
||||||
autoreconf -if
|
|
||||||
else
|
|
||||||
if test -z "$no_git" && test ${CLEAN_SUBMODULE+set}; then
|
|
||||||
echo cleaning up submodules...
|
|
||||||
git submodule foreach 'git clean -dfqx && git reset --hard'
|
|
||||||
fi
|
|
||||||
echo running bootstrap$no_git...
|
|
||||||
./bootstrap$no_git --bootstrap-sync && bootstrap_hash > $curr_status \
|
|
||||||
|| { echo "Failed to bootstrap, please investigate."; exit 1; }
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
test -n "$NOCONFIGURE" && exit 0
|
|
||||||
|
|
||||||
cd "$THEDIR"
|
|
||||||
|
|
||||||
if test "x$OBJ_DIR" != x; then
|
|
||||||
mkdir -p "$OBJ_DIR"
|
|
||||||
cd "$OBJ_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$*" && test -z "$EXTRA_ARGS" && test -f config.status; then
|
|
||||||
./config.status --recheck
|
|
||||||
else
|
|
||||||
$srcdir/configure $EXTRA_ARGS "$@"
|
|
||||||
fi && {
|
|
||||||
echo
|
|
||||||
echo "Now type 'make' to compile libvirt."
|
|
||||||
}
|
|
||||||
239
bootstrap.conf
239
bootstrap.conf
@@ -1,239 +0,0 @@
|
|||||||
# Bootstrap configuration.
|
|
||||||
|
|
||||||
# Copyright (C) 2010-2014 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 program 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 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/>.
|
|
||||||
|
|
||||||
# gnulib modules used by this package.
|
|
||||||
gnulib_modules='
|
|
||||||
accept
|
|
||||||
areadlink
|
|
||||||
autobuild
|
|
||||||
base64
|
|
||||||
bind
|
|
||||||
bitrotate
|
|
||||||
byteswap
|
|
||||||
c-ctype
|
|
||||||
c-strcase
|
|
||||||
c-strcasestr
|
|
||||||
calloc-posix
|
|
||||||
canonicalize-lgpl
|
|
||||||
chown
|
|
||||||
clock-time
|
|
||||||
close
|
|
||||||
connect
|
|
||||||
configmake
|
|
||||||
count-leading-zeros
|
|
||||||
count-one-bits
|
|
||||||
crypto/md5
|
|
||||||
crypto/sha256
|
|
||||||
dirname-lgpl
|
|
||||||
environ
|
|
||||||
execinfo
|
|
||||||
fclose
|
|
||||||
fcntl
|
|
||||||
fcntl-h
|
|
||||||
fdatasync
|
|
||||||
ffs
|
|
||||||
ffsl
|
|
||||||
fnmatch
|
|
||||||
fsync
|
|
||||||
func
|
|
||||||
getaddrinfo
|
|
||||||
getcwd-lgpl
|
|
||||||
gethostname
|
|
||||||
getopt-posix
|
|
||||||
getpass
|
|
||||||
getpeername
|
|
||||||
getsockname
|
|
||||||
gettext-h
|
|
||||||
gettimeofday
|
|
||||||
gitlog-to-changelog
|
|
||||||
gnumakefile
|
|
||||||
ignore-value
|
|
||||||
inet_pton
|
|
||||||
intprops
|
|
||||||
ioctl
|
|
||||||
isatty
|
|
||||||
largefile
|
|
||||||
ldexp
|
|
||||||
listen
|
|
||||||
localeconv
|
|
||||||
maintainer-makefile
|
|
||||||
manywarnings
|
|
||||||
mgetgroups
|
|
||||||
mkdtemp
|
|
||||||
mkostemp
|
|
||||||
mkostemps
|
|
||||||
mktempd
|
|
||||||
net_if
|
|
||||||
netdb
|
|
||||||
nonblocking
|
|
||||||
openpty
|
|
||||||
passfd
|
|
||||||
perror
|
|
||||||
physmem
|
|
||||||
pipe-posix
|
|
||||||
pipe2
|
|
||||||
poll
|
|
||||||
posix-shell
|
|
||||||
pthread
|
|
||||||
pthread_sigmask
|
|
||||||
recv
|
|
||||||
regex
|
|
||||||
random_r
|
|
||||||
sched
|
|
||||||
secure_getenv
|
|
||||||
send
|
|
||||||
setenv
|
|
||||||
setsockopt
|
|
||||||
sigaction
|
|
||||||
sigpipe
|
|
||||||
snprintf
|
|
||||||
socket
|
|
||||||
stat-time
|
|
||||||
stdarg
|
|
||||||
stpcpy
|
|
||||||
strchrnul
|
|
||||||
strdup-posix
|
|
||||||
strndup
|
|
||||||
strerror
|
|
||||||
strerror_r-posix
|
|
||||||
strptime
|
|
||||||
strsep
|
|
||||||
strtok_r
|
|
||||||
sys_stat
|
|
||||||
sys_wait
|
|
||||||
termios
|
|
||||||
time_r
|
|
||||||
timegm
|
|
||||||
ttyname_r
|
|
||||||
uname
|
|
||||||
unsetenv
|
|
||||||
useless-if-before-free
|
|
||||||
usleep
|
|
||||||
vasprintf
|
|
||||||
verify
|
|
||||||
vc-list-files
|
|
||||||
vsnprintf
|
|
||||||
waitpid
|
|
||||||
warnings
|
|
||||||
'
|
|
||||||
|
|
||||||
# Additional xgettext options to use. Use "\\\newline" to break lines.
|
|
||||||
XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
|
|
||||||
--flag=virAsprintf:2:c-format\\\
|
|
||||||
--from-code=UTF-8\\\
|
|
||||||
'
|
|
||||||
|
|
||||||
# This is not a GNU package, so the default bug address is invalid,
|
|
||||||
# and the translation project is not in use.
|
|
||||||
MSGID_BUGS_ADDRESS=libvir-list@redhat.com
|
|
||||||
COPYRIGHT_HOLDER='Red Hat, Inc.'
|
|
||||||
SKIP_PO=true
|
|
||||||
|
|
||||||
# Enable copy-mode for MSYS/MinGW. MSYS' ln doesn't work well in the way
|
|
||||||
# bootstrap uses it with relative paths.
|
|
||||||
if test -n "$MSYSTEM"; then
|
|
||||||
copy=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]"
|
|
||||||
# appears in configure.ac, exclude some unnecessary files.
|
|
||||||
# Without grep's -E option (not portable enough, pre-configure),
|
|
||||||
# the following test is ugly. Also, this depends on the existence
|
|
||||||
# of configure.ac, not the obsolescent-named configure.in. But if
|
|
||||||
# you're using this infrastructure, you should care about such things.
|
|
||||||
|
|
||||||
gettext_external=0
|
|
||||||
grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
|
|
||||||
gettext_external=1
|
|
||||||
grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null &&
|
|
||||||
gettext_external=1
|
|
||||||
|
|
||||||
if test $gettext_external = 1; then
|
|
||||||
# Gettext supplies these files, but we don't need them since
|
|
||||||
# we don't have an intl subdirectory.
|
|
||||||
excluded_files='
|
|
||||||
m4/glibc2.m4
|
|
||||||
m4/intdiv0.m4
|
|
||||||
m4/lcmessage.m4
|
|
||||||
m4/uintmax_t.m4
|
|
||||||
m4/ulonglong.m4
|
|
||||||
m4/visibility.m4
|
|
||||||
'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Tell gnulib to:
|
|
||||||
# require LGPLv2+
|
|
||||||
# apply any local diffs in gnulib/local/ dir
|
|
||||||
# put *.m4 files in m4/ dir
|
|
||||||
# put *.[ch] files in new gnulib/lib/ dir
|
|
||||||
# import gnulib tests in new gnulib/tests/ dir
|
|
||||||
gnulib_name=libgnu
|
|
||||||
m4_base=m4
|
|
||||||
source_base=gnulib/lib
|
|
||||||
tests_base=gnulib/tests
|
|
||||||
gnulib_tool_option_extras="\
|
|
||||||
--lgpl=2\
|
|
||||||
--with-tests\
|
|
||||||
--makefile-name=gnulib.mk\
|
|
||||||
--avoid=pt_chown\
|
|
||||||
--avoid=lock-tests\
|
|
||||||
"
|
|
||||||
local_gl_dir=gnulib/local
|
|
||||||
|
|
||||||
# Build prerequisites
|
|
||||||
# Note that some of these programs are only required for 'make dist' to
|
|
||||||
# succeed from a fresh git checkout; not all of these programs are
|
|
||||||
# required to run 'make dist' on a tarball.
|
|
||||||
buildreq="\
|
|
||||||
autoconf 2.59
|
|
||||||
automake 1.9.6
|
|
||||||
autopoint -
|
|
||||||
gettext 0.17
|
|
||||||
git 1.5.5
|
|
||||||
gzip -
|
|
||||||
libtool -
|
|
||||||
patch -
|
|
||||||
perl 5.5
|
|
||||||
pkg-config -
|
|
||||||
rpcgen -
|
|
||||||
tar -
|
|
||||||
xmllint -
|
|
||||||
xsltproc -
|
|
||||||
"
|
|
||||||
|
|
||||||
# Automake requires that ChangeLog and AUTHORS exist.
|
|
||||||
touch AUTHORS ChangeLog || exit 1
|
|
||||||
|
|
||||||
# Override bootstrap's list - we don't use mdate-sh or texinfo.tex.
|
|
||||||
gnulib_extra_files="
|
|
||||||
build-aux/install-sh
|
|
||||||
build-aux/depcomp
|
|
||||||
build-aux/config.guess
|
|
||||||
build-aux/config.sub
|
|
||||||
doc/INSTALL
|
|
||||||
"
|
|
||||||
|
|
||||||
|
|
||||||
bootstrap_post_import_hook()
|
|
||||||
{
|
|
||||||
# Change paths in gnulib/tests/gnulib.mk from "../../.." to "../..",
|
|
||||||
# and make tests conditional by changing "TESTS" to "GNULIB_TESTS".
|
|
||||||
m=gnulib/tests/gnulib.mk
|
|
||||||
sed 's,\.\./\.\./\.\.,../..,g; s/^TESTS /GNULIB_TESTS /' $m > $m-t
|
|
||||||
mv -f $m-t $m
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
#
|
|
||||||
# augeas-gentest.pl: Generate an augeas test file, from an
|
|
||||||
# example config file + test file template
|
|
||||||
#
|
|
||||||
# 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/>.
|
|
||||||
#
|
|
||||||
# Authors:
|
|
||||||
# Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
die "syntax: $0 CONFIG TEMPLATE AUGTEST\n" unless @ARGV == 3;
|
|
||||||
|
|
||||||
my $config = shift @ARGV;
|
|
||||||
my $template = shift @ARGV;
|
|
||||||
my $augtest = shift @ARGV;
|
|
||||||
|
|
||||||
open AUGTEST, ">", $augtest or die "cannot create $augtest: $!";
|
|
||||||
|
|
||||||
$SIG{__DIE__} = sub {
|
|
||||||
unlink $augtest;
|
|
||||||
};
|
|
||||||
|
|
||||||
open CONFIG, "<", $config or die "cannot read $config: $!";
|
|
||||||
open TEMPLATE, "<", $template or die "cannot read $template: $!";
|
|
||||||
|
|
||||||
my $group = 0;
|
|
||||||
while (<TEMPLATE>) {
|
|
||||||
if (/::CONFIG::/) {
|
|
||||||
my $group = 0;
|
|
||||||
print AUGTEST " let conf = \"";
|
|
||||||
while (<CONFIG>) {
|
|
||||||
if (/^#\w/) {
|
|
||||||
s/^#//;
|
|
||||||
s/\"/\\\"/g;
|
|
||||||
print AUGTEST $_;
|
|
||||||
$group = /\[\s$/;
|
|
||||||
} elsif ($group) {
|
|
||||||
s/\"/\\\"/g;
|
|
||||||
if (/#\s*\]/) {
|
|
||||||
$group = 0;
|
|
||||||
}
|
|
||||||
if (/^#/) {
|
|
||||||
s/^#//;
|
|
||||||
print AUGTEST $_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print AUGTEST "\"\n";
|
|
||||||
} else {
|
|
||||||
print AUGTEST $_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close TEMPLATE;
|
|
||||||
close CONFIG;
|
|
||||||
close AUGTEST or die "cannot save $augtest: $!";
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
#
|
|
||||||
# check-spacing.pl: Report any usage of 'function (..args..)'
|
|
||||||
# Also check for other syntax issues, such as correct use of ';'
|
|
||||||
#
|
|
||||||
# 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/>.
|
|
||||||
#
|
|
||||||
# Authors:
|
|
||||||
# Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
my $ret = 0;
|
|
||||||
my $incomment = 0;
|
|
||||||
|
|
||||||
foreach my $file (@ARGV) {
|
|
||||||
# Per-file variables for multiline Curly Bracket (cb_) check
|
|
||||||
my $cb_linenum = 0;
|
|
||||||
my $cb_code = "";
|
|
||||||
my $cb_scolon = 0;
|
|
||||||
|
|
||||||
open FILE, $file;
|
|
||||||
|
|
||||||
while (defined (my $line = <FILE>)) {
|
|
||||||
my $data = $line;
|
|
||||||
# For temporary modifications
|
|
||||||
my $tmpdata;
|
|
||||||
|
|
||||||
# Kill any quoted , ; = or "
|
|
||||||
$data =~ s/'[";,=]'/'X'/g;
|
|
||||||
|
|
||||||
# Kill any quoted strings
|
|
||||||
$data =~ s,"(?:[^\\\"]|\\.)*","XXX",g;
|
|
||||||
|
|
||||||
# Kill any C++ style comments
|
|
||||||
$data =~ s,//.*$,//,;
|
|
||||||
|
|
||||||
next if $data =~ /^#/;
|
|
||||||
|
|
||||||
# Kill contents of multi-line comments
|
|
||||||
# and detect end of multi-line comments
|
|
||||||
if ($incomment) {
|
|
||||||
if ($data =~ m,\*/,) {
|
|
||||||
$incomment = 0;
|
|
||||||
$data =~ s,^.*\*/,*/,;
|
|
||||||
} else {
|
|
||||||
$data = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Kill single line comments, and detect
|
|
||||||
# start of multi-line comments
|
|
||||||
if ($data =~ m,/\*.*\*/,) {
|
|
||||||
$data =~ s,/\*.*\*/,/* */,;
|
|
||||||
} elsif ($data =~ m,/\*,) {
|
|
||||||
$incomment = 1;
|
|
||||||
$data =~ s,/\*.*,/*,;
|
|
||||||
}
|
|
||||||
|
|
||||||
# We need to match things like
|
|
||||||
#
|
|
||||||
# int foo (int bar, bool wizz);
|
|
||||||
# foo (bar, wizz);
|
|
||||||
#
|
|
||||||
# but not match things like:
|
|
||||||
#
|
|
||||||
# typedef int (*foo)(bar wizz)
|
|
||||||
#
|
|
||||||
# we can't do this (efficiently) without
|
|
||||||
# missing things like
|
|
||||||
#
|
|
||||||
# foo (*bar, wizz);
|
|
||||||
#
|
|
||||||
# We also don't want to spoil the $data so it can be used
|
|
||||||
# later on.
|
|
||||||
$tmpdata = $data;
|
|
||||||
while ($tmpdata =~ /(\w+)\s\((?!\*)/) {
|
|
||||||
my $kw = $1;
|
|
||||||
|
|
||||||
# Allow space after keywords only
|
|
||||||
if ($kw =~ /^(?:if|for|while|switch|return)$/) {
|
|
||||||
$tmpdata =~ s/(?:$kw\s\()/XXX(/;
|
|
||||||
} else {
|
|
||||||
print "Whitespace after non-keyword:\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Require whitespace immediately after keywords
|
|
||||||
if ($data =~ /\b(?:if|for|while|switch|return)\(/) {
|
|
||||||
print "No whitespace after keyword:\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Forbid whitespace between )( of a function typedef
|
|
||||||
if ($data =~ /\(\*\w+\)\s+\(/) {
|
|
||||||
print "Whitespace between ')' and '(':\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Forbid whitespace following ( or prior to )
|
|
||||||
# but allow whitespace before ) on a single line
|
|
||||||
# (optionally followed by a semicolon)
|
|
||||||
if (($data =~ /\s\)/ && not $data =~ /^\s+\);?$/) ||
|
|
||||||
$data =~ /\((?!$)\s/) {
|
|
||||||
print "Whitespace after '(' or before ')':\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Forbid whitespace before ";" or ",". Things like below are allowed:
|
|
||||||
#
|
|
||||||
# 1) The expression is empty for "for" loop. E.g.
|
|
||||||
# for (i = 0; ; i++)
|
|
||||||
#
|
|
||||||
# 2) An empty statement. E.g.
|
|
||||||
# while (write(statuswrite, &status, 1) == -1 &&
|
|
||||||
# errno == EINTR)
|
|
||||||
# ;
|
|
||||||
#
|
|
||||||
if ($data =~ /\s[;,]/) {
|
|
||||||
unless ($data =~ /\S; ; / ||
|
|
||||||
$data =~ /^\s+;/) {
|
|
||||||
print "Whitespace before semicolon or comma:\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Require EOL, macro line continuation, or whitespace after ";".
|
|
||||||
# Allow "for (;;)" as an exception.
|
|
||||||
if ($data =~ /;[^ \\\n;)]/) {
|
|
||||||
print "Invalid character after semicolon:\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Require EOL, space, or enum/struct end after comma.
|
|
||||||
if ($data =~ /,[^ \\\n)}]/) {
|
|
||||||
print "Invalid character after comma:\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Require spaces around assignment '=', compounds and '=='
|
|
||||||
if ($data =~ /[^ ]\b[!<>&|\-+*\/%\^=]?=/ ||
|
|
||||||
$data =~ /=[^= \\\n]/) {
|
|
||||||
print "Spacing around '=' or '==':\n";
|
|
||||||
print "$file:$.: $line";
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
# One line conditional statements with one line bodies should
|
|
||||||
# not use curly brackets.
|
|
||||||
if ($data =~ /^\s*(if|while|for)\b.*\{$/) {
|
|
||||||
$cb_linenum = $.;
|
|
||||||
$cb_code = $line;
|
|
||||||
$cb_scolon = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
# We need to check for exactly one semicolon inside the body,
|
|
||||||
# because empty statements (e.g. with comment only) are
|
|
||||||
# allowed
|
|
||||||
if ($cb_linenum == $. - 1 && $data =~ /^[^;]*;[^;]*$/) {
|
|
||||||
$cb_code .= $line;
|
|
||||||
$cb_scolon = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($data =~ /^\s*}\s*$/ &&
|
|
||||||
$cb_linenum == $. - 2 &&
|
|
||||||
$cb_scolon) {
|
|
||||||
|
|
||||||
print "Curly brackets around single-line body:\n";
|
|
||||||
print "$file:$cb_linenum-$.:\n$cb_code$line";
|
|
||||||
$ret = 1;
|
|
||||||
|
|
||||||
# There _should_ be no need to reset the values; but to
|
|
||||||
# keep my inner peace...
|
|
||||||
$cb_linenum = 0;
|
|
||||||
$cb_scolon = 0;
|
|
||||||
$cb_code = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close FILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit $ret;
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
my $file = " ";
|
|
||||||
my $ret = 0;
|
|
||||||
my %includes = ( );
|
|
||||||
my $lineno = 0;
|
|
||||||
|
|
||||||
while (<>) {
|
|
||||||
if (not $file eq $ARGV) {
|
|
||||||
%includes = ( );
|
|
||||||
$file = $ARGV;
|
|
||||||
$lineno = 0;
|
|
||||||
}
|
|
||||||
$lineno++;
|
|
||||||
if (/^# *include *[<"]([^>"]*\.h)[">]/) {
|
|
||||||
$includes{$1}++;
|
|
||||||
if ($includes{$1} == 2) {
|
|
||||||
$ret = 1;
|
|
||||||
print STDERR "$ARGV:$lineno: $_";
|
|
||||||
print STDERR "Do not include a header more than once per file\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit $ret;
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Since virt-login-shell will be setuid, we must do everything
|
|
||||||
* we can to avoid linking to other libraries. Many of them do
|
|
||||||
* unsafe things in functions marked __atttribute__((constructor)).
|
|
||||||
* The only way avoid to avoid such deps is to re-compile the
|
|
||||||
* functions with the code in question disabled, and for that we
|
|
||||||
* must override the main config.h rules. Hence this file :-(
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LIBVIRT_SETUID_RPC_CLIENT
|
|
||||||
# undef HAVE_LIBDEVMAPPER_H
|
|
||||||
# undef HAVE_LIBNL
|
|
||||||
# undef HAVE_LIBNL3
|
|
||||||
# undef HAVE_LIBSASL2
|
|
||||||
# undef WITH_CAPNG
|
|
||||||
# undef WITH_CURL
|
|
||||||
# undef WITH_DBUS
|
|
||||||
# undef WITH_DTRACE_PROBES
|
|
||||||
# undef WITH_GNUTLS
|
|
||||||
# undef WITH_GNUTLS_GCRYPT
|
|
||||||
# undef WITH_MACVTAP
|
|
||||||
# undef WITH_NUMACTL
|
|
||||||
# undef WITH_SASL
|
|
||||||
# undef WITH_SSH2
|
|
||||||
# undef WITH_SYSTEMD_DAEMON
|
|
||||||
# undef WITH_VIRTUALPORT
|
|
||||||
# undef WITH_YAJL
|
|
||||||
# undef WITH_YAJL2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* With the NSS module it's the same story as virt-login-shell. See the
|
|
||||||
* explanation above.
|
|
||||||
*/
|
|
||||||
#ifdef LIBVIRT_NSS
|
|
||||||
# undef HAVE_LIBDEVMAPPER_H
|
|
||||||
# undef HAVE_LIBNL
|
|
||||||
# undef HAVE_LIBNL3
|
|
||||||
# undef HAVE_LIBSASL2
|
|
||||||
# undef WITH_CAPNG
|
|
||||||
# undef WITH_CURL
|
|
||||||
# undef WITH_DTRACE_PROBES
|
|
||||||
# undef WITH_GNUTLS
|
|
||||||
# undef WITH_GNUTLS_GCRYPT
|
|
||||||
# undef WITH_MACVTAP
|
|
||||||
# undef WITH_NUMACTL
|
|
||||||
# undef WITH_SASL
|
|
||||||
# undef WITH_SSH2
|
|
||||||
# undef WITH_VIRTUALPORT
|
|
||||||
# undef WITH_SECDRIVER_SELINUX
|
|
||||||
# undef WITH_SECDRIVER_APPARMOR
|
|
||||||
# undef WITH_CAPNG
|
|
||||||
#endif /* LIBVIRT_NSS */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define __GNUC__ to a sane default if it isn't yet defined.
|
|
||||||
* This is done here so that it's included as early as possible; gnulib relies
|
|
||||||
* on this to be defined in features.h, which should be included from ctype.h.
|
|
||||||
* This doesn't happen on many non-glibc systems.
|
|
||||||
* When __GNUC__ is not defined, gnulib defines it to 0, which breaks things.
|
|
||||||
*/
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# ifndef __GNUC_PREREQ
|
|
||||||
# if defined __GNUC__ && defined __GNUC_MINOR__
|
|
||||||
# define __GNUC_PREREQ(maj, min) \
|
|
||||||
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
|
||||||
# else
|
|
||||||
# define __GNUC_PREREQ(maj, min) 0
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
2895
configure.ac
2895
configure.ac
File diff suppressed because it is too large
Load Diff
@@ -1,546 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
## Copyright (C) 2005-2015 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 = \
|
|
||||||
-I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib \
|
|
||||||
-I$(top_srcdir) \
|
|
||||||
-I$(top_builddir)/include -I$(top_srcdir)/include \
|
|
||||||
-I$(top_builddir)/src -I$(top_srcdir)/src \
|
|
||||||
-I$(top_srcdir)/src/util \
|
|
||||||
-I$(top_srcdir)/src/conf \
|
|
||||||
-I$(top_srcdir)/src/rpc \
|
|
||||||
-I$(top_srcdir)/src/remote \
|
|
||||||
-I$(top_srcdir)/src/admin \
|
|
||||||
-I$(top_srcdir)/src/access \
|
|
||||||
$(GETTEXT_CPPFLAGS)
|
|
||||||
|
|
||||||
CLEANFILES =
|
|
||||||
|
|
||||||
DAEMON_GENERATED = \
|
|
||||||
remote_dispatch.h \
|
|
||||||
lxc_dispatch.h \
|
|
||||||
qemu_dispatch.h \
|
|
||||||
admin_dispatch.h \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
DAEMON_SOURCES = \
|
|
||||||
libvirtd.c libvirtd.h \
|
|
||||||
remote.c remote.h \
|
|
||||||
stream.c stream.h \
|
|
||||||
$(DAEMON_GENERATED)
|
|
||||||
|
|
||||||
LIBVIRTD_CONF_SOURCES = libvirtd-config.c libvirtd-config.h
|
|
||||||
|
|
||||||
PODFILES = \
|
|
||||||
libvirtd.pod \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
MANINFILES = \
|
|
||||||
libvirtd.8.in \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
DISTCLEANFILES =
|
|
||||||
EXTRA_DIST = \
|
|
||||||
remote_dispatch.h \
|
|
||||||
lxc_dispatch.h \
|
|
||||||
qemu_dispatch.h \
|
|
||||||
admin_dispatch.h \
|
|
||||||
libvirtd.conf \
|
|
||||||
libvirtd.init.in \
|
|
||||||
libvirtd.upstart \
|
|
||||||
libvirtd.policy.in \
|
|
||||||
libvirt.rules \
|
|
||||||
libvirtd.sasl \
|
|
||||||
libvirtd.service.in \
|
|
||||||
libvirtd.sysconf \
|
|
||||||
libvirtd.sysctl \
|
|
||||||
libvirtd.aug \
|
|
||||||
libvirtd.logrotate.in \
|
|
||||||
libvirtd.qemu.logrotate.in \
|
|
||||||
libvirtd.lxc.logrotate.in \
|
|
||||||
libvirtd.libxl.logrotate.in \
|
|
||||||
libvirtd.uml.logrotate.in \
|
|
||||||
test_libvirtd.aug.in \
|
|
||||||
THREADS.txt \
|
|
||||||
$(PODFILES) \
|
|
||||||
$(MANINFILES) \
|
|
||||||
$(DAEMON_SOURCES) \
|
|
||||||
$(LIBVIRTD_CONF_SOURCES) \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
BUILT_SOURCES =
|
|
||||||
|
|
||||||
REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x
|
|
||||||
LXC_PROTOCOL = $(top_srcdir)/src/remote/lxc_protocol.x
|
|
||||||
QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x
|
|
||||||
ADMIN_PROTOCOL = $(top_srcdir)/src/admin/admin_protocol.x
|
|
||||||
|
|
||||||
remote_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
$(REMOTE_PROTOCOL)
|
|
||||||
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
--mode=server remote REMOTE $(REMOTE_PROTOCOL) \
|
|
||||||
> $(srcdir)/remote_dispatch.h
|
|
||||||
|
|
||||||
lxc_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
$(LXC_PROTOCOL)
|
|
||||||
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
--mode=server lxc LXC $(LXC_PROTOCOL) \
|
|
||||||
> $(srcdir)/lxc_dispatch.h
|
|
||||||
|
|
||||||
qemu_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
$(QEMU_PROTOCOL)
|
|
||||||
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
--mode=server qemu QEMU $(QEMU_PROTOCOL) \
|
|
||||||
> $(srcdir)/qemu_dispatch.h
|
|
||||||
|
|
||||||
admin_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
$(ADMIN_PROTOCOL)
|
|
||||||
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
|
||||||
--mode=server admin ADMIN $(ADMIN_PROTOCOL) \
|
|
||||||
> $(srcdir)/admin_dispatch.h
|
|
||||||
|
|
||||||
if WITH_LIBVIRTD
|
|
||||||
|
|
||||||
# Build a convenience library, for reuse in tests/libvirtdconftest
|
|
||||||
noinst_LTLIBRARIES = libvirtd_conf.la
|
|
||||||
libvirtd_conf_la_SOURCES = $(LIBVIRTD_CONF_SOURCES)
|
|
||||||
libvirtd_conf_la_CFLAGS = \
|
|
||||||
$(LIBXML_CFLAGS) \
|
|
||||||
$(XDR_CFLAGS) \
|
|
||||||
$(WARN_CFLAGS) $(PIE_CFLAGS) \
|
|
||||||
$(COVERAGE_CFLAGS) \
|
|
||||||
$(NULL)
|
|
||||||
libvirtd_conf_la_LDFLAGS = \
|
|
||||||
$(RELRO_LDFLAGS) \
|
|
||||||
$(PIE_LDFLAGS) \
|
|
||||||
$(COVERAGE_LDFLAGS) \
|
|
||||||
$(NO_INDIRECT_LDFLAGS) \
|
|
||||||
$(NULL)
|
|
||||||
libvirtd_conf_la_LIBADD = $(LIBXML_LIBS)
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES += libvirtd_admin.la
|
|
||||||
libvirtd_admin_la_SOURCES = \
|
|
||||||
admin.c admin.h admin_server.c admin_server.h
|
|
||||||
|
|
||||||
libvirtd_admin_la_CFLAGS = \
|
|
||||||
$(AM_CFLAGS) \
|
|
||||||
$(XDR_CFLAGS) \
|
|
||||||
$(PIE_CFLAGS) \
|
|
||||||
$(WARN_CFLAGS) \
|
|
||||||
$(LIBXML_CFLAGS) \
|
|
||||||
$(COVERAGE_CFLAGS) \
|
|
||||||
$(NULL)
|
|
||||||
libvirtd_admin_la_LDFLAGS = \
|
|
||||||
$(PIE_LDFLAGS) \
|
|
||||||
$(RELRO_LDFLAGS) \
|
|
||||||
$(COVERAGE_LDFLAGS) \
|
|
||||||
$(NO_INDIRECT_LDFLAGS) \
|
|
||||||
$(NULL)
|
|
||||||
libvirtd_admin_la_LIBADD = \
|
|
||||||
../src/libvirt-admin.la
|
|
||||||
|
|
||||||
man8_MANS = libvirtd.8
|
|
||||||
|
|
||||||
sbin_PROGRAMS = libvirtd
|
|
||||||
|
|
||||||
confdir = $(sysconfdir)/libvirt/
|
|
||||||
conf_DATA = libvirtd.conf
|
|
||||||
|
|
||||||
augeasdir = $(datadir)/augeas/lenses
|
|
||||||
augeas_DATA = libvirtd.aug
|
|
||||||
|
|
||||||
augeastestsdir = $(datadir)/augeas/lenses/tests
|
|
||||||
augeastests_DATA = test_libvirtd.aug
|
|
||||||
|
|
||||||
CLEANFILES += test_libvirtd.aug
|
|
||||||
|
|
||||||
libvirtd_SOURCES = $(DAEMON_SOURCES)
|
|
||||||
|
|
||||||
#-D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_POSIX_C_SOURCE=199506L
|
|
||||||
libvirtd_CFLAGS = \
|
|
||||||
$(LIBXML_CFLAGS) $(GNUTLS_CFLAGS) $(SASL_CFLAGS) \
|
|
||||||
$(XDR_CFLAGS) $(DBUS_CFLAGS) $(LIBNL_CFLAGS) \
|
|
||||||
$(WARN_CFLAGS) $(PIE_CFLAGS) \
|
|
||||||
$(COVERAGE_CFLAGS) \
|
|
||||||
-DQEMUD_PID_FILE="\"$(QEMUD_PID_FILE)\""
|
|
||||||
|
|
||||||
libvirtd_LDFLAGS = \
|
|
||||||
$(RELRO_LDFLAGS) \
|
|
||||||
$(PIE_LDFLAGS) \
|
|
||||||
$(COVERAGE_LDFLAGS) \
|
|
||||||
$(NO_INDIRECT_LDFLAGS) \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
libvirtd_LDADD = \
|
|
||||||
$(LIBXML_LIBS) \
|
|
||||||
$(GNUTLS_LIBS) \
|
|
||||||
$(SASL_LIBS) \
|
|
||||||
$(DBUS_LIBS) \
|
|
||||||
$(LIBNL_LIBS)
|
|
||||||
|
|
||||||
if WITH_DTRACE_PROBES
|
|
||||||
libvirtd_LDADD += ../src/libvirt_probes.lo
|
|
||||||
endif WITH_DTRACE_PROBES
|
|
||||||
|
|
||||||
libvirtd_LDADD += \
|
|
||||||
libvirtd_conf.la \
|
|
||||||
libvirtd_admin.la \
|
|
||||||
../src/libvirt-lxc.la \
|
|
||||||
../src/libvirt-qemu.la \
|
|
||||||
../src/libvirt_driver_remote.la \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
if ! WITH_DRIVER_MODULES
|
|
||||||
if WITH_QEMU
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_qemu.la
|
|
||||||
if WITH_DTRACE_PROBES
|
|
||||||
libvirtd_LDADD += ../src/libvirt_qemu_probes.lo
|
|
||||||
endif WITH_DTRACE_PROBES
|
|
||||||
endif WITH_QEMU
|
|
||||||
|
|
||||||
if WITH_LXC
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_lxc.la
|
|
||||||
endif WITH_LXC
|
|
||||||
|
|
||||||
if WITH_XEN
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_xen.la
|
|
||||||
endif WITH_XEN
|
|
||||||
|
|
||||||
if WITH_LIBXL
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_libxl.la
|
|
||||||
endif WITH_LIBXL
|
|
||||||
|
|
||||||
if WITH_UML
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_uml.la
|
|
||||||
endif WITH_UML
|
|
||||||
|
|
||||||
if WITH_VBOX
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_vbox.la
|
|
||||||
endif WITH_VBOX
|
|
||||||
|
|
||||||
if WITH_VZ
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_vz.la
|
|
||||||
endif WITH_VZ
|
|
||||||
|
|
||||||
if WITH_STORAGE
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_storage.la
|
|
||||||
endif WITH_STORAGE
|
|
||||||
|
|
||||||
if WITH_NETWORK
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_network.la
|
|
||||||
endif WITH_NETWORK
|
|
||||||
|
|
||||||
if WITH_INTERFACE
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_interface.la
|
|
||||||
endif WITH_INTERFACE
|
|
||||||
|
|
||||||
if WITH_NODE_DEVICES
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_nodedev.la
|
|
||||||
endif WITH_NODE_DEVICES
|
|
||||||
|
|
||||||
if WITH_SECRETS
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_secret.la
|
|
||||||
endif WITH_SECRETS
|
|
||||||
|
|
||||||
if WITH_NWFILTER
|
|
||||||
libvirtd_LDADD += ../src/libvirt_driver_nwfilter.la
|
|
||||||
endif WITH_NWFILTER
|
|
||||||
endif ! WITH_DRIVER_MODULES
|
|
||||||
|
|
||||||
libvirtd_LDADD += ../src/libvirt.la
|
|
||||||
|
|
||||||
if WITH_POLKIT
|
|
||||||
if WITH_POLKIT0
|
|
||||||
policydir = $(datadir)/PolicyKit/policy
|
|
||||||
policyauth = auth_admin_keep_session
|
|
||||||
else ! WITH_POLKIT0
|
|
||||||
policydir = $(datadir)/polkit-1/actions
|
|
||||||
policyauth = auth_admin_keep
|
|
||||||
rulesdir = $(datadir)/polkit-1/rules.d
|
|
||||||
rulesfile = libvirt.rules
|
|
||||||
endif ! WITH_POLKIT0
|
|
||||||
endif WITH_POLKIT
|
|
||||||
|
|
||||||
libvirtd.policy: libvirtd.policy.in $(top_builddir)/config.status
|
|
||||||
$(AM_V_GEN) sed \
|
|
||||||
-e 's|[@]authaction[@]|$(policyauth)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
BUILT_SOURCES += libvirtd.policy
|
|
||||||
|
|
||||||
install-data-local: install-init-redhat install-init-systemd \
|
|
||||||
install-init-upstart \
|
|
||||||
install-data-sasl install-data-polkit \
|
|
||||||
install-logrotate install-sysctl
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt \
|
|
||||||
$(DESTDIR)$(localstatedir)/run/libvirt \
|
|
||||||
$(DESTDIR)$(localstatedir)/lib/libvirt
|
|
||||||
|
|
||||||
uninstall-local:: uninstall-init-redhat uninstall-init-systemd \
|
|
||||||
uninstall-init-upstart \
|
|
||||||
uninstall-data-sasl uninstall-data-polkit \
|
|
||||||
uninstall-logrotate uninstall-sysctl
|
|
||||||
rmdir $(DESTDIR)$(localstatedir)/log/libvirt || :
|
|
||||||
rmdir $(DESTDIR)$(localstatedir)/run/libvirt || :
|
|
||||||
rmdir $(DESTDIR)$(localstatedir)/lib/libvirt || :
|
|
||||||
|
|
||||||
if WITH_POLKIT
|
|
||||||
install-data-polkit::
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(policydir)
|
|
||||||
$(INSTALL_DATA) libvirtd.policy $(DESTDIR)$(policydir)/org.libvirt.unix.policy
|
|
||||||
if ! WITH_POLKIT0
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(rulesdir)
|
|
||||||
$(INSTALL_DATA) $(srcdir)/$(rulesfile) $(DESTDIR)$(rulesdir)/50-libvirt.rules
|
|
||||||
endif ! WITH_POLKIT0
|
|
||||||
|
|
||||||
uninstall-data-polkit::
|
|
||||||
rm -f $(DESTDIR)$(policydir)/org.libvirt.unix.policy
|
|
||||||
rmdir $(DESTDIR)$(policydir) || :
|
|
||||||
if ! WITH_POLKIT0
|
|
||||||
rm -f $(DESTDIR)$(rulesdir)/50-libvirt.rules
|
|
||||||
rmdir $(DESTDIR)$(rulesdir) || :
|
|
||||||
endif ! WITH_POLKIT0
|
|
||||||
|
|
||||||
else ! WITH_POLKIT
|
|
||||||
install-data-polkit::
|
|
||||||
uninstall-data-polkit::
|
|
||||||
endif ! WITH_POLKIT
|
|
||||||
|
|
||||||
remote.c: $(DAEMON_GENERATED)
|
|
||||||
remote.h: $(DAEMON_GENERATED)
|
|
||||||
admin.c: $(DAEMON_GENERATED)
|
|
||||||
admin.h: $(DAEMON_GENERATED)
|
|
||||||
|
|
||||||
LOGROTATE_CONFS = libvirtd.qemu.logrotate libvirtd.lxc.logrotate \
|
|
||||||
libvirtd.libxl.logrotate libvirtd.uml.logrotate \
|
|
||||||
libvirtd.logrotate
|
|
||||||
|
|
||||||
BUILT_SOURCES += $(LOGROTATE_CONFS)
|
|
||||||
|
|
||||||
libvirtd.logrotate: libvirtd.logrotate.in
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
libvirtd.qemu.logrotate: libvirtd.qemu.logrotate.in
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
libvirtd.lxc.logrotate: libvirtd.lxc.logrotate.in
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
libvirtd.libxl.logrotate: libvirtd.libxl.logrotate.in
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
libvirtd.uml.logrotate: libvirtd.uml.logrotate.in
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
install-logrotate: $(LOGROTATE_CONFS)
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt/qemu/ \
|
|
||||||
$(DESTDIR)$(localstatedir)/log/libvirt/lxc/ \
|
|
||||||
$(DESTDIR)$(localstatedir)/log/libvirt/uml/ \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/
|
|
||||||
$(INSTALL_DATA) libvirtd.logrotate \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd
|
|
||||||
$(INSTALL_DATA) libvirtd.qemu.logrotate \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu
|
|
||||||
$(INSTALL_DATA) libvirtd.lxc.logrotate \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc
|
|
||||||
$(INSTALL_DATA) libvirtd.libxl.logrotate \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl
|
|
||||||
$(INSTALL_DATA) libvirtd.uml.logrotate \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
|
|
||||||
|
|
||||||
uninstall-logrotate:
|
|
||||||
rm -f $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl \
|
|
||||||
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
|
|
||||||
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/qemu || :
|
|
||||||
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/lxc || :
|
|
||||||
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/uml || :
|
|
||||||
rmdir $(DESTDIR)$(sysconfdir)/logrotate.d || :
|
|
||||||
|
|
||||||
install-sysconfig:
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysconfig
|
|
||||||
$(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \
|
|
||||||
$(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
|
|
||||||
uninstall-sysconfig:
|
|
||||||
rm -f $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
|
|
||||||
rmdir $(DESTDIR)$(sysconfdir)/sysconfig || :
|
|
||||||
|
|
||||||
if WITH_SYSCTL
|
|
||||||
# Use $(prefix)/lib rather than $(libdir), since man sysctl.d insists on
|
|
||||||
# /usr/lib/sysctl.d/ even when libdir is /usr/lib64
|
|
||||||
install-sysctl:
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(prefix)/lib/sysctl.d
|
|
||||||
$(INSTALL_DATA) $(srcdir)/libvirtd.sysctl \
|
|
||||||
$(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf
|
|
||||||
|
|
||||||
uninstall-sysctl:
|
|
||||||
rm -f $(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf
|
|
||||||
rmdir $(DESTDIR)$(prefix)/lib/sysctl.d || :
|
|
||||||
else ! WITH_SYSCTL
|
|
||||||
install-sysctl:
|
|
||||||
uninstall-sysctl:
|
|
||||||
endif ! WITH_SYSCTL
|
|
||||||
|
|
||||||
if LIBVIRT_INIT_SCRIPT_RED_HAT
|
|
||||||
|
|
||||||
BUILT_SOURCES += libvirtd.init
|
|
||||||
|
|
||||||
install-init-redhat: install-sysconfig libvirtd.init
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d
|
|
||||||
$(INSTALL_SCRIPT) libvirtd.init \
|
|
||||||
$(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
|
|
||||||
|
|
||||||
uninstall-init-redhat: uninstall-sysconfig
|
|
||||||
rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
|
|
||||||
rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || :
|
|
||||||
else ! LIBVIRT_INIT_SCRIPT_RED_HAT
|
|
||||||
install-init-redhat:
|
|
||||||
uninstall-init-redhat:
|
|
||||||
endif ! LIBVIRT_INIT_SCRIPT_RED_HAT
|
|
||||||
|
|
||||||
|
|
||||||
if LIBVIRT_INIT_SCRIPT_UPSTART
|
|
||||||
|
|
||||||
install-init-upstart: install-sysconfig
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/event.d
|
|
||||||
$(INSTALL_SCRIPT) libvirtd.upstart \
|
|
||||||
$(DESTDIR)$(sysconfdir)/event.d/libvirtd
|
|
||||||
|
|
||||||
uninstall-init-upstart: uninstall-sysconfig
|
|
||||||
rm -f $(DESTDIR)$(sysconfdir)/event.d/libvirtd
|
|
||||||
rmdir $(DESTDIR)$(sysconfdir)/event.d || :
|
|
||||||
else ! LIBVIRT_INIT_SCRIPT_UPSTART
|
|
||||||
install-init-upstart:
|
|
||||||
uninstall-init-upstart:
|
|
||||||
endif ! LIBVIRT_INIT_SCRIPT_UPSTART
|
|
||||||
|
|
||||||
|
|
||||||
if LIBVIRT_INIT_SCRIPT_SYSTEMD
|
|
||||||
|
|
||||||
SYSTEMD_UNIT_DIR = $(prefix)/lib/systemd/system
|
|
||||||
BUILT_SOURCES += libvirtd.service
|
|
||||||
|
|
||||||
install-init-systemd: install-sysconfig libvirtd.service
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
|
|
||||||
$(INSTALL_DATA) libvirtd.service \
|
|
||||||
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
|
||||||
|
|
||||||
uninstall-init-systemd: uninstall-sysconfig
|
|
||||||
rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
|
||||||
rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
|
|
||||||
else ! LIBVIRT_INIT_SCRIPT_SYSTEMD
|
|
||||||
install-init-systemd:
|
|
||||||
uninstall-init-systemd:
|
|
||||||
endif ! LIBVIRT_INIT_SCRIPT_SYSTEMD
|
|
||||||
|
|
||||||
libvirtd.init: libvirtd.init.in $(top_builddir)/config.status
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
-e 's|[@]sbindir[@]|$(sbindir)|g' \
|
|
||||||
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
chmod a+x $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
libvirtd.service: libvirtd.service.in $(top_builddir)/config.status
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
-e 's|[@]sbindir[@]|$(sbindir)|g' \
|
|
||||||
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
|
|
||||||
check-local: check-augeas
|
|
||||||
|
|
||||||
AUG_GENTEST = $(PERL) $(top_srcdir)/build-aux/augeas-gentest.pl
|
|
||||||
|
|
||||||
test_libvirtd.aug: test_libvirtd.aug.in $(srcdir)/libvirtd.conf
|
|
||||||
$(AM_V_GEN)$(AUG_GENTEST) $(srcdir)/libvirtd.conf $< $@
|
|
||||||
|
|
||||||
check-augeas: test_libvirtd.aug
|
|
||||||
$(AM_V_GEN)if test -x '$(AUGPARSE)'; then \
|
|
||||||
'$(AUGPARSE)' -I $(srcdir) test_libvirtd.aug; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# This must be added last, since functions it provides/replaces
|
|
||||||
# are used by nearly every other library.
|
|
||||||
libvirtd_LDADD += ../gnulib/lib/libgnu.la $(LIBSOCKET)
|
|
||||||
|
|
||||||
else ! WITH_LIBVIRTD
|
|
||||||
install-data-local: install-data-sasl
|
|
||||||
uninstall-local:: uninstall-data-sasl
|
|
||||||
endif ! WITH_LIBVIRTD
|
|
||||||
|
|
||||||
POD2MAN = pod2man -c "Virtualization Support" -r "$(PACKAGE)-$(VERSION)"
|
|
||||||
|
|
||||||
%.8.in: %.pod
|
|
||||||
$(AM_V_GEN)$(POD2MAN) --section=8 $< $@-t1 && \
|
|
||||||
if grep 'POD ERROR' $@-t1; then rm $@-t1; exit 1; fi && \
|
|
||||||
sed \
|
|
||||||
-e 's|SYSCONFDIR|\@sysconfdir\@|g' \
|
|
||||||
-e 's|LOCALSTATEDIR|\@localstatedir\@|g' \
|
|
||||||
< $@-t1 > $@-t2 && \
|
|
||||||
rm -f $@-t1 && \
|
|
||||||
mv $@-t2 $@
|
|
||||||
|
|
||||||
%.8: %.8.in $(top_srcdir)/configure.ac
|
|
||||||
$(AM_V_GEN)sed \
|
|
||||||
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
|
||||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
|
||||||
< $< > $@-t && \
|
|
||||||
mv $@-t $@
|
|
||||||
|
|
||||||
# This is needed for clients too, so can't wrap in
|
|
||||||
# the WITH_LIBVIRTD conditional
|
|
||||||
if WITH_SASL
|
|
||||||
install-data-sasl:
|
|
||||||
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sasl2/
|
|
||||||
$(INSTALL_DATA) $(srcdir)/libvirtd.sasl \
|
|
||||||
$(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
|
|
||||||
|
|
||||||
uninstall-data-sasl:
|
|
||||||
rm -f $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
|
|
||||||
rmdir $(DESTDIR)$(sysconfdir)/sasl2/ || :
|
|
||||||
else ! WITH_SASL
|
|
||||||
install-data-sasl:
|
|
||||||
uninstall-data-sasl:
|
|
||||||
endif ! WITH_SASL
|
|
||||||
|
|
||||||
|
|
||||||
CLEANFILES += $(BUILT_SOURCES) $(man8_MANS)
|
|
||||||
CLEANFILES += *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda
|
|
||||||
MAINTAINERCLEANFILES = $(MANINFILES) $(DAEMON_GENERATED)
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
|
|
||||||
Threading in the libvirtd daemon
|
|
||||||
================================
|
|
||||||
|
|
||||||
To allow efficient processing of RPC requests, the libvirtd daemon
|
|
||||||
makes use of threads.
|
|
||||||
|
|
||||||
- The process leader. This is the initial thread of control
|
|
||||||
when the daemon starts running. It is responsible for
|
|
||||||
initializing all the state, and starting the event loop.
|
|
||||||
Once that's all done, this thread does nothing except
|
|
||||||
wait for the event loop to quit, thus indicating an orderly
|
|
||||||
shutdown is required.
|
|
||||||
|
|
||||||
- The event loop. This thread runs the event loop, sitting
|
|
||||||
in poll() on all monitored file handles, and calculating
|
|
||||||
and dispatching any timers that may be registered. When
|
|
||||||
this thread quits, the entire daemon will shutdown.
|
|
||||||
|
|
||||||
- The workers. These 'n' threads all sit around waiting to
|
|
||||||
process incoming RPC requests. Since RPC requests may take
|
|
||||||
a long time to complete, with long idle periods, there will
|
|
||||||
be quite a few workers running.
|
|
||||||
|
|
||||||
The use of threads obviously requires locking to ensure safety when
|
|
||||||
accessing/changing data structures.
|
|
||||||
|
|
||||||
- the top level lock is on 'struct qemud_server'. This must be
|
|
||||||
held before acquiring any other lock
|
|
||||||
|
|
||||||
- Each 'struct qemud_client' object has a lock. The server lock
|
|
||||||
must be held before acquiring it. Once the client lock is acquired
|
|
||||||
the server lock can (optionally) be dropped.
|
|
||||||
|
|
||||||
- The event loop has its own self-contained lock. You can ignore
|
|
||||||
this as a caller of virEvent APIs.
|
|
||||||
|
|
||||||
|
|
||||||
The server lock is used in conjunction with a condition variable
|
|
||||||
to pass jobs from the event loop thread to the workers. The main
|
|
||||||
event loop thread handles I/O from the client socket, and once a
|
|
||||||
complete RPC message has been read off the wire (and optionally
|
|
||||||
decrypted), it will be placed on the 'dx' job queue for the
|
|
||||||
associated client object. The job condition will be signalled and
|
|
||||||
a worker will wakup and process it.
|
|
||||||
|
|
||||||
The worker thread must quickly drop its locks on the server and
|
|
||||||
client to allow the main event loop thread to continue running
|
|
||||||
with its other work. Critically important, is that now libvirt
|
|
||||||
API call will ever be made with the server or client locks held.
|
|
||||||
|
|
||||||
-- End
|
|
||||||
386
daemon/admin.c
386
daemon/admin.c
@@ -1,386 +0,0 @@
|
|||||||
/*
|
|
||||||
* admin.c: handlers for admin RPC method calls
|
|
||||||
*
|
|
||||||
* Copyright (C) 2014-2016 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/>.
|
|
||||||
*
|
|
||||||
* Author: Martin Kletzander <mkletzan@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
#include "libvirtd.h"
|
|
||||||
#include "libvirt_internal.h"
|
|
||||||
|
|
||||||
#include "admin_protocol.h"
|
|
||||||
#include "admin.h"
|
|
||||||
#include "admin_server.h"
|
|
||||||
#include "datatypes.h"
|
|
||||||
#include "viralloc.h"
|
|
||||||
#include "virerror.h"
|
|
||||||
#include "virlog.h"
|
|
||||||
#include "virnetdaemon.h"
|
|
||||||
#include "virnetserver.h"
|
|
||||||
#include "virstring.h"
|
|
||||||
#include "virthreadjob.h"
|
|
||||||
#include "virtypedparam.h"
|
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_ADMIN
|
|
||||||
|
|
||||||
VIR_LOG_INIT("daemon.admin");
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
remoteAdmClientFreeFunc(void *data)
|
|
||||||
{
|
|
||||||
struct daemonAdmClientPrivate *priv = data;
|
|
||||||
|
|
||||||
virMutexDestroy(&priv->lock);
|
|
||||||
virObjectUnref(priv->dmn);
|
|
||||||
VIR_FREE(priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
|
||||||
void *opaque)
|
|
||||||
{
|
|
||||||
struct daemonAdmClientPrivate *priv;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(priv) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (virMutexInit(&priv->lock) < 0) {
|
|
||||||
VIR_FREE(priv);
|
|
||||||
virReportSystemError(errno, "%s", _("unable to init mutex"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We don't necessarily need to ref this object right now as there
|
|
||||||
* must be one ref being held throughout the life of the daemon,
|
|
||||||
* but let's just be safe for future.
|
|
||||||
*/
|
|
||||||
priv->dmn = virObjectRef(opaque);
|
|
||||||
|
|
||||||
return priv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Helpers */
|
|
||||||
|
|
||||||
static virNetServerPtr
|
|
||||||
get_nonnull_server(virNetDaemonPtr dmn, admin_nonnull_server srv)
|
|
||||||
{
|
|
||||||
return virNetDaemonGetServer(dmn, srv.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
make_nonnull_server(admin_nonnull_server *srv_dst,
|
|
||||||
virNetServerPtr srv_src)
|
|
||||||
{
|
|
||||||
ignore_value(VIR_STRDUP_QUIET(srv_dst->name, virNetServerGetName(srv_src)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static virNetServerClientPtr
|
|
||||||
get_nonnull_client(virNetServerPtr srv, admin_nonnull_client clnt)
|
|
||||||
{
|
|
||||||
return virNetServerGetClient(srv, clnt.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
make_nonnull_client(admin_nonnull_client *clt_dst,
|
|
||||||
virNetServerClientPtr clt_src)
|
|
||||||
{
|
|
||||||
clt_dst->id = virNetServerClientGetID(clt_src);
|
|
||||||
clt_dst->timestamp = virNetServerClientGetTimestamp(clt_src);
|
|
||||||
clt_dst->transport = virNetServerClientGetTransport(clt_src);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Functions */
|
|
||||||
static int
|
|
||||||
adminDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|
||||||
virNetServerClientPtr client,
|
|
||||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessageErrorPtr rerr,
|
|
||||||
struct admin_connect_open_args *args)
|
|
||||||
{
|
|
||||||
unsigned int flags;
|
|
||||||
struct daemonAdmClientPrivate *priv =
|
|
||||||
virNetServerClientGetPrivateData(client);
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
VIR_DEBUG("priv=%p dmn=%p", priv, priv->dmn);
|
|
||||||
virMutexLock(&priv->lock);
|
|
||||||
|
|
||||||
flags = args->flags;
|
|
||||||
virCheckFlagsGoto(0, cleanup);
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
cleanup:
|
|
||||||
if (ret < 0)
|
|
||||||
virNetMessageSaveError(rerr);
|
|
||||||
virMutexUnlock(&priv->lock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|
||||||
virNetServerClientPtr client,
|
|
||||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
virNetServerClientDelayedClose(client);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
|
|
||||||
unsigned long long *libVer)
|
|
||||||
{
|
|
||||||
if (libVer)
|
|
||||||
*libVer = LIBVIR_VERSION_NUMBER;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
adminDispatchServerGetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|
||||||
virNetServerClientPtr client,
|
|
||||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessageErrorPtr rerr,
|
|
||||||
struct admin_server_get_threadpool_parameters_args *args,
|
|
||||||
struct admin_server_get_threadpool_parameters_ret *ret)
|
|
||||||
{
|
|
||||||
int rv = -1;
|
|
||||||
virNetServerPtr srv = NULL;
|
|
||||||
virTypedParameterPtr params = NULL;
|
|
||||||
int nparams = 0;
|
|
||||||
struct daemonAdmClientPrivate *priv =
|
|
||||||
virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (adminServerGetThreadPoolParameters(srv, ¶ms, &nparams,
|
|
||||||
args->flags) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Number of threadpool parameters %d exceeds max "
|
|
||||||
"allowed limit: %d"), nparams,
|
|
||||||
ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virTypedParamsSerialize(params, nparams,
|
|
||||||
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
|
||||||
&ret->params.params_len, 0) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
rv = 0;
|
|
||||||
cleanup:
|
|
||||||
if (rv < 0)
|
|
||||||
virNetMessageSaveError(rerr);
|
|
||||||
|
|
||||||
virTypedParamsFree(params, nparams);
|
|
||||||
virObjectUnref(srv);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
adminDispatchServerSetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|
||||||
virNetServerClientPtr client,
|
|
||||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessageErrorPtr rerr,
|
|
||||||
struct admin_server_set_threadpool_parameters_args *args)
|
|
||||||
{
|
|
||||||
int rv = -1;
|
|
||||||
virNetServerPtr srv = NULL;
|
|
||||||
virTypedParameterPtr params = NULL;
|
|
||||||
int nparams = 0;
|
|
||||||
struct daemonAdmClientPrivate *priv =
|
|
||||||
virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
|
|
||||||
virReportError(VIR_ERR_NO_SERVER,
|
|
||||||
_("no server with matching name '%s' found"),
|
|
||||||
args->srv.name);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
|
|
||||||
args->params.params_len,
|
|
||||||
ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX,
|
|
||||||
¶ms,
|
|
||||||
&nparams) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
|
|
||||||
if (adminServerSetThreadPoolParameters(srv, params,
|
|
||||||
nparams, args->flags) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
rv = 0;
|
|
||||||
cleanup:
|
|
||||||
if (rv < 0)
|
|
||||||
virNetMessageSaveError(rerr);
|
|
||||||
|
|
||||||
virTypedParamsFree(params, nparams);
|
|
||||||
virObjectUnref(srv);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
adminDispatchClientGetInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|
||||||
virNetServerClientPtr client,
|
|
||||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessageErrorPtr rerr,
|
|
||||||
struct admin_client_get_info_args *args,
|
|
||||||
struct admin_client_get_info_ret *ret)
|
|
||||||
{
|
|
||||||
int rv = -1;
|
|
||||||
virNetServerPtr srv = NULL;
|
|
||||||
virNetServerClientPtr clnt = NULL;
|
|
||||||
virTypedParameterPtr params = NULL;
|
|
||||||
int nparams = 0;
|
|
||||||
struct daemonAdmClientPrivate *priv =
|
|
||||||
virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->clnt.srv.name))) {
|
|
||||||
virReportError(VIR_ERR_NO_SERVER,
|
|
||||||
_("no server with matching name '%s' found"),
|
|
||||||
args->clnt.srv.name);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(clnt = virNetServerGetClient(srv, args->clnt.id))) {
|
|
||||||
virReportError(VIR_ERR_NO_CLIENT,
|
|
||||||
_("no client with matching id '%llu' found"),
|
|
||||||
(unsigned long long) args->clnt.id);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adminClientGetInfo(clnt, ¶ms, &nparams, args->flags) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (nparams > ADMIN_CLIENT_INFO_PARAMETERS_MAX) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Number of client info parameters %d exceeds max "
|
|
||||||
"allowed limit: %d"), nparams,
|
|
||||||
ADMIN_CLIENT_INFO_PARAMETERS_MAX);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virTypedParamsSerialize(params, nparams,
|
|
||||||
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
|
||||||
&ret->params.params_len,
|
|
||||||
VIR_TYPED_PARAM_STRING_OKAY) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
rv = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (rv < 0)
|
|
||||||
virNetMessageSaveError(rerr);
|
|
||||||
|
|
||||||
virTypedParamsFree(params, nparams);
|
|
||||||
virObjectUnref(clnt);
|
|
||||||
virObjectUnref(srv);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
adminDispatchServerGetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|
||||||
virNetServerClientPtr client,
|
|
||||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
|
|
||||||
admin_server_get_client_limits_args *args,
|
|
||||||
admin_server_get_client_limits_ret *ret)
|
|
||||||
{
|
|
||||||
int rv = -1;
|
|
||||||
virNetServerPtr srv = NULL;
|
|
||||||
virTypedParameterPtr params = NULL;
|
|
||||||
int nparams = 0;
|
|
||||||
struct daemonAdmClientPrivate *priv =
|
|
||||||
virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (adminServerGetClientLimits(srv, ¶ms, &nparams, args->flags) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (nparams > ADMIN_SERVER_CLIENT_LIMITS_MAX) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Number of client processing parameters %d exceeds "
|
|
||||||
"max allowed limit: %d"), nparams,
|
|
||||||
ADMIN_SERVER_CLIENT_LIMITS_MAX);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virTypedParamsSerialize(params, nparams,
|
|
||||||
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
|
||||||
&ret->params.params_len, 0) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
rv = 0;
|
|
||||||
cleanup:
|
|
||||||
if (rv < 0)
|
|
||||||
virNetMessageSaveError(rerr);
|
|
||||||
|
|
||||||
virTypedParamsFree(params, nparams);
|
|
||||||
virObjectUnref(srv);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
adminDispatchServerSetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
|
|
||||||
virNetServerClientPtr client,
|
|
||||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
|
|
||||||
admin_server_set_client_limits_args *args)
|
|
||||||
{
|
|
||||||
int rv = -1;
|
|
||||||
virNetServerPtr srv = NULL;
|
|
||||||
virTypedParameterPtr params = NULL;
|
|
||||||
int nparams = 0;
|
|
||||||
struct daemonAdmClientPrivate *priv =
|
|
||||||
virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
|
|
||||||
virReportError(VIR_ERR_NO_SERVER,
|
|
||||||
_("no server with matching name '%s' found"),
|
|
||||||
args->srv.name);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
|
|
||||||
args->params.params_len,
|
|
||||||
ADMIN_SERVER_CLIENT_LIMITS_MAX, ¶ms, &nparams) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (adminServerSetClientLimits(srv, params, nparams, args->flags) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
rv = 0;
|
|
||||||
cleanup:
|
|
||||||
if (rv < 0)
|
|
||||||
virNetMessageSaveError(rerr);
|
|
||||||
virTypedParamsFree(params, nparams);
|
|
||||||
virObjectUnref(srv);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
#include "admin_dispatch.h"
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* admin.h: handlers for admin RPC method calls
|
|
||||||
*
|
|
||||||
* Copyright (C) 2014-2016 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/>.
|
|
||||||
*
|
|
||||||
* Author: Martin Kletzander <mkletzan@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LIBVIRTD_ADMIN_H__
|
|
||||||
# define __LIBVIRTD_ADMIN_H__
|
|
||||||
|
|
||||||
# include "rpc/virnetserverprogram.h"
|
|
||||||
# include "rpc/virnetserverclient.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern virNetServerProgramProc adminProcs[];
|
|
||||||
extern size_t adminNProcs;
|
|
||||||
|
|
||||||
void remoteAdmClientFreeFunc(void *data);
|
|
||||||
void *remoteAdmClientInitHook(virNetServerClientPtr client, void *opaque);
|
|
||||||
|
|
||||||
#endif /* __ADMIN_REMOTE_H__ */
|
|
||||||
@@ -1,390 +0,0 @@
|
|||||||
/*
|
|
||||||
* admin_server.c: admin methods to manage daemons and clients
|
|
||||||
*
|
|
||||||
* Copyright (C) 2016 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/>.
|
|
||||||
*
|
|
||||||
* Authors: Erik Skultety <eskultet@redhat.com>
|
|
||||||
* Martin Kletzander <mkletzan@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "admin_server.h"
|
|
||||||
#include "datatypes.h"
|
|
||||||
#include "viralloc.h"
|
|
||||||
#include "virerror.h"
|
|
||||||
#include "viridentity.h"
|
|
||||||
#include "virlog.h"
|
|
||||||
#include "virnetdaemon.h"
|
|
||||||
#include "virnetserver.h"
|
|
||||||
#include "virstring.h"
|
|
||||||
#include "virthreadpool.h"
|
|
||||||
#include "virtypedparam.h"
|
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_ADMIN
|
|
||||||
|
|
||||||
VIR_LOG_INIT("daemon.admin_server");
|
|
||||||
|
|
||||||
int
|
|
||||||
adminConnectListServers(virNetDaemonPtr dmn,
|
|
||||||
virNetServerPtr **servers,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
virNetServerPtr *srvs = NULL;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
if ((ret = virNetDaemonGetServers(dmn, &srvs)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (servers) {
|
|
||||||
*servers = srvs;
|
|
||||||
srvs = NULL;
|
|
||||||
}
|
|
||||||
cleanup:
|
|
||||||
if (ret > 0)
|
|
||||||
virObjectListFreeCount(srvs, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
virNetServerPtr
|
|
||||||
adminConnectLookupServer(virNetDaemonPtr dmn,
|
|
||||||
const char *name,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
virCheckFlags(flags, NULL);
|
|
||||||
|
|
||||||
return virNetDaemonGetServer(dmn, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
adminServerGetThreadPoolParameters(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr *params,
|
|
||||||
int *nparams,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
int maxparams = 0;
|
|
||||||
size_t minWorkers;
|
|
||||||
size_t maxWorkers;
|
|
||||||
size_t nWorkers;
|
|
||||||
size_t freeWorkers;
|
|
||||||
size_t nPrioWorkers;
|
|
||||||
size_t jobQueueDepth;
|
|
||||||
virTypedParameterPtr tmpparams = NULL;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
if (virNetServerGetThreadPoolParameters(srv, &minWorkers, &maxWorkers,
|
|
||||||
&nWorkers, &freeWorkers,
|
|
||||||
&nPrioWorkers,
|
|
||||||
&jobQueueDepth) < 0) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Unable to retrieve threadpool parameters"));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
|
||||||
&maxparams, VIR_THREADPOOL_WORKERS_MIN,
|
|
||||||
minWorkers) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
|
||||||
&maxparams, VIR_THREADPOOL_WORKERS_MAX,
|
|
||||||
maxWorkers) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
|
||||||
&maxparams, VIR_THREADPOOL_WORKERS_CURRENT,
|
|
||||||
nWorkers) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
|
||||||
&maxparams, VIR_THREADPOOL_WORKERS_FREE,
|
|
||||||
freeWorkers) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
|
||||||
&maxparams, VIR_THREADPOOL_WORKERS_PRIORITY,
|
|
||||||
nPrioWorkers) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
|
||||||
&maxparams, VIR_THREADPOOL_JOB_QUEUE_DEPTH,
|
|
||||||
jobQueueDepth) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
*params = tmpparams;
|
|
||||||
tmpparams = NULL;
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virTypedParamsFree(tmpparams, *nparams);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
adminServerSetThreadPoolParameters(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr params,
|
|
||||||
int nparams,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
long long int minWorkers = -1;
|
|
||||||
long long int maxWorkers = -1;
|
|
||||||
long long int prioWorkers = -1;
|
|
||||||
virTypedParameterPtr param = NULL;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
if (virTypedParamsValidate(params, nparams,
|
|
||||||
VIR_THREADPOOL_WORKERS_MIN,
|
|
||||||
VIR_TYPED_PARAM_UINT,
|
|
||||||
VIR_THREADPOOL_WORKERS_MAX,
|
|
||||||
VIR_TYPED_PARAM_UINT,
|
|
||||||
VIR_THREADPOOL_WORKERS_PRIORITY,
|
|
||||||
VIR_TYPED_PARAM_UINT,
|
|
||||||
NULL) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if ((param = virTypedParamsGet(params, nparams,
|
|
||||||
VIR_THREADPOOL_WORKERS_MIN)))
|
|
||||||
minWorkers = param->value.ui;
|
|
||||||
|
|
||||||
if ((param = virTypedParamsGet(params, nparams,
|
|
||||||
VIR_THREADPOOL_WORKERS_MAX)))
|
|
||||||
maxWorkers = param->value.ui;
|
|
||||||
|
|
||||||
if ((param = virTypedParamsGet(params, nparams,
|
|
||||||
VIR_THREADPOOL_WORKERS_PRIORITY)))
|
|
||||||
prioWorkers = param->value.ui;
|
|
||||||
|
|
||||||
if (virNetServerSetThreadPoolParameters(srv, minWorkers,
|
|
||||||
maxWorkers, prioWorkers) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
adminServerListClients(virNetServerPtr srv,
|
|
||||||
virNetServerClientPtr **clients,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
virNetServerClientPtr *clts;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
if ((ret = virNetServerGetClients(srv, &clts)) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (clients) {
|
|
||||||
*clients = clts;
|
|
||||||
clts = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
virObjectListFreeCount(clts, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
virNetServerClientPtr
|
|
||||||
adminServerLookupClient(virNetServerPtr srv,
|
|
||||||
unsigned long long id,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
virCheckFlags(0, NULL);
|
|
||||||
|
|
||||||
return virNetServerGetClient(srv, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
adminClientGetInfo(virNetServerClientPtr client,
|
|
||||||
virTypedParameterPtr *params,
|
|
||||||
int *nparams,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
int maxparams = 0;
|
|
||||||
bool readonly;
|
|
||||||
char *sock_addr = NULL;
|
|
||||||
const char *attr = NULL;
|
|
||||||
virTypedParameterPtr tmpparams = NULL;
|
|
||||||
virIdentityPtr identity = NULL;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
if (virNetServerClientGetInfo(client, &readonly,
|
|
||||||
&sock_addr, &identity) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddBoolean(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_READONLY,
|
|
||||||
readonly) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virIdentityGetSASLUserName(identity, &attr) < 0 ||
|
|
||||||
(attr &&
|
|
||||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_SASL_USER_NAME,
|
|
||||||
attr) < 0))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!virNetServerClientIsLocal(client)) {
|
|
||||||
if (virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_SOCKET_ADDR,
|
|
||||||
sock_addr) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virIdentityGetX509DName(identity, &attr) < 0 ||
|
|
||||||
(attr &&
|
|
||||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_X509_DISTINGUISHED_NAME,
|
|
||||||
attr) < 0))
|
|
||||||
goto cleanup;
|
|
||||||
} else {
|
|
||||||
pid_t pid;
|
|
||||||
uid_t uid;
|
|
||||||
gid_t gid;
|
|
||||||
if (virIdentityGetUNIXUserID(identity, &uid) < 0 ||
|
|
||||||
virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_UNIX_USER_ID, uid) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virIdentityGetUNIXUserName(identity, &attr) < 0 ||
|
|
||||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_UNIX_USER_NAME,
|
|
||||||
attr) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virIdentityGetUNIXGroupID(identity, &gid) < 0 ||
|
|
||||||
virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_UNIX_GROUP_ID, gid) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virIdentityGetUNIXGroupName(identity, &attr) < 0 ||
|
|
||||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_UNIX_GROUP_NAME,
|
|
||||||
attr) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virIdentityGetUNIXProcessID(identity, &pid) < 0 ||
|
|
||||||
virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_UNIX_PROCESS_ID, pid) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virIdentityGetSELinuxContext(identity, &attr) < 0 ||
|
|
||||||
(attr &&
|
|
||||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_CLIENT_INFO_SELINUX_CONTEXT, attr) < 0))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
*params = tmpparams;
|
|
||||||
tmpparams = NULL;
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virObjectUnref(identity);
|
|
||||||
VIR_FREE(sock_addr);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int adminClientClose(virNetServerClientPtr client,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
adminServerGetClientLimits(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr *params,
|
|
||||||
int *nparams,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
int maxparams = 0;
|
|
||||||
virTypedParameterPtr tmpparams = NULL;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_SERVER_CLIENTS_MAX,
|
|
||||||
virNetServerGetMaxClients(srv)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_SERVER_CLIENTS_CURRENT,
|
|
||||||
virNetServerGetCurrentClients(srv)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_SERVER_CLIENTS_UNAUTH_MAX,
|
|
||||||
virNetServerGetMaxUnauthClients(srv)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
|
||||||
VIR_SERVER_CLIENTS_UNAUTH_CURRENT,
|
|
||||||
virNetServerGetCurrentUnauthClients(srv)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
*params = tmpparams;
|
|
||||||
tmpparams = NULL;
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virTypedParamsFree(tmpparams, *nparams);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
adminServerSetClientLimits(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr params,
|
|
||||||
int nparams,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
long long int maxClients = -1;
|
|
||||||
long long int maxClientsUnauth = -1;
|
|
||||||
virTypedParameterPtr param = NULL;
|
|
||||||
|
|
||||||
virCheckFlags(0, -1);
|
|
||||||
|
|
||||||
if (virTypedParamsValidate(params, nparams,
|
|
||||||
VIR_SERVER_CLIENTS_MAX,
|
|
||||||
VIR_TYPED_PARAM_UINT,
|
|
||||||
VIR_SERVER_CLIENTS_UNAUTH_MAX,
|
|
||||||
VIR_TYPED_PARAM_UINT,
|
|
||||||
NULL) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if ((param = virTypedParamsGet(params, nparams,
|
|
||||||
VIR_SERVER_CLIENTS_MAX)))
|
|
||||||
maxClients = param->value.ui;
|
|
||||||
|
|
||||||
if ((param = virTypedParamsGet(params, nparams,
|
|
||||||
VIR_SERVER_CLIENTS_UNAUTH_MAX)))
|
|
||||||
maxClientsUnauth = param->value.ui;
|
|
||||||
|
|
||||||
if (virNetServerSetClientProcessingControls(srv, maxClients,
|
|
||||||
maxClientsUnauth) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* admin_server.h: admin methods to manage daemons and clients
|
|
||||||
*
|
|
||||||
* Copyright (C) 2016 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/>.
|
|
||||||
*
|
|
||||||
* Authors: Erik Skultety <eskultet@redhat.com>
|
|
||||||
* Martin Kletzander <mkletzan@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LIBVIRTD_ADMIN_SERVER_H__
|
|
||||||
# define __LIBVIRTD_ADMIN_SERVER_H__
|
|
||||||
|
|
||||||
# include "rpc/virnetdaemon.h"
|
|
||||||
# include "rpc/virnetserver.h"
|
|
||||||
|
|
||||||
int adminConnectListServers(virNetDaemonPtr dmn,
|
|
||||||
virNetServerPtr **servers,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
virNetServerPtr adminConnectLookupServer(virNetDaemonPtr dmn,
|
|
||||||
const char *name,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
int
|
|
||||||
adminServerGetThreadPoolParameters(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr *params,
|
|
||||||
int *nparams,
|
|
||||||
unsigned int flags);
|
|
||||||
int
|
|
||||||
adminServerSetThreadPoolParameters(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr params,
|
|
||||||
int nparams,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
int adminServerListClients(virNetServerPtr srv,
|
|
||||||
virNetServerClientPtr **clients,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
virNetServerClientPtr adminServerLookupClient(virNetServerPtr srv,
|
|
||||||
unsigned long long id,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
int adminClientGetInfo(virNetServerClientPtr client,
|
|
||||||
virTypedParameterPtr *params,
|
|
||||||
int *nparams,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
int adminClientClose(virNetServerClientPtr client,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
int adminServerGetClientLimits(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr *params,
|
|
||||||
int *nparams,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
int adminServerSetClientLimits(virNetServerPtr srv,
|
|
||||||
virTypedParameterPtr params,
|
|
||||||
int nparams,
|
|
||||||
unsigned int flags);
|
|
||||||
|
|
||||||
#endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
// Allow any user in the 'libvirt' group to connect to system libvirtd
|
|
||||||
// without entering a password.
|
|
||||||
|
|
||||||
polkit.addRule(function(action, subject) {
|
|
||||||
if (action.id == "org.libvirt.unix.manage" &&
|
|
||||||
subject.isInGroup("libvirt")) {
|
|
||||||
return polkit.Result.YES;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -1,437 +0,0 @@
|
|||||||
/*
|
|
||||||
* libvirtd-config.c: daemon start of day, guest process & i/o management
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006-2012, 2014, 2015 Red Hat, Inc.
|
|
||||||
* Copyright (C) 2006 Daniel P. Berrange
|
|
||||||
*
|
|
||||||
* 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/>.
|
|
||||||
*
|
|
||||||
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "libvirtd-config.h"
|
|
||||||
#include "virconf.h"
|
|
||||||
#include "viralloc.h"
|
|
||||||
#include "virerror.h"
|
|
||||||
#include "virlog.h"
|
|
||||||
#include "rpc/virnetserver.h"
|
|
||||||
#include "configmake.h"
|
|
||||||
#include "remote/remote_protocol.h"
|
|
||||||
#include "remote/remote_driver.h"
|
|
||||||
#include "virstring.h"
|
|
||||||
#include "virutil.h"
|
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_CONF
|
|
||||||
|
|
||||||
VIR_LOG_INIT("daemon.libvirtd-config");
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
remoteConfigGetAuth(virConfPtr conf,
|
|
||||||
const char *filename,
|
|
||||||
const char *key,
|
|
||||||
int *auth)
|
|
||||||
{
|
|
||||||
char *authstr = NULL;
|
|
||||||
|
|
||||||
if (virConfGetValueString(conf, key, &authstr) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (!authstr)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (STREQ(authstr, "none")) {
|
|
||||||
*auth = VIR_NET_SERVER_SERVICE_AUTH_NONE;
|
|
||||||
#if WITH_SASL
|
|
||||||
} else if (STREQ(authstr, "sasl")) {
|
|
||||||
*auth = VIR_NET_SERVER_SERVICE_AUTH_SASL;
|
|
||||||
#endif
|
|
||||||
} else if (STREQ(authstr, "polkit")) {
|
|
||||||
*auth = VIR_NET_SERVER_SERVICE_AUTH_POLKIT;
|
|
||||||
} else {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("%s: %s: unsupported auth %s"),
|
|
||||||
filename, key, authstr);
|
|
||||||
VIR_FREE(authstr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
VIR_FREE(authstr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
daemonConfigFilePath(bool privileged, char **configfile)
|
|
||||||
{
|
|
||||||
if (privileged) {
|
|
||||||
if (VIR_STRDUP(*configfile, SYSCONFDIR "/libvirt/libvirtd.conf") < 0)
|
|
||||||
goto error;
|
|
||||||
} else {
|
|
||||||
char *configdir = NULL;
|
|
||||||
|
|
||||||
if (!(configdir = virGetUserConfigDirectory()))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virAsprintf(configfile, "%s/libvirtd.conf", configdir) < 0) {
|
|
||||||
VIR_FREE(configdir);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
VIR_FREE(configdir);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct daemonConfig*
|
|
||||||
daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
struct daemonConfig *data;
|
|
||||||
char *localhost;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(data) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
data->listen_tls = 1;
|
|
||||||
data->listen_tcp = 0;
|
|
||||||
|
|
||||||
if (VIR_STRDUP(data->tls_port, LIBVIRTD_TLS_PORT) < 0 ||
|
|
||||||
VIR_STRDUP(data->tcp_port, LIBVIRTD_TCP_PORT) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* Only default to PolicyKit if running as root */
|
|
||||||
#if WITH_POLKIT
|
|
||||||
if (privileged) {
|
|
||||||
data->auth_unix_rw = REMOTE_AUTH_POLKIT;
|
|
||||||
data->auth_unix_ro = REMOTE_AUTH_POLKIT;
|
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
data->auth_unix_rw = REMOTE_AUTH_NONE;
|
|
||||||
data->auth_unix_ro = REMOTE_AUTH_NONE;
|
|
||||||
#if WITH_POLKIT
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (VIR_STRDUP(data->unix_sock_rw_perms,
|
|
||||||
data->auth_unix_rw == REMOTE_AUTH_POLKIT ? "0777" : "0700") < 0 ||
|
|
||||||
VIR_STRDUP(data->unix_sock_ro_perms, "0777") < 0 ||
|
|
||||||
VIR_STRDUP(data->unix_sock_admin_perms, "0700") < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
#if WITH_SASL
|
|
||||||
data->auth_tcp = REMOTE_AUTH_SASL;
|
|
||||||
#else
|
|
||||||
data->auth_tcp = REMOTE_AUTH_NONE;
|
|
||||||
#endif
|
|
||||||
data->auth_tls = REMOTE_AUTH_NONE;
|
|
||||||
|
|
||||||
data->mdns_adv = 0;
|
|
||||||
|
|
||||||
data->min_workers = 5;
|
|
||||||
data->max_workers = 20;
|
|
||||||
data->max_clients = 5000;
|
|
||||||
data->max_queued_clients = 1000;
|
|
||||||
data->max_anonymous_clients = 20;
|
|
||||||
|
|
||||||
data->prio_workers = 5;
|
|
||||||
|
|
||||||
data->max_requests = 20;
|
|
||||||
data->max_client_requests = 5;
|
|
||||||
|
|
||||||
data->audit_level = 1;
|
|
||||||
data->audit_logging = 0;
|
|
||||||
|
|
||||||
data->keepalive_interval = 5;
|
|
||||||
data->keepalive_count = 5;
|
|
||||||
|
|
||||||
data->admin_min_workers = 5;
|
|
||||||
data->admin_max_workers = 20;
|
|
||||||
data->admin_max_clients = 5000;
|
|
||||||
data->admin_max_queued_clients = 20;
|
|
||||||
data->admin_max_client_requests = 5;
|
|
||||||
|
|
||||||
data->admin_keepalive_interval = 5;
|
|
||||||
data->admin_keepalive_count = 5;
|
|
||||||
|
|
||||||
localhost = virGetHostname();
|
|
||||||
if (localhost == NULL) {
|
|
||||||
/* we couldn't resolve the hostname; assume that we are
|
|
||||||
* running in disconnected operation, and report a less
|
|
||||||
* useful Avahi string
|
|
||||||
*/
|
|
||||||
ret = VIR_STRDUP(data->mdns_name, "Virtualization Host");
|
|
||||||
} else {
|
|
||||||
char *tmp;
|
|
||||||
/* Extract the host part of the potentially FQDN */
|
|
||||||
if ((tmp = strchr(localhost, '.')))
|
|
||||||
*tmp = '\0';
|
|
||||||
ret = virAsprintf(&data->mdns_name, "Virtualization Host %s",
|
|
||||||
localhost);
|
|
||||||
}
|
|
||||||
VIR_FREE(localhost);
|
|
||||||
if (ret < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
return data;
|
|
||||||
|
|
||||||
error:
|
|
||||||
daemonConfigFree(data);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
daemonConfigFree(struct daemonConfig *data)
|
|
||||||
{
|
|
||||||
char **tmp;
|
|
||||||
|
|
||||||
if (!data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
VIR_FREE(data->listen_addr);
|
|
||||||
VIR_FREE(data->tls_port);
|
|
||||||
VIR_FREE(data->tcp_port);
|
|
||||||
tmp = data->access_drivers;
|
|
||||||
while (tmp && *tmp) {
|
|
||||||
VIR_FREE(*tmp);
|
|
||||||
tmp++;
|
|
||||||
}
|
|
||||||
VIR_FREE(data->access_drivers);
|
|
||||||
|
|
||||||
VIR_FREE(data->unix_sock_admin_perms);
|
|
||||||
VIR_FREE(data->unix_sock_ro_perms);
|
|
||||||
VIR_FREE(data->unix_sock_rw_perms);
|
|
||||||
VIR_FREE(data->unix_sock_group);
|
|
||||||
VIR_FREE(data->unix_sock_dir);
|
|
||||||
VIR_FREE(data->mdns_name);
|
|
||||||
|
|
||||||
tmp = data->tls_allowed_dn_list;
|
|
||||||
while (tmp && *tmp) {
|
|
||||||
VIR_FREE(*tmp);
|
|
||||||
tmp++;
|
|
||||||
}
|
|
||||||
VIR_FREE(data->tls_allowed_dn_list);
|
|
||||||
|
|
||||||
tmp = data->sasl_allowed_username_list;
|
|
||||||
while (tmp && *tmp) {
|
|
||||||
VIR_FREE(*tmp);
|
|
||||||
tmp++;
|
|
||||||
}
|
|
||||||
VIR_FREE(data->sasl_allowed_username_list);
|
|
||||||
VIR_FREE(data->tls_priority);
|
|
||||||
|
|
||||||
VIR_FREE(data->key_file);
|
|
||||||
VIR_FREE(data->ca_file);
|
|
||||||
VIR_FREE(data->cert_file);
|
|
||||||
VIR_FREE(data->crl_file);
|
|
||||||
|
|
||||||
VIR_FREE(data->host_uuid);
|
|
||||||
VIR_FREE(data->host_uuid_source);
|
|
||||||
VIR_FREE(data->log_filters);
|
|
||||||
VIR_FREE(data->log_outputs);
|
|
||||||
|
|
||||||
VIR_FREE(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
daemonConfigLoadOptions(struct daemonConfig *data,
|
|
||||||
const char *filename,
|
|
||||||
virConfPtr conf)
|
|
||||||
{
|
|
||||||
if (virConfGetValueBool(conf, "listen_tcp", &data->listen_tcp) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueBool(conf, "listen_tls", &data->listen_tls) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "tls_port", &data->tls_port) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "tcp_port", &data->tcp_port) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "listen_addr", &data->listen_addr) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (remoteConfigGetAuth(conf, filename, "auth_unix_rw", &data->auth_unix_rw) < 0)
|
|
||||||
goto error;
|
|
||||||
#if WITH_POLKIT
|
|
||||||
/* Change default perms to be wide-open if PolicyKit is enabled.
|
|
||||||
* Admin can always override in config file
|
|
||||||
*/
|
|
||||||
if (data->auth_unix_rw == REMOTE_AUTH_POLKIT) {
|
|
||||||
VIR_FREE(data->unix_sock_rw_perms);
|
|
||||||
if (VIR_STRDUP(data->unix_sock_rw_perms, "0777") < 0)
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (remoteConfigGetAuth(conf, filename, "auth_unix_ro", &data->auth_unix_ro) < 0)
|
|
||||||
goto error;
|
|
||||||
if (remoteConfigGetAuth(conf, filename, "auth_tcp", &data->auth_tcp) < 0)
|
|
||||||
goto error;
|
|
||||||
if (remoteConfigGetAuth(conf, filename, "auth_tls", &data->auth_tls) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueStringList(conf, "access_drivers", false,
|
|
||||||
&data->access_drivers) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueString(conf, "unix_sock_group", &data->unix_sock_group) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "unix_sock_admin_perms", &data->unix_sock_admin_perms) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "unix_sock_ro_perms", &data->unix_sock_ro_perms) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "unix_sock_rw_perms", &data->unix_sock_rw_perms) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueString(conf, "unix_sock_dir", &data->unix_sock_dir) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueBool(conf, "mdns_adv", &data->mdns_adv) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "mdns_name", &data->mdns_name) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueBool(conf, "tls_no_sanity_certificate", &data->tls_no_sanity_certificate) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueBool(conf, "tls_no_verify_certificate", &data->tls_no_verify_certificate) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueString(conf, "key_file", &data->key_file) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "cert_file", &data->cert_file) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "ca_file", &data->ca_file) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "crl_file", &data->crl_file) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueStringList(conf, "tls_allowed_dn_list", false,
|
|
||||||
&data->tls_allowed_dn_list) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
|
|
||||||
if (virConfGetValueStringList(conf, "sasl_allowed_username_list", false,
|
|
||||||
&data->sasl_allowed_username_list) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueString(conf, "tls_priority", &data->tls_priority) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueUInt(conf, "min_workers", &data->min_workers) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "max_workers", &data->max_workers) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "max_clients", &data->max_clients) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "max_queued_clients", &data->max_queued_clients) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "max_anonymous_clients", &data->max_anonymous_clients) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueUInt(conf, "prio_workers", &data->prio_workers) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueUInt(conf, "max_requests", &data->max_requests) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "max_client_requests", &data->max_client_requests) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueUInt(conf, "admin_min_workers", &data->admin_min_workers) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "admin_max_workers", &data->admin_max_workers) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "admin_max_clients", &data->admin_max_clients) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "admin_max_queued_clients", &data->admin_max_queued_clients) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "admin_max_client_requests", &data->admin_max_client_requests) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueUInt(conf, "audit_level", &data->audit_level) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueBool(conf, "audit_logging", &data->audit_logging) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueString(conf, "host_uuid", &data->host_uuid) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "host_uuid_source", &data->host_uuid_source) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueUInt(conf, "log_level", &data->log_level) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "log_filters", &data->log_filters) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueString(conf, "log_outputs", &data->log_outputs) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueInt(conf, "keepalive_interval", &data->keepalive_interval) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "keepalive_count", &data->keepalive_count) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virConfGetValueInt(conf, "admin_keepalive_interval", &data->admin_keepalive_interval) < 0)
|
|
||||||
goto error;
|
|
||||||
if (virConfGetValueUInt(conf, "admin_keepalive_count", &data->admin_keepalive_count) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Read the config file if it exists.
|
|
||||||
* Only used in the remote case, hence the name.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
daemonConfigLoadFile(struct daemonConfig *data,
|
|
||||||
const char *filename,
|
|
||||||
bool allow_missing)
|
|
||||||
{
|
|
||||||
virConfPtr conf;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (allow_missing &&
|
|
||||||
access(filename, R_OK) == -1 &&
|
|
||||||
errno == ENOENT)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
conf = virConfReadFile(filename, 0);
|
|
||||||
if (!conf)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
ret = daemonConfigLoadOptions(data, filename, conf);
|
|
||||||
virConfFree(conf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int daemonConfigLoadData(struct daemonConfig *data,
|
|
||||||
const char *filename,
|
|
||||||
const char *filedata)
|
|
||||||
{
|
|
||||||
virConfPtr conf;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
conf = virConfReadMem(filedata, strlen(filedata), 0);
|
|
||||||
if (!conf)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
ret = daemonConfigLoadOptions(data, filename, conf);
|
|
||||||
virConfFree(conf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
/*
|
|
||||||
* libvirtd-config.h: daemon start of day, guest process & i/o management
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006-2012, 2015 Red Hat, Inc.
|
|
||||||
* Copyright (C) 2006 Daniel P. Berrange
|
|
||||||
*
|
|
||||||
* 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/>.
|
|
||||||
*
|
|
||||||
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LIBVIRTD_CONFIG_H__
|
|
||||||
# define __LIBVIRTD_CONFIG_H__
|
|
||||||
|
|
||||||
# include "internal.h"
|
|
||||||
|
|
||||||
struct daemonConfig {
|
|
||||||
char *host_uuid;
|
|
||||||
char *host_uuid_source;
|
|
||||||
|
|
||||||
bool listen_tls;
|
|
||||||
bool listen_tcp;
|
|
||||||
char *listen_addr;
|
|
||||||
char *tls_port;
|
|
||||||
char *tcp_port;
|
|
||||||
|
|
||||||
char *unix_sock_admin_perms;
|
|
||||||
char *unix_sock_ro_perms;
|
|
||||||
char *unix_sock_rw_perms;
|
|
||||||
char *unix_sock_group;
|
|
||||||
char *unix_sock_dir;
|
|
||||||
|
|
||||||
int auth_unix_rw;
|
|
||||||
int auth_unix_ro;
|
|
||||||
int auth_tcp;
|
|
||||||
int auth_tls;
|
|
||||||
|
|
||||||
char **access_drivers;
|
|
||||||
|
|
||||||
bool mdns_adv;
|
|
||||||
char *mdns_name;
|
|
||||||
|
|
||||||
bool tls_no_verify_certificate;
|
|
||||||
bool tls_no_sanity_certificate;
|
|
||||||
char **tls_allowed_dn_list;
|
|
||||||
char **sasl_allowed_username_list;
|
|
||||||
char *tls_priority;
|
|
||||||
|
|
||||||
char *key_file;
|
|
||||||
char *cert_file;
|
|
||||||
char *ca_file;
|
|
||||||
char *crl_file;
|
|
||||||
|
|
||||||
unsigned int min_workers;
|
|
||||||
unsigned int max_workers;
|
|
||||||
unsigned int max_clients;
|
|
||||||
unsigned int max_queued_clients;
|
|
||||||
unsigned int max_anonymous_clients;
|
|
||||||
|
|
||||||
unsigned int prio_workers;
|
|
||||||
|
|
||||||
unsigned int max_requests;
|
|
||||||
unsigned int max_client_requests;
|
|
||||||
|
|
||||||
unsigned int log_level;
|
|
||||||
char *log_filters;
|
|
||||||
char *log_outputs;
|
|
||||||
|
|
||||||
unsigned int audit_level;
|
|
||||||
bool audit_logging;
|
|
||||||
|
|
||||||
int keepalive_interval;
|
|
||||||
unsigned int keepalive_count;
|
|
||||||
|
|
||||||
unsigned int admin_min_workers;
|
|
||||||
unsigned int admin_max_workers;
|
|
||||||
unsigned int admin_max_clients;
|
|
||||||
unsigned int admin_max_queued_clients;
|
|
||||||
unsigned int admin_max_client_requests;
|
|
||||||
|
|
||||||
int admin_keepalive_interval;
|
|
||||||
unsigned int admin_keepalive_count;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int daemonConfigFilePath(bool privileged, char **configfile);
|
|
||||||
struct daemonConfig* daemonConfigNew(bool privileged);
|
|
||||||
void daemonConfigFree(struct daemonConfig *data);
|
|
||||||
int daemonConfigLoadFile(struct daemonConfig *data,
|
|
||||||
const char *filename,
|
|
||||||
bool allow_missing);
|
|
||||||
int daemonConfigLoadData(struct daemonConfig *data,
|
|
||||||
const char *filename,
|
|
||||||
const char *filedata);
|
|
||||||
|
|
||||||
#endif /* __LIBVIRTD_CONFIG_H__ */
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
(* /etc/libvirt/libvirtd.conf *)
|
|
||||||
|
|
||||||
module Libvirtd =
|
|
||||||
autoload xfm
|
|
||||||
|
|
||||||
let eol = del /[ \t]*\n/ "\n"
|
|
||||||
let value_sep = del /[ \t]*=[ \t]*/ " = "
|
|
||||||
let indent = del /[ \t]*/ ""
|
|
||||||
|
|
||||||
let array_sep = del /,[ \t\n]*/ ", "
|
|
||||||
let array_start = del /\[[ \t\n]*/ "[ "
|
|
||||||
let array_end = del /\]/ "]"
|
|
||||||
|
|
||||||
let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
|
|
||||||
let bool_val = store /0|1/
|
|
||||||
let int_val = store /-?[0-9]+/
|
|
||||||
let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""
|
|
||||||
let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end
|
|
||||||
|
|
||||||
let str_entry (kw:string) = [ key kw . value_sep . str_val ]
|
|
||||||
let bool_entry (kw:string) = [ key kw . value_sep . bool_val ]
|
|
||||||
let int_entry (kw:string) = [ key kw . value_sep . int_val ]
|
|
||||||
let str_array_entry (kw:string) = [ key kw . value_sep . str_array_val ]
|
|
||||||
|
|
||||||
|
|
||||||
(* Config entry grouped by function - same order as example config *)
|
|
||||||
let network_entry = bool_entry "listen_tls"
|
|
||||||
| bool_entry "listen_tcp"
|
|
||||||
| str_entry "tls_port"
|
|
||||||
| str_entry "tcp_port"
|
|
||||||
| str_entry "listen_addr"
|
|
||||||
| bool_entry "mdns_adv"
|
|
||||||
| str_entry "mdns_name"
|
|
||||||
|
|
||||||
let sock_acl_entry = str_entry "unix_sock_group"
|
|
||||||
| str_entry "unix_sock_ro_perms"
|
|
||||||
| str_entry "unix_sock_rw_perms"
|
|
||||||
| str_entry "unix_sock_admin_perms"
|
|
||||||
| str_entry "unix_sock_dir"
|
|
||||||
|
|
||||||
let authentication_entry = str_entry "auth_unix_ro"
|
|
||||||
| str_entry "auth_unix_rw"
|
|
||||||
| str_entry "auth_tcp"
|
|
||||||
| str_entry "auth_tls"
|
|
||||||
|
|
||||||
let certificate_entry = str_entry "key_file"
|
|
||||||
| str_entry "cert_file"
|
|
||||||
| str_entry "ca_file"
|
|
||||||
| str_entry "crl_file"
|
|
||||||
|
|
||||||
let authorization_entry = bool_entry "tls_no_verify_certificate"
|
|
||||||
| bool_entry "tls_no_sanity_certificate"
|
|
||||||
| str_array_entry "tls_allowed_dn_list"
|
|
||||||
| str_array_entry "sasl_allowed_username_list"
|
|
||||||
| str_array_entry "access_drivers"
|
|
||||||
| str_entry "tls_priority"
|
|
||||||
|
|
||||||
let processing_entry = int_entry "min_workers"
|
|
||||||
| int_entry "max_workers"
|
|
||||||
| int_entry "max_clients"
|
|
||||||
| int_entry "max_queued_clients"
|
|
||||||
| int_entry "max_anonymous_clients"
|
|
||||||
| int_entry "max_requests"
|
|
||||||
| int_entry "max_client_requests"
|
|
||||||
| int_entry "prio_workers"
|
|
||||||
|
|
||||||
let admin_processing_entry = int_entry "admin_min_workers"
|
|
||||||
| int_entry "admin_max_workers"
|
|
||||||
| int_entry "admin_max_clients"
|
|
||||||
| int_entry "admin_max_queued_clients"
|
|
||||||
| int_entry "admin_max_client_requests"
|
|
||||||
|
|
||||||
let logging_entry = int_entry "log_level"
|
|
||||||
| str_entry "log_filters"
|
|
||||||
| str_entry "log_outputs"
|
|
||||||
| int_entry "log_buffer_size"
|
|
||||||
|
|
||||||
let auditing_entry = int_entry "audit_level"
|
|
||||||
| bool_entry "audit_logging"
|
|
||||||
|
|
||||||
let keepalive_entry = int_entry "keepalive_interval"
|
|
||||||
| int_entry "keepalive_count"
|
|
||||||
| bool_entry "keepalive_required"
|
|
||||||
|
|
||||||
let admin_keepalive_entry = int_entry "admin_keepalive_interval"
|
|
||||||
| int_entry "admin_keepalive_count"
|
|
||||||
| bool_entry "admin_keepalive_required"
|
|
||||||
|
|
||||||
let misc_entry = str_entry "host_uuid"
|
|
||||||
| str_entry "host_uuid_source"
|
|
||||||
|
|
||||||
(* Each enty in the config is one of the following three ... *)
|
|
||||||
let entry = network_entry
|
|
||||||
| sock_acl_entry
|
|
||||||
| authentication_entry
|
|
||||||
| certificate_entry
|
|
||||||
| authorization_entry
|
|
||||||
| processing_entry
|
|
||||||
| admin_processing_entry
|
|
||||||
| logging_entry
|
|
||||||
| auditing_entry
|
|
||||||
| keepalive_entry
|
|
||||||
| admin_keepalive_entry
|
|
||||||
| misc_entry
|
|
||||||
let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
|
|
||||||
let empty = [ label "#empty" . eol ]
|
|
||||||
|
|
||||||
let record = indent . entry . eol
|
|
||||||
|
|
||||||
let lns = ( record | comment | empty ) *
|
|
||||||
|
|
||||||
let filter = incl "/etc/libvirt/libvirtd.conf"
|
|
||||||
. Util.stdexcl
|
|
||||||
|
|
||||||
let xfm = transform lns filter
|
|
||||||
1663
daemon/libvirtd.c
1663
daemon/libvirtd.c
File diff suppressed because it is too large
Load Diff
@@ -1,469 +0,0 @@
|
|||||||
# Master libvirt daemon configuration file
|
|
||||||
#
|
|
||||||
# For further information consult http://libvirt.org/format.html
|
|
||||||
#
|
|
||||||
# NOTE: the tests/daemon-conf regression test script requires
|
|
||||||
# that each "PARAMETER = VALUE" line in this file have the parameter
|
|
||||||
# name just after a leading "#".
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
#
|
|
||||||
# Network connectivity controls
|
|
||||||
#
|
|
||||||
|
|
||||||
# Flag listening for secure TLS connections on the public TCP/IP port.
|
|
||||||
# NB, must pass the --listen flag to the libvirtd process for this to
|
|
||||||
# have any effect.
|
|
||||||
#
|
|
||||||
# It is necessary to setup a CA and issue server certificates before
|
|
||||||
# using this capability.
|
|
||||||
#
|
|
||||||
# This is enabled by default, uncomment this to disable it
|
|
||||||
#listen_tls = 0
|
|
||||||
|
|
||||||
# Listen for unencrypted TCP connections on the public TCP/IP port.
|
|
||||||
# NB, must pass the --listen flag to the libvirtd process for this to
|
|
||||||
# have any effect.
|
|
||||||
#
|
|
||||||
# Using the TCP socket requires SASL authentication by default. Only
|
|
||||||
# SASL mechanisms which support data encryption are allowed. This is
|
|
||||||
# DIGEST_MD5 and GSSAPI (Kerberos5)
|
|
||||||
#
|
|
||||||
# This is disabled by default, uncomment this to enable it.
|
|
||||||
#listen_tcp = 1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Override the port for accepting secure TLS connections
|
|
||||||
# This can be a port number, or service name
|
|
||||||
#
|
|
||||||
#tls_port = "16514"
|
|
||||||
|
|
||||||
# Override the port for accepting insecure TCP connections
|
|
||||||
# This can be a port number, or service name
|
|
||||||
#
|
|
||||||
#tcp_port = "16509"
|
|
||||||
|
|
||||||
|
|
||||||
# Override the default configuration which binds to all network
|
|
||||||
# interfaces. This can be a numeric IPv4/6 address, or hostname
|
|
||||||
#
|
|
||||||
# If the libvirtd service is started in parallel with network
|
|
||||||
# startup (e.g. with systemd), binding to addresses other than
|
|
||||||
# the wildcards (0.0.0.0/::) might not be available yet.
|
|
||||||
#
|
|
||||||
#listen_addr = "192.168.0.1"
|
|
||||||
|
|
||||||
|
|
||||||
# Flag toggling mDNS advertizement of the libvirt service.
|
|
||||||
#
|
|
||||||
# Alternatively can disable for all services on a host by
|
|
||||||
# stopping the Avahi daemon
|
|
||||||
#
|
|
||||||
# This is disabled by default, uncomment this to enable it
|
|
||||||
#mdns_adv = 1
|
|
||||||
|
|
||||||
# Override the default mDNS advertizement name. This must be
|
|
||||||
# unique on the immediate broadcast network.
|
|
||||||
#
|
|
||||||
# The default is "Virtualization Host HOSTNAME", where HOSTNAME
|
|
||||||
# is substituted for the short hostname of the machine (without domain)
|
|
||||||
#
|
|
||||||
#mdns_name = "Virtualization Host Joe Demo"
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
#
|
|
||||||
# UNIX socket access controls
|
|
||||||
#
|
|
||||||
|
|
||||||
# Set the UNIX domain socket group ownership. This can be used to
|
|
||||||
# allow a 'trusted' set of users access to management capabilities
|
|
||||||
# without becoming root.
|
|
||||||
#
|
|
||||||
# This is restricted to 'root' by default.
|
|
||||||
#unix_sock_group = "libvirt"
|
|
||||||
|
|
||||||
# Set the UNIX socket permissions for the R/O socket. This is used
|
|
||||||
# for monitoring VM status only
|
|
||||||
#
|
|
||||||
# Default allows any user. If setting group ownership, you may want to
|
|
||||||
# restrict this too.
|
|
||||||
#unix_sock_ro_perms = "0777"
|
|
||||||
|
|
||||||
# Set the UNIX socket permissions for the R/W socket. This is used
|
|
||||||
# for full management of VMs
|
|
||||||
#
|
|
||||||
# Default allows only root. If PolicyKit is enabled on the socket,
|
|
||||||
# the default will change to allow everyone (eg, 0777)
|
|
||||||
#
|
|
||||||
# If not using PolicyKit and setting group ownership for access
|
|
||||||
# control, then you may want to relax this too.
|
|
||||||
#unix_sock_rw_perms = "0770"
|
|
||||||
|
|
||||||
# Set the UNIX socket permissions for the admin interface socket.
|
|
||||||
#
|
|
||||||
# Default allows only owner (root), do not change it unless you are
|
|
||||||
# sure to whom you are exposing the access to.
|
|
||||||
#unix_sock_admin_perms = "0700"
|
|
||||||
|
|
||||||
# Set the name of the directory in which sockets will be found/created.
|
|
||||||
#unix_sock_dir = "/var/run/libvirt"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
#
|
|
||||||
# Authentication.
|
|
||||||
#
|
|
||||||
# - none: do not perform auth checks. If you can connect to the
|
|
||||||
# socket you are allowed. This is suitable if there are
|
|
||||||
# restrictions on connecting to the socket (eg, UNIX
|
|
||||||
# socket permissions), or if there is a lower layer in
|
|
||||||
# the network providing auth (eg, TLS/x509 certificates)
|
|
||||||
#
|
|
||||||
# - sasl: use SASL infrastructure. The actual auth scheme is then
|
|
||||||
# controlled from /etc/sasl2/libvirt.conf. For the TCP
|
|
||||||
# socket only GSSAPI & DIGEST-MD5 mechanisms will be used.
|
|
||||||
# For non-TCP or TLS sockets, any scheme is allowed.
|
|
||||||
#
|
|
||||||
# - polkit: use PolicyKit to authenticate. This is only suitable
|
|
||||||
# for use on the UNIX sockets. The default policy will
|
|
||||||
# require a user to supply their own password to gain
|
|
||||||
# full read/write access (aka sudo like), while anyone
|
|
||||||
# is allowed read/only access.
|
|
||||||
#
|
|
||||||
# Set an authentication scheme for UNIX read-only sockets
|
|
||||||
# By default socket permissions allow anyone to connect
|
|
||||||
#
|
|
||||||
# To restrict monitoring of domains you may wish to enable
|
|
||||||
# an authentication mechanism here
|
|
||||||
#auth_unix_ro = "none"
|
|
||||||
|
|
||||||
# Set an authentication scheme for UNIX read-write sockets
|
|
||||||
# By default socket permissions only allow root. If PolicyKit
|
|
||||||
# support was compiled into libvirt, the default will be to
|
|
||||||
# use 'polkit' auth.
|
|
||||||
#
|
|
||||||
# If the unix_sock_rw_perms are changed you may wish to enable
|
|
||||||
# an authentication mechanism here
|
|
||||||
#auth_unix_rw = "none"
|
|
||||||
|
|
||||||
# Change the authentication scheme for TCP sockets.
|
|
||||||
#
|
|
||||||
# If you don't enable SASL, then all TCP traffic is cleartext.
|
|
||||||
# Don't do this outside of a dev/test scenario. For real world
|
|
||||||
# use, always enable SASL and use the GSSAPI or DIGEST-MD5
|
|
||||||
# mechanism in /etc/sasl2/libvirt.conf
|
|
||||||
#auth_tcp = "sasl"
|
|
||||||
|
|
||||||
# Change the authentication scheme for TLS sockets.
|
|
||||||
#
|
|
||||||
# TLS sockets already have encryption provided by the TLS
|
|
||||||
# layer, and limited authentication is done by certificates
|
|
||||||
#
|
|
||||||
# It is possible to make use of any SASL authentication
|
|
||||||
# mechanism as well, by using 'sasl' for this option
|
|
||||||
#auth_tls = "none"
|
|
||||||
|
|
||||||
|
|
||||||
# Change the API access control scheme
|
|
||||||
#
|
|
||||||
# By default an authenticated user is allowed access
|
|
||||||
# to all APIs. Access drivers can place restrictions
|
|
||||||
# on this. By default the 'nop' driver is enabled,
|
|
||||||
# meaning no access control checks are done once a
|
|
||||||
# client has authenticated with libvirtd
|
|
||||||
#
|
|
||||||
#access_drivers = [ "polkit" ]
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
#
|
|
||||||
# TLS x509 certificate configuration
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
# Override the default server key file path
|
|
||||||
#
|
|
||||||
#key_file = "/etc/pki/libvirt/private/serverkey.pem"
|
|
||||||
|
|
||||||
# Override the default server certificate file path
|
|
||||||
#
|
|
||||||
#cert_file = "/etc/pki/libvirt/servercert.pem"
|
|
||||||
|
|
||||||
# Override the default CA certificate path
|
|
||||||
#
|
|
||||||
#ca_file = "/etc/pki/CA/cacert.pem"
|
|
||||||
|
|
||||||
# Specify a certificate revocation list.
|
|
||||||
#
|
|
||||||
# Defaults to not using a CRL, uncomment to enable it
|
|
||||||
#crl_file = "/etc/pki/CA/crl.pem"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
#
|
|
||||||
# Authorization controls
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
# Flag to disable verification of our own server certificates
|
|
||||||
#
|
|
||||||
# When libvirtd starts it performs some sanity checks against
|
|
||||||
# its own certificates.
|
|
||||||
#
|
|
||||||
# Default is to always run sanity checks. Uncommenting this
|
|
||||||
# will disable sanity checks which is not a good idea
|
|
||||||
#tls_no_sanity_certificate = 1
|
|
||||||
|
|
||||||
# Flag to disable verification of client certificates
|
|
||||||
#
|
|
||||||
# Client certificate verification is the primary authentication mechanism.
|
|
||||||
# Any client which does not present a certificate signed by the CA
|
|
||||||
# will be rejected.
|
|
||||||
#
|
|
||||||
# Default is to always verify. Uncommenting this will disable
|
|
||||||
# verification - make sure an IP whitelist is set
|
|
||||||
#tls_no_verify_certificate = 1
|
|
||||||
|
|
||||||
|
|
||||||
# A whitelist of allowed x509 Distinguished Names
|
|
||||||
# This list may contain wildcards such as
|
|
||||||
#
|
|
||||||
# "C=GB,ST=London,L=London,O=Red Hat,CN=*"
|
|
||||||
#
|
|
||||||
# See the POSIX fnmatch function for the format of the wildcards.
|
|
||||||
#
|
|
||||||
# NB If this is an empty list, no client can connect, so comment out
|
|
||||||
# entirely rather than using empty list to disable these checks
|
|
||||||
#
|
|
||||||
# By default, no DN's are checked
|
|
||||||
#tls_allowed_dn_list = ["DN1", "DN2"]
|
|
||||||
|
|
||||||
|
|
||||||
# A whitelist of allowed SASL usernames. The format for username
|
|
||||||
# depends on the SASL authentication mechanism. Kerberos usernames
|
|
||||||
# look like username@REALM
|
|
||||||
#
|
|
||||||
# This list may contain wildcards such as
|
|
||||||
#
|
|
||||||
# "*@EXAMPLE.COM"
|
|
||||||
#
|
|
||||||
# See the POSIX fnmatch function for the format of the wildcards.
|
|
||||||
#
|
|
||||||
# NB If this is an empty list, no client can connect, so comment out
|
|
||||||
# entirely rather than using empty list to disable these checks
|
|
||||||
#
|
|
||||||
# By default, no Username's are checked
|
|
||||||
#sasl_allowed_username_list = ["joe@EXAMPLE.COM", "fred@EXAMPLE.COM" ]
|
|
||||||
|
|
||||||
|
|
||||||
# Override the compile time default TLS priority string. The
|
|
||||||
# default is usually "NORMAL" unless overridden at build time.
|
|
||||||
# Only set this is it is desired for libvirt to deviate from
|
|
||||||
# the global default settings.
|
|
||||||
#
|
|
||||||
#tls_priority="NORMAL"
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
#
|
|
||||||
# Processing controls
|
|
||||||
#
|
|
||||||
|
|
||||||
# The maximum number of concurrent client connections to allow
|
|
||||||
# over all sockets combined.
|
|
||||||
#max_clients = 5000
|
|
||||||
|
|
||||||
# The maximum length of queue of connections waiting to be
|
|
||||||
# accepted by the daemon. Note, that some protocols supporting
|
|
||||||
# retransmission may obey this so that a later reattempt at
|
|
||||||
# connection succeeds.
|
|
||||||
#max_queued_clients = 1000
|
|
||||||
|
|
||||||
# The maximum length of queue of accepted but not yet
|
|
||||||
# authenticated clients. The default value is 20. Set this to
|
|
||||||
# zero to turn this feature off.
|
|
||||||
#max_anonymous_clients = 20
|
|
||||||
|
|
||||||
# The minimum limit sets the number of workers to start up
|
|
||||||
# initially. If the number of active clients exceeds this,
|
|
||||||
# then more threads are spawned, up to max_workers limit.
|
|
||||||
# Typically you'd want max_workers to equal maximum number
|
|
||||||
# of clients allowed
|
|
||||||
#min_workers = 5
|
|
||||||
#max_workers = 20
|
|
||||||
|
|
||||||
|
|
||||||
# The number of priority workers. If all workers from above
|
|
||||||
# pool are stuck, some calls marked as high priority
|
|
||||||
# (notably domainDestroy) can be executed in this pool.
|
|
||||||
#prio_workers = 5
|
|
||||||
|
|
||||||
# Total global limit on concurrent RPC calls. Should be
|
|
||||||
# at least as large as max_workers. Beyond this, RPC requests
|
|
||||||
# will be read into memory and queued. This directly impacts
|
|
||||||
# memory usage, currently each request requires 256 KB of
|
|
||||||
# memory. So by default up to 5 MB of memory is used
|
|
||||||
#
|
|
||||||
# XXX this isn't actually enforced yet, only the per-client
|
|
||||||
# limit is used so far
|
|
||||||
#max_requests = 20
|
|
||||||
|
|
||||||
# Limit on concurrent requests from a single client
|
|
||||||
# connection. To avoid one client monopolizing the server
|
|
||||||
# this should be a small fraction of the global max_requests
|
|
||||||
# and max_workers parameter
|
|
||||||
#max_client_requests = 5
|
|
||||||
|
|
||||||
# Same processing controls, but this time for the admin interface.
|
|
||||||
# For description of each option, be so kind to scroll few lines
|
|
||||||
# upwards.
|
|
||||||
|
|
||||||
#admin_min_workers = 1
|
|
||||||
#admin_max_workers = 5
|
|
||||||
#admin_max_clients = 5
|
|
||||||
#admin_max_queued_clients = 5
|
|
||||||
#admin_max_client_requests = 5
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
#
|
|
||||||
# Logging controls
|
|
||||||
#
|
|
||||||
|
|
||||||
# Logging level: 4 errors, 3 warnings, 2 information, 1 debug
|
|
||||||
# basically 1 will log everything possible
|
|
||||||
# Note: Journald may employ rate limiting of the messages logged
|
|
||||||
# and thus lock up the libvirt daemon. To use the debug level with
|
|
||||||
# journald you have to specify it explicitly in 'log_outputs', otherwise
|
|
||||||
# only information level messages will be logged.
|
|
||||||
#log_level = 3
|
|
||||||
|
|
||||||
# Logging filters:
|
|
||||||
# A filter allows to select a different logging level for a given category
|
|
||||||
# of logs
|
|
||||||
# The format for a filter is one of:
|
|
||||||
# x:name
|
|
||||||
# x:+name
|
|
||||||
|
|
||||||
# where name is a string which is matched against the category
|
|
||||||
# given in the VIR_LOG_INIT() at the top of each libvirt source
|
|
||||||
# file, e.g., "remote", "qemu", or "util.json" (the name in the
|
|
||||||
# filter can be a substring of the full category name, in order
|
|
||||||
# to match multiple similar categories), the optional "+" prefix
|
|
||||||
# tells libvirt to log stack trace for each message matching
|
|
||||||
# name, and x is the minimal level where matching messages should
|
|
||||||
# be logged:
|
|
||||||
|
|
||||||
# 1: DEBUG
|
|
||||||
# 2: INFO
|
|
||||||
# 3: WARNING
|
|
||||||
# 4: ERROR
|
|
||||||
#
|
|
||||||
# Multiple filters can be defined in a single @filters, they just need to be
|
|
||||||
# separated by spaces.
|
|
||||||
#
|
|
||||||
# e.g. to only get warning or errors from the remote layer and only errors
|
|
||||||
# from the event layer:
|
|
||||||
#log_filters="3:remote 4:event"
|
|
||||||
|
|
||||||
# Logging outputs:
|
|
||||||
# An output is one of the places to save logging information
|
|
||||||
# The format for an output can be:
|
|
||||||
# x:stderr
|
|
||||||
# output goes to stderr
|
|
||||||
# x:syslog:name
|
|
||||||
# use syslog for the output and use the given name as the ident
|
|
||||||
# x:file:file_path
|
|
||||||
# output to a file, with the given filepath
|
|
||||||
# x:journald
|
|
||||||
# output to journald logging system
|
|
||||||
# In all case the x prefix is the minimal level, acting as a filter
|
|
||||||
# 1: DEBUG
|
|
||||||
# 2: INFO
|
|
||||||
# 3: WARNING
|
|
||||||
# 4: ERROR
|
|
||||||
#
|
|
||||||
# Multiple outputs can be defined, they just need to be separated by spaces.
|
|
||||||
# e.g. to log all warnings and errors to syslog under the libvirtd ident:
|
|
||||||
#log_outputs="3:syslog:libvirtd"
|
|
||||||
#
|
|
||||||
|
|
||||||
# Log debug buffer size:
|
|
||||||
#
|
|
||||||
# This configuration option is no longer used, since the global
|
|
||||||
# log buffer functionality has been removed. Please configure
|
|
||||||
# suitable log_outputs/log_filters settings to obtain logs.
|
|
||||||
#log_buffer_size = 64
|
|
||||||
|
|
||||||
|
|
||||||
##################################################################
|
|
||||||
#
|
|
||||||
# Auditing
|
|
||||||
#
|
|
||||||
# This setting allows usage of the auditing subsystem to be altered:
|
|
||||||
#
|
|
||||||
# audit_level == 0 -> disable all auditing
|
|
||||||
# audit_level == 1 -> enable auditing, only if enabled on host (default)
|
|
||||||
# audit_level == 2 -> enable auditing, and exit if disabled on host
|
|
||||||
#
|
|
||||||
#audit_level = 2
|
|
||||||
#
|
|
||||||
# If set to 1, then audit messages will also be sent
|
|
||||||
# via libvirt logging infrastructure. Defaults to 0
|
|
||||||
#
|
|
||||||
#audit_logging = 1
|
|
||||||
|
|
||||||
###################################################################
|
|
||||||
# UUID of the host:
|
|
||||||
# Host UUID is read from one of the sources specified in host_uuid_source.
|
|
||||||
#
|
|
||||||
# - 'smbios': fetch the UUID from 'dmidecode -s system-uuid'
|
|
||||||
# - 'machine-id': fetch the UUID from /etc/machine-id
|
|
||||||
#
|
|
||||||
# The host_uuid_source default is 'smbios'. If 'dmidecode' does not provide
|
|
||||||
# a valid UUID a temporary UUID will be generated.
|
|
||||||
#
|
|
||||||
# Another option is to specify host UUID in host_uuid.
|
|
||||||
#
|
|
||||||
# Keep the format of the example UUID below. UUID must not have all digits
|
|
||||||
# be the same.
|
|
||||||
|
|
||||||
# NB This default all-zeros UUID will not work. Replace
|
|
||||||
# it with the output of the 'uuidgen' command and then
|
|
||||||
# uncomment this entry
|
|
||||||
#host_uuid = "00000000-0000-0000-0000-000000000000"
|
|
||||||
#host_uuid_source = "smbios"
|
|
||||||
|
|
||||||
###################################################################
|
|
||||||
# Keepalive protocol:
|
|
||||||
# This allows libvirtd to detect broken client connections or even
|
|
||||||
# dead clients. A keepalive message is sent to a client after
|
|
||||||
# keepalive_interval seconds of inactivity to check if the client is
|
|
||||||
# still responding; keepalive_count is a maximum number of keepalive
|
|
||||||
# messages that are allowed to be sent to the client without getting
|
|
||||||
# any response before the connection is considered broken. In other
|
|
||||||
# words, the connection is automatically closed approximately after
|
|
||||||
# keepalive_interval * (keepalive_count + 1) seconds since the last
|
|
||||||
# message received from the client. If keepalive_interval is set to
|
|
||||||
# -1, libvirtd will never send keepalive requests; however clients
|
|
||||||
# can still send them and the daemon will send responses. When
|
|
||||||
# keepalive_count is set to 0, connections will be automatically
|
|
||||||
# closed after keepalive_interval seconds of inactivity without
|
|
||||||
# sending any keepalive messages.
|
|
||||||
#
|
|
||||||
#keepalive_interval = 5
|
|
||||||
#keepalive_count = 5
|
|
||||||
|
|
||||||
#
|
|
||||||
# These configuration options are no longer used. There is no way to
|
|
||||||
# restrict such clients from connecting since they first need to
|
|
||||||
# connect in order to ask for keepalive.
|
|
||||||
#
|
|
||||||
#keepalive_required = 1
|
|
||||||
#admin_keepalive_required = 1
|
|
||||||
|
|
||||||
# Keepalive settings for the admin interface
|
|
||||||
#admin_keepalive_interval = 5
|
|
||||||
#admin_keepalive_count = 5
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
* libvirtd.h: daemon data structure definitions
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006-2015 Red Hat, Inc.
|
|
||||||
* Copyright (C) 2006 Daniel P. Berrange
|
|
||||||
*
|
|
||||||
* 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/>.
|
|
||||||
*
|
|
||||||
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LIBVIRTD_H__
|
|
||||||
# define LIBVIRTD_H__
|
|
||||||
|
|
||||||
# define VIR_ENUM_SENTINELS
|
|
||||||
|
|
||||||
# include <rpc/types.h>
|
|
||||||
# include <rpc/xdr.h>
|
|
||||||
# include "remote_protocol.h"
|
|
||||||
# include "admin_protocol.h"
|
|
||||||
# include "lxc_protocol.h"
|
|
||||||
# include "qemu_protocol.h"
|
|
||||||
# include "virthread.h"
|
|
||||||
|
|
||||||
# if WITH_SASL
|
|
||||||
# include "virnetsaslcontext.h"
|
|
||||||
# endif
|
|
||||||
# include "virnetserverprogram.h"
|
|
||||||
|
|
||||||
typedef struct daemonClientStream daemonClientStream;
|
|
||||||
typedef daemonClientStream *daemonClientStreamPtr;
|
|
||||||
typedef struct daemonClientPrivate daemonClientPrivate;
|
|
||||||
typedef daemonClientPrivate *daemonClientPrivatePtr;
|
|
||||||
typedef struct daemonAdmClientPrivate daemonAdmClientPrivate;
|
|
||||||
typedef daemonAdmClientPrivate *daemonAdmClientPrivatePtr;
|
|
||||||
typedef struct daemonClientEventCallback daemonClientEventCallback;
|
|
||||||
typedef daemonClientEventCallback *daemonClientEventCallbackPtr;
|
|
||||||
|
|
||||||
/* Stores the per-client connection state */
|
|
||||||
struct daemonClientPrivate {
|
|
||||||
/* Hold while accessing any data except conn */
|
|
||||||
virMutex lock;
|
|
||||||
|
|
||||||
daemonClientEventCallbackPtr *domainEventCallbacks;
|
|
||||||
size_t ndomainEventCallbacks;
|
|
||||||
daemonClientEventCallbackPtr *networkEventCallbacks;
|
|
||||||
size_t nnetworkEventCallbacks;
|
|
||||||
daemonClientEventCallbackPtr *qemuEventCallbacks;
|
|
||||||
size_t nqemuEventCallbacks;
|
|
||||||
daemonClientEventCallbackPtr *storageEventCallbacks;
|
|
||||||
size_t nstorageEventCallbacks;
|
|
||||||
bool closeRegistered;
|
|
||||||
|
|
||||||
# if WITH_SASL
|
|
||||||
virNetSASLSessionPtr sasl;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/* This is only valid if a remote open call has been made on this
|
|
||||||
* connection, otherwise it will be NULL. Also if remote close is
|
|
||||||
* called, it will be set back to NULL if that succeeds.
|
|
||||||
*/
|
|
||||||
virConnectPtr conn;
|
|
||||||
|
|
||||||
daemonClientStreamPtr streams;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Separate private data for admin connection */
|
|
||||||
struct daemonAdmClientPrivate {
|
|
||||||
/* Just a placeholder, not that there is anything to be locked */
|
|
||||||
virMutex lock;
|
|
||||||
|
|
||||||
virNetDaemonPtr dmn;
|
|
||||||
};
|
|
||||||
|
|
||||||
# if WITH_SASL
|
|
||||||
extern virNetSASLContextPtr saslCtxt;
|
|
||||||
# endif
|
|
||||||
extern virNetServerProgramPtr remoteProgram;
|
|
||||||
extern virNetServerProgramPtr qemuProgram;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# the following is the LSB init header see
|
|
||||||
# http://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html
|
|
||||||
#
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: libvirtd
|
|
||||||
# Default-Start: 3 4 5
|
|
||||||
# Default-Stop: 0 1 2 6
|
|
||||||
# Required-Start: $network messagebus virtlogd
|
|
||||||
# Required-Stop: $network messagebus
|
|
||||||
# Should-Start: $named xend avahi-daemon virtlockd
|
|
||||||
# Should-Stop: $named
|
|
||||||
# Short-Description: daemon for libvirt virtualization API
|
|
||||||
# Description: This is a daemon for managing guest instances
|
|
||||||
# and libvirt virtual networks
|
|
||||||
# See http://libvirt.org
|
|
||||||
### END INIT INFO
|
|
||||||
|
|
||||||
# the following is chkconfig init header
|
|
||||||
#
|
|
||||||
# libvirtd: guest and virtual network management daemon
|
|
||||||
#
|
|
||||||
# chkconfig: 345 97 03
|
|
||||||
# description: This is a daemon for managing guest instances \
|
|
||||||
# and libvirt virtual networks \
|
|
||||||
# See http://libvirt.org
|
|
||||||
#
|
|
||||||
# processname: libvirtd
|
|
||||||
# pidfile: @localstatedir@/run/libvirtd.pid
|
|
||||||
#
|
|
||||||
|
|
||||||
# Source function library.
|
|
||||||
. @sysconfdir@/rc.d/init.d/functions
|
|
||||||
|
|
||||||
SERVICE=libvirtd
|
|
||||||
PROCESS=libvirtd
|
|
||||||
PIDFILE=@localstatedir@/run/$SERVICE.pid
|
|
||||||
|
|
||||||
LIBVIRTD_CONFIG=
|
|
||||||
LIBVIRTD_ARGS=
|
|
||||||
KRB5_KTNAME=/etc/libvirt/krb5.tab
|
|
||||||
|
|
||||||
test -f @sysconfdir@/sysconfig/libvirtd && . @sysconfdir@/sysconfig/libvirtd
|
|
||||||
|
|
||||||
export QEMU_AUDIO_DRV
|
|
||||||
export SDL_AUDIODRIVER
|
|
||||||
|
|
||||||
LIBVIRTD_CONFIG_ARGS=
|
|
||||||
if [ -n "$LIBVIRTD_CONFIG" ]
|
|
||||||
then
|
|
||||||
LIBVIRTD_CONFIG_ARGS="--config $LIBVIRTD_CONFIG"
|
|
||||||
fi
|
|
||||||
|
|
||||||
RETVAL=0
|
|
||||||
|
|
||||||
start() {
|
|
||||||
echo -n $"Starting $SERVICE daemon: "
|
|
||||||
mkdir -p @localstatedir@/cache/libvirt
|
|
||||||
rm -rf @localstatedir@/cache/libvirt/*
|
|
||||||
|
|
||||||
# LIBVIRTD_NOFILES_LIMIT from /etc/sysconfig/libvirtd is not handled
|
|
||||||
# automatically
|
|
||||||
if [ -n "$LIBVIRTD_NOFILES_LIMIT" ]; then
|
|
||||||
ulimit -n "$LIBVIRTD_NOFILES_LIMIT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
KRB5_KTNAME=$KRB5_KTNAME daemon --pidfile $PIDFILE --check $SERVICE $PROCESS --daemon $LIBVIRTD_CONFIG_ARGS $LIBVIRTD_ARGS
|
|
||||||
RETVAL=$?
|
|
||||||
echo
|
|
||||||
[ $RETVAL -eq 0 ] && touch @localstatedir@/lock/subsys/$SERVICE
|
|
||||||
}
|
|
||||||
|
|
||||||
stop() {
|
|
||||||
echo -n $"Stopping $SERVICE daemon: "
|
|
||||||
|
|
||||||
killproc -p $PIDFILE $PROCESS
|
|
||||||
RETVAL=$?
|
|
||||||
echo
|
|
||||||
if [ $RETVAL -eq 0 ]; then
|
|
||||||
rm -f @localstatedir@/lock/subsys/$SERVICE
|
|
||||||
rm -rf @localstatedir@/cache/libvirt/*
|
|
||||||
else
|
|
||||||
exit $RETVAL
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
restart() {
|
|
||||||
stop
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
reload() {
|
|
||||||
echo -n $"Reloading $SERVICE configuration: "
|
|
||||||
|
|
||||||
killproc -p $PIDFILE $PROCESS -HUP
|
|
||||||
RETVAL=$?
|
|
||||||
echo
|
|
||||||
return $RETVAL
|
|
||||||
}
|
|
||||||
|
|
||||||
# See how we were called.
|
|
||||||
case "$1" in
|
|
||||||
start|stop|restart|reload)
|
|
||||||
$1
|
|
||||||
;;
|
|
||||||
status)
|
|
||||||
status -p $PIDFILE $PROCESS
|
|
||||||
RETVAL=$?
|
|
||||||
;;
|
|
||||||
force-reload)
|
|
||||||
reload
|
|
||||||
;;
|
|
||||||
condrestart|try-restart)
|
|
||||||
[ -f @localstatedir@/lock/subsys/$SERVICE ] && restart || :
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|force-reload|try-restart}"
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
exit $RETVAL
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@localstatedir@/log/libvirt/libxl/*.log {
|
|
||||||
weekly
|
|
||||||
missingok
|
|
||||||
rotate 4
|
|
||||||
compress
|
|
||||||
delaycompress
|
|
||||||
copytruncate
|
|
||||||
minsize 100k
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@localstatedir@/log/libvirt/libvirtd.log {
|
|
||||||
weekly
|
|
||||||
missingok
|
|
||||||
rotate 4
|
|
||||||
compress
|
|
||||||
delaycompress
|
|
||||||
copytruncate
|
|
||||||
minsize 100k
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@localstatedir@/log/libvirt/lxc/*.log {
|
|
||||||
weekly
|
|
||||||
missingok
|
|
||||||
rotate 4
|
|
||||||
compress
|
|
||||||
delaycompress
|
|
||||||
copytruncate
|
|
||||||
minsize 100k
|
|
||||||
}
|
|
||||||
@@ -1,206 +0,0 @@
|
|||||||
=head1 NAME
|
|
||||||
|
|
||||||
libvirtd - libvirtd management daemon
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
B<libvirtd> [I<OPTION>]...
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
|
||||||
The B<libvirtd> program is the server side daemon component of the libvirt
|
|
||||||
virtualization management system.
|
|
||||||
|
|
||||||
This daemon runs on host servers and performs required management tasks for
|
|
||||||
virtualized guests. This includes activities such as starting, stopping
|
|
||||||
and migrating guests between host servers, configuring and manipulating
|
|
||||||
networking, and managing storage for use by guests.
|
|
||||||
|
|
||||||
The libvirt client libraries and utilities connect to this daemon to issue
|
|
||||||
tasks and collect information about the configuration and resources of the host
|
|
||||||
system and guests.
|
|
||||||
|
|
||||||
By default, the libvirtd daemon listens for requests on a local Unix domain
|
|
||||||
socket. Using the B<-l>|B<--listen> command line option, the libvirtd daemon
|
|
||||||
can be instructed to additionally listen on a TCP/IP socket. The TCP/IP socket
|
|
||||||
to use is defined in the libvirtd configuration file.
|
|
||||||
|
|
||||||
Restarting libvirtd does not impact running guests. Guests continue to operate
|
|
||||||
and will be picked up automatically if their XML configuration has been
|
|
||||||
defined. Any guests whose XML configuration has not been defined will be lost
|
|
||||||
from the configuration.
|
|
||||||
|
|
||||||
=head1 OPTIONS
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item B<-h, --help>
|
|
||||||
|
|
||||||
Display command line help usage then exit.
|
|
||||||
|
|
||||||
=item B<-d, --daemon>
|
|
||||||
|
|
||||||
Run as a daemon & write PID file.
|
|
||||||
|
|
||||||
=item B<-f, --config> I<FILE>
|
|
||||||
|
|
||||||
Use this configuration file, overriding the default value.
|
|
||||||
|
|
||||||
=item B<-l, --listen>
|
|
||||||
|
|
||||||
Listen for TCP/IP connections.
|
|
||||||
|
|
||||||
=item B<-p, --pid-file> I<FILE>
|
|
||||||
|
|
||||||
Use this name for the PID file, overriding the default value.
|
|
||||||
|
|
||||||
=item B<-t, --timeout> I<SECONDS>
|
|
||||||
|
|
||||||
Exit after timeout period (in seconds) elapse with no client connections
|
|
||||||
or registered resources. Be aware that resources such as autostart
|
|
||||||
networks will result in never reaching the timeout, even when there are
|
|
||||||
no client connections.
|
|
||||||
|
|
||||||
=item B<-v, --verbose>
|
|
||||||
|
|
||||||
Enable output of verbose messages.
|
|
||||||
|
|
||||||
=item B< --version>
|
|
||||||
|
|
||||||
Display version information then exit.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 SIGNALS
|
|
||||||
|
|
||||||
On receipt of B<SIGHUP> libvirtd will reload its configuration.
|
|
||||||
|
|
||||||
=head1 FILES
|
|
||||||
|
|
||||||
=head2 When run as B<root>.
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item F<SYSCONFDIR/libvirtd.conf>
|
|
||||||
|
|
||||||
The default configuration file used by libvirtd, unless overridden on the
|
|
||||||
command line using the B<-f>|B<--config> option.
|
|
||||||
|
|
||||||
=item F<LOCALSTATEDIR/run/libvirt/libvirt-sock>
|
|
||||||
|
|
||||||
=item F<LOCALSTATEDIR/run/libvirt/libvirt-sock-ro>
|
|
||||||
|
|
||||||
The sockets libvirtd will use.
|
|
||||||
|
|
||||||
=item F<SYSCONFDIR/pki/CA/cacert.pem>
|
|
||||||
|
|
||||||
The TLS B<Certificate Authority> certificate libvirtd will use.
|
|
||||||
|
|
||||||
=item F<SYSCONFDIR/pki/libvirt/servercert.pem>
|
|
||||||
|
|
||||||
The TLS B<Server> certificate libvirtd will use.
|
|
||||||
|
|
||||||
=item F<SYSCONFDIR/pki/libvirt/private/serverkey.pem>
|
|
||||||
|
|
||||||
The TLS B<Server> private key libvirtd will use.
|
|
||||||
|
|
||||||
=item F<LOCALSTATEDIR/run/libvirtd.pid>
|
|
||||||
|
|
||||||
The PID file to use, unless overridden by the B<-p>|B<--pid-file> option.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head2 When run as B<non-root>.
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item F<$XDG_CONFIG_HOME/libvirtd.conf>
|
|
||||||
|
|
||||||
The default configuration file used by libvirtd, unless overridden on the
|
|
||||||
command line using the B<-f>|B<--config> option.
|
|
||||||
|
|
||||||
=item F<$XDG_RUNTIME_DIR/libvirt/libvirt-sock>
|
|
||||||
|
|
||||||
The socket libvirtd will use.
|
|
||||||
|
|
||||||
=item F<$HOME/.pki/libvirt/cacert.pem>
|
|
||||||
|
|
||||||
The TLS B<Certificate Authority> certificate libvirtd will use.
|
|
||||||
|
|
||||||
=item F<$HOME/.pki/libvirt/servercert.pem>
|
|
||||||
|
|
||||||
The TLS B<Server> certificate libvirtd will use.
|
|
||||||
|
|
||||||
=item F<$HOME/.pki/libvirt/serverkey.pem>
|
|
||||||
|
|
||||||
The TLS B<Server> private key libvirtd will use.
|
|
||||||
|
|
||||||
=item F<$XDG_RUNTIME_DIR/libvirt/libvirtd.pid>
|
|
||||||
|
|
||||||
The PID file to use, unless overridden by the B<-p>|B<--pid-file> option.
|
|
||||||
|
|
||||||
=item If $XDG_CONFIG_HOME is not set in your environment, libvirtd will use F<$HOME/.config>
|
|
||||||
|
|
||||||
=item If $XDG_RUNTIME_DIR is not set in your environment, libvirtd will use F<$HOME/.cache>
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 EXAMPLES
|
|
||||||
|
|
||||||
To retrieve the version of libvirtd:
|
|
||||||
|
|
||||||
# libvirtd --version
|
|
||||||
libvirtd (libvirt) 0.8.2
|
|
||||||
#
|
|
||||||
|
|
||||||
To start libvirtd, instructing it to daemonize and create a PID file:
|
|
||||||
|
|
||||||
# libvirtd -d
|
|
||||||
# ls -la LOCALSTATEDIR/run/libvirtd.pid
|
|
||||||
-rw-r--r-- 1 root root 6 Jul 9 02:40 LOCALSTATEDIR/run/libvirtd.pid
|
|
||||||
#
|
|
||||||
|
|
||||||
=head1 BUGS
|
|
||||||
|
|
||||||
Please report all bugs you discover. This should be done via either:
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item a) the mailing list
|
|
||||||
|
|
||||||
L<http://libvirt.org/contact.html>
|
|
||||||
|
|
||||||
=item or,
|
|
||||||
|
|
||||||
B<>
|
|
||||||
|
|
||||||
=item b) the bug tracker
|
|
||||||
|
|
||||||
L<http://libvirt.org/bugs.html>
|
|
||||||
|
|
||||||
=item Alternatively, you may report bugs to your software distributor / vendor.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 AUTHORS
|
|
||||||
|
|
||||||
Please refer to the AUTHORS file distributed with libvirt.
|
|
||||||
|
|
||||||
=head1 COPYRIGHT
|
|
||||||
|
|
||||||
Copyright (C) 2006-2012 Red Hat, Inc., and the authors listed in the
|
|
||||||
libvirt AUTHORS file.
|
|
||||||
|
|
||||||
=head1 LICENSE
|
|
||||||
|
|
||||||
libvirtd is distributed under the terms of the GNU LGPL v2.1+.
|
|
||||||
This is free software; see the source for copying conditions. There
|
|
||||||
is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE
|
|
||||||
|
|
||||||
=head1 SEE ALSO
|
|
||||||
|
|
||||||
L<virsh(1)>, L<virt-install(1)>, L<virt-xml-validate(1)>, L<virt-top(1)>,
|
|
||||||
L<virt-df(1)>, L<http://www.libvirt.org/>
|
|
||||||
|
|
||||||
=cut
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE policyconfig PUBLIC
|
|
||||||
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
|
|
||||||
"http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Policy definitions for libvirt daemon
|
|
||||||
|
|
||||||
Copyright (C) 2012 Red Hat, Inc.
|
|
||||||
Copyright (C) 2007 Daniel P. Berrange <berrange redhat com>
|
|
||||||
|
|
||||||
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/>.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<policyconfig>
|
|
||||||
<action id="org.libvirt.unix.monitor">
|
|
||||||
<description>Monitor local virtualized systems</description>
|
|
||||||
<message>System policy prevents monitoring of local virtualized systems</message>
|
|
||||||
<defaults>
|
|
||||||
<!-- Any program can use libvirt in read-only mode for monitoring,
|
|
||||||
even if not part of a session -->
|
|
||||||
<allow_any>yes</allow_any>
|
|
||||||
<allow_inactive>yes</allow_inactive>
|
|
||||||
<allow_active>yes</allow_active>
|
|
||||||
</defaults>
|
|
||||||
</action>
|
|
||||||
|
|
||||||
<action id="org.libvirt.unix.manage">
|
|
||||||
<description>Manage local virtualized systems</description>
|
|
||||||
<message>System policy prevents management of local virtualized systems</message>
|
|
||||||
<defaults>
|
|
||||||
<!-- Any program can use libvirt in read/write mode if they
|
|
||||||
provide the root password -->
|
|
||||||
<allow_any>@authaction@</allow_any>
|
|
||||||
<allow_inactive>@authaction@</allow_inactive>
|
|
||||||
<allow_active>@authaction@</allow_active>
|
|
||||||
</defaults>
|
|
||||||
</action>
|
|
||||||
</policyconfig>
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@localstatedir@/log/libvirt/qemu/*.log {
|
|
||||||
weekly
|
|
||||||
missingok
|
|
||||||
rotate 4
|
|
||||||
compress
|
|
||||||
delaycompress
|
|
||||||
copytruncate
|
|
||||||
minsize 100k
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# If you want to use the non-TLS socket, then you *must* include
|
|
||||||
# the GSSAPI or DIGEST-MD5 mechanisms, because they are the only
|
|
||||||
# ones that can offer session encryption as well as authentication.
|
|
||||||
#
|
|
||||||
# If you're only using TLS, then you can turn on any mechanisms
|
|
||||||
# you like for authentication, because TLS provides the encryption
|
|
||||||
#
|
|
||||||
# Default to a simple username+password mechanism
|
|
||||||
mech_list: digest-md5
|
|
||||||
|
|
||||||
# Before you can use GSSAPI, you need a service principle on the
|
|
||||||
# KDC server for libvirt, and that to be exported to the keytab
|
|
||||||
# file listed below
|
|
||||||
#mech_list: gssapi
|
|
||||||
#
|
|
||||||
# You can also list many mechanisms at once, then the user can choose
|
|
||||||
# by adding '?auth=sasl.gssapi' to their libvirt URI, eg
|
|
||||||
# qemu+tcp://hostname/system?auth=sasl.gssapi
|
|
||||||
#mech_list: digest-md5 gssapi
|
|
||||||
|
|
||||||
# Some older builds of MIT kerberos on Linux ignore this option &
|
|
||||||
# instead need KRB5_KTNAME env var.
|
|
||||||
# For modern Linux, and other OS, this should be sufficient
|
|
||||||
#
|
|
||||||
# There is no default value here, uncomment if you need this
|
|
||||||
#keytab: /etc/libvirt/krb5.tab
|
|
||||||
|
|
||||||
# If using digest-md5 for username/passwds, then this is the file
|
|
||||||
# containing the passwds. Use 'saslpasswd2 -a libvirt [username]'
|
|
||||||
# to add entries, and 'sasldblistusers2 -f [sasldb_path]' to browse it
|
|
||||||
sasldb_path: /etc/libvirt/passwd.db
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# NB we don't use socket activation. When libvirtd starts it will
|
|
||||||
# spawn any virtual machines registered for autostart. We want this
|
|
||||||
# to occur on every boot, regardless of whether any client connects
|
|
||||||
# to a socket. Thus socket activation doesn't have any benefit
|
|
||||||
|
|
||||||
[Unit]
|
|
||||||
Description=Virtualization daemon
|
|
||||||
Before=libvirt-guests.service
|
|
||||||
After=network.target
|
|
||||||
After=dbus.service
|
|
||||||
After=iscsid.service
|
|
||||||
After=apparmor.service
|
|
||||||
After=local-fs.target
|
|
||||||
After=remote-fs.target
|
|
||||||
Documentation=man:libvirtd(8)
|
|
||||||
Documentation=http://libvirt.org
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=notify
|
|
||||||
EnvironmentFile=-/etc/sysconfig/libvirtd
|
|
||||||
ExecStart=@sbindir@/libvirtd $LIBVIRTD_ARGS
|
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
|
||||||
KillMode=process
|
|
||||||
Restart=on-failure
|
|
||||||
# Override the maximum number of opened files
|
|
||||||
#LimitNOFILE=2048
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
Also=virtlockd.socket
|
|
||||||
Also=virtlogd.socket
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# Override the default config file
|
|
||||||
# NOTE: This setting is no longer honoured if using
|
|
||||||
# systemd. Set '--config /etc/libvirt/libvirtd.conf'
|
|
||||||
# in LIBVIRTD_ARGS instead.
|
|
||||||
#LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
|
|
||||||
|
|
||||||
# Listen for TCP/IP connections
|
|
||||||
# NB. must setup TLS/SSL keys prior to using this
|
|
||||||
#LIBVIRTD_ARGS="--listen"
|
|
||||||
|
|
||||||
# Override Kerberos service keytab for SASL/GSSAPI
|
|
||||||
#KRB5_KTNAME=/etc/libvirt/krb5.tab
|
|
||||||
|
|
||||||
# Override the QEMU/SDL default audio driver probing when
|
|
||||||
# starting virtual machines using SDL graphics
|
|
||||||
#
|
|
||||||
# NB these have no effect for VMs using VNC, unless vnc_allow_host_audio
|
|
||||||
# is enabled in /etc/libvirt/qemu.conf
|
|
||||||
#QEMU_AUDIO_DRV=sdl
|
|
||||||
#
|
|
||||||
#SDL_AUDIODRIVER=pulse
|
|
||||||
|
|
||||||
# Override the maximum number of opened files.
|
|
||||||
# This only works with traditional init scripts.
|
|
||||||
# In the systemd world, the limit can only be changed by overriding
|
|
||||||
# LimitNOFILE for libvirtd.service. To do that, just create a *.conf
|
|
||||||
# file in /etc/systemd/system/libvirtd.service.d/ (for example
|
|
||||||
# /etc/systemd/system/libvirtd.service.d/openfiles.conf) and write
|
|
||||||
# the following two lines in it:
|
|
||||||
# [Service]
|
|
||||||
# LimitNOFILE=2048
|
|
||||||
#
|
|
||||||
#LIBVIRTD_NOFILES_LIMIT=2048
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# The kernel allocates aio memory on demand, and this number limits the
|
|
||||||
# number of parallel aio requests; the only drawback of a larger limit is
|
|
||||||
# that a malicious guest could issue parallel requests to cause the kernel
|
|
||||||
# to set aside memory. Set this number at least as large as
|
|
||||||
# 128 * (number of virtual disks on the host)
|
|
||||||
# Libvirt uses a default of 1M requests to allow 8k disks, with at most
|
|
||||||
# 64M of kernel memory if all disks hit an aio request at the same time.
|
|
||||||
fs.aio-max-nr = 1048576
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@localstatedir@/log/libvirt/uml/*.log {
|
|
||||||
weekly
|
|
||||||
missingok
|
|
||||||
rotate 4
|
|
||||||
compress
|
|
||||||
delaycompress
|
|
||||||
copytruncate
|
|
||||||
minsize 100k
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# libvirtd upstart job
|
|
||||||
#
|
|
||||||
# XXX wait for rc to get all dependent initscripts started
|
|
||||||
# from sysv libvirtd initscript: Required-Start: $network messagebus
|
|
||||||
start on stopped rc RUNLEVEL=[345]
|
|
||||||
stop on runlevel [!345]
|
|
||||||
|
|
||||||
respawn
|
|
||||||
|
|
||||||
script
|
|
||||||
LIBVIRTD_CONFIG=
|
|
||||||
LIBVIRTD_ARGS=
|
|
||||||
KRB5_KTNAME=/etc/libvirt/krb5.tab
|
|
||||||
|
|
||||||
if [ -f /etc/sysconfig/libvirtd ]; then
|
|
||||||
. /etc/sysconfig/libvirtd
|
|
||||||
fi
|
|
||||||
|
|
||||||
export QEMU_AUDIO_DRV
|
|
||||||
export SDL_AUDIODRIVER
|
|
||||||
export KRB5_KTNAME
|
|
||||||
|
|
||||||
LIBVIRTD_CONFIG_ARGS=
|
|
||||||
if [ -n "$LIBVIRTD_CONFIG" ]; then
|
|
||||||
LIBVIRTD_CONFIG_ARGS="--config $LIBVIRTD_CONFIG"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# DAEMON_COREFILE_LIMIT from /etc/sysconfig/libvirtd is not handled
|
|
||||||
# automatically
|
|
||||||
if [ -n "$DAEMON_COREFILE_LIMIT" ]; then
|
|
||||||
ulimit -c "$DAEMON_COREFILE_LIMIT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# LIBVIRTD_NOFILES_LIMIT from /etc/sysconfig/libvirtd is not handled
|
|
||||||
# automatically
|
|
||||||
if [ -n "$LIBVIRTD_NOFILES_LIMIT" ]; then
|
|
||||||
ulimit -n "$LIBVIRTD_NOFILES_LIMIT"
|
|
||||||
fi
|
|
||||||
mkdir -p /var/cache/libvirt
|
|
||||||
rm -rf /var/cache/libvirt/*
|
|
||||||
|
|
||||||
exec /usr/sbin/libvirtd $LIBVIRTD_CONFIG_ARGS $LIBVIRTD_ARGS
|
|
||||||
end script
|
|
||||||
|
|
||||||
post-stop script
|
|
||||||
rm -rf /var/cache/libvirt/*
|
|
||||||
end script
|
|
||||||
6532
daemon/remote.c
6532
daemon/remote.c
File diff suppressed because it is too large
Load Diff
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* remote.h: handlers for RPC method calls
|
|
||||||
*
|
|
||||||
* Copyright (C) 2007, 2008, 2009 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/>.
|
|
||||||
*
|
|
||||||
* Author: Richard W.M. Jones <rjones@redhat.com>
|
|
||||||
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LIBVIRTD_REMOTE_H__
|
|
||||||
# define __LIBVIRTD_REMOTE_H__
|
|
||||||
|
|
||||||
# include "remote_protocol.h"
|
|
||||||
# include "rpc/virnetserverprogram.h"
|
|
||||||
# include "rpc/virnetserverclient.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern virNetServerProgramProc remoteProcs[];
|
|
||||||
extern size_t remoteNProcs;
|
|
||||||
|
|
||||||
extern virNetServerProgramProc lxcProcs[];
|
|
||||||
extern size_t lxcNProcs;
|
|
||||||
|
|
||||||
extern virNetServerProgramProc qemuProcs[];
|
|
||||||
extern size_t qemuNProcs;
|
|
||||||
|
|
||||||
void remoteClientFreeFunc(void *data);
|
|
||||||
void *remoteClientInitHook(virNetServerClientPtr client,
|
|
||||||
void *opaque);
|
|
||||||
|
|
||||||
#endif /* __LIBVIRTD_REMOTE_H__ */
|
|
||||||
796
daemon/stream.c
796
daemon/stream.c
@@ -1,796 +0,0 @@
|
|||||||
/*
|
|
||||||
* stream.c: APIs for managing client streams
|
|
||||||
*
|
|
||||||
* Copyright (C) 2009-2014 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/>.
|
|
||||||
*
|
|
||||||
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "stream.h"
|
|
||||||
#include "remote.h"
|
|
||||||
#include "viralloc.h"
|
|
||||||
#include "virlog.h"
|
|
||||||
#include "virnetserverclient.h"
|
|
||||||
#include "virerror.h"
|
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_STREAMS
|
|
||||||
|
|
||||||
VIR_LOG_INIT("daemon.stream");
|
|
||||||
|
|
||||||
struct daemonClientStream {
|
|
||||||
daemonClientPrivatePtr priv;
|
|
||||||
int refs;
|
|
||||||
|
|
||||||
virNetServerProgramPtr prog;
|
|
||||||
|
|
||||||
virStreamPtr st;
|
|
||||||
int procedure;
|
|
||||||
unsigned int serial;
|
|
||||||
|
|
||||||
bool recvEOF;
|
|
||||||
bool closed;
|
|
||||||
|
|
||||||
int filterID;
|
|
||||||
|
|
||||||
virNetMessagePtr rx;
|
|
||||||
bool tx;
|
|
||||||
|
|
||||||
daemonClientStreamPtr next;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
daemonStreamHandleWrite(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream);
|
|
||||||
static int
|
|
||||||
daemonStreamHandleRead(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream);
|
|
||||||
static int
|
|
||||||
daemonStreamHandleFinish(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream,
|
|
||||||
virNetMessagePtr msg);
|
|
||||||
static int
|
|
||||||
daemonStreamHandleAbort(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream,
|
|
||||||
virNetMessagePtr msg);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
daemonStreamUpdateEvents(daemonClientStream *stream)
|
|
||||||
{
|
|
||||||
int newEvents = 0;
|
|
||||||
if (stream->closed)
|
|
||||||
return;
|
|
||||||
if (stream->rx)
|
|
||||||
newEvents |= VIR_STREAM_EVENT_WRITABLE;
|
|
||||||
if (stream->tx && !stream->recvEOF)
|
|
||||||
newEvents |= VIR_STREAM_EVENT_READABLE;
|
|
||||||
|
|
||||||
virStreamEventUpdateCallback(stream->st, newEvents);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Invoked when an outgoing data packet message has been fully sent.
|
|
||||||
* This simply re-enables TX of further data.
|
|
||||||
*
|
|
||||||
* The idea is to stop the daemon growing without bound due to
|
|
||||||
* fast stream, but slow client
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
daemonStreamMessageFinished(virNetMessagePtr msg,
|
|
||||||
void *opaque)
|
|
||||||
{
|
|
||||||
daemonClientStream *stream = opaque;
|
|
||||||
VIR_DEBUG("stream=%p proc=%d serial=%u",
|
|
||||||
stream, msg->header.proc, msg->header.serial);
|
|
||||||
|
|
||||||
stream->tx = true;
|
|
||||||
daemonStreamUpdateEvents(stream);
|
|
||||||
|
|
||||||
daemonFreeClientStream(NULL, stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Callback that gets invoked when a stream becomes writable/readable
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
daemonStreamEvent(virStreamPtr st, int events, void *opaque)
|
|
||||||
{
|
|
||||||
virNetServerClientPtr client = opaque;
|
|
||||||
daemonClientStream *stream;
|
|
||||||
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
virMutexLock(&priv->lock);
|
|
||||||
|
|
||||||
stream = priv->streams;
|
|
||||||
while (stream) {
|
|
||||||
if (stream->st == st)
|
|
||||||
break;
|
|
||||||
stream = stream->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stream) {
|
|
||||||
VIR_WARN("event for client=%p stream st=%p, but missing stream state", client, st);
|
|
||||||
virStreamEventRemoveCallback(st);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
VIR_DEBUG("st=%p events=%d EOF=%d closed=%d", st, events, stream->recvEOF, stream->closed);
|
|
||||||
|
|
||||||
if (!stream->closed &&
|
|
||||||
(events & VIR_STREAM_EVENT_WRITABLE)) {
|
|
||||||
if (daemonStreamHandleWrite(client, stream) < 0) {
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stream->closed && !stream->recvEOF &&
|
|
||||||
(events & (VIR_STREAM_EVENT_READABLE))) {
|
|
||||||
events = events & ~(VIR_STREAM_EVENT_READABLE);
|
|
||||||
if (daemonStreamHandleRead(client, stream) < 0) {
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
/* If we detected EOF during read processing,
|
|
||||||
* then clear hangup/error conditions, since
|
|
||||||
* we want the client to see the EOF message
|
|
||||||
* we just sent them
|
|
||||||
*/
|
|
||||||
if (stream->recvEOF)
|
|
||||||
events = events & ~(VIR_STREAM_EVENT_HANGUP |
|
|
||||||
VIR_STREAM_EVENT_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we have a completion/abort message, always process it */
|
|
||||||
if (stream->rx) {
|
|
||||||
virNetMessagePtr msg = stream->rx;
|
|
||||||
switch (msg->header.status) {
|
|
||||||
case VIR_NET_CONTINUE:
|
|
||||||
/* nada */
|
|
||||||
break;
|
|
||||||
case VIR_NET_OK:
|
|
||||||
virNetMessageQueueServe(&stream->rx);
|
|
||||||
if (daemonStreamHandleFinish(client, stream, msg) < 0) {
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case VIR_NET_ERROR:
|
|
||||||
default:
|
|
||||||
virNetMessageQueueServe(&stream->rx);
|
|
||||||
if (daemonStreamHandleAbort(client, stream, msg) < 0) {
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* If we got HANGUP, we need to only send an empty
|
|
||||||
* packet so the client sees an EOF and cleans up
|
|
||||||
*/
|
|
||||||
if (!stream->closed && !stream->recvEOF &&
|
|
||||||
(events & VIR_STREAM_EVENT_HANGUP)) {
|
|
||||||
virNetMessagePtr msg;
|
|
||||||
events &= ~(VIR_STREAM_EVENT_HANGUP);
|
|
||||||
stream->tx = false;
|
|
||||||
stream->recvEOF = true;
|
|
||||||
if (!(msg = virNetMessageNew(false))) {
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
msg->cb = daemonStreamMessageFinished;
|
|
||||||
msg->opaque = stream;
|
|
||||||
stream->refs++;
|
|
||||||
if (virNetServerProgramSendStreamData(remoteProgram,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
stream->procedure,
|
|
||||||
stream->serial,
|
|
||||||
"", 0) < 0) {
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stream->closed &&
|
|
||||||
(events & (VIR_STREAM_EVENT_ERROR | VIR_STREAM_EVENT_HANGUP))) {
|
|
||||||
int ret;
|
|
||||||
virNetMessagePtr msg;
|
|
||||||
virNetMessageError rerr;
|
|
||||||
|
|
||||||
memset(&rerr, 0, sizeof(rerr));
|
|
||||||
stream->closed = true;
|
|
||||||
virStreamEventRemoveCallback(stream->st);
|
|
||||||
virStreamAbort(stream->st);
|
|
||||||
if (events & VIR_STREAM_EVENT_HANGUP)
|
|
||||||
virReportError(VIR_ERR_RPC,
|
|
||||||
"%s", _("stream had unexpected termination"));
|
|
||||||
else
|
|
||||||
virReportError(VIR_ERR_RPC,
|
|
||||||
"%s", _("stream had I/O failure"));
|
|
||||||
|
|
||||||
msg = virNetMessageNew(false);
|
|
||||||
if (!msg) {
|
|
||||||
ret = -1;
|
|
||||||
} else {
|
|
||||||
ret = virNetServerProgramSendStreamError(remoteProgram,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
&rerr,
|
|
||||||
stream->procedure,
|
|
||||||
stream->serial);
|
|
||||||
}
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
if (ret < 0)
|
|
||||||
virNetServerClientClose(client);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stream->closed) {
|
|
||||||
daemonRemoveClientStream(client, stream);
|
|
||||||
} else {
|
|
||||||
daemonStreamUpdateEvents(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virMutexUnlock(&priv->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @client: a locked client object
|
|
||||||
*
|
|
||||||
* Invoked by the main loop when filtering incoming messages.
|
|
||||||
*
|
|
||||||
* Returns 1 if the message was processed, 0 if skipped,
|
|
||||||
* -1 on fatal client error
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
|
||||||
virNetMessagePtr msg,
|
|
||||||
void *opaque)
|
|
||||||
{
|
|
||||||
daemonClientStream *stream = opaque;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
virMutexLock(&stream->priv->lock);
|
|
||||||
|
|
||||||
if (msg->header.type != VIR_NET_STREAM)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!virNetServerProgramMatches(stream->prog, msg))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (msg->header.proc != stream->procedure ||
|
|
||||||
msg->header.serial != stream->serial)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
VIR_DEBUG("Incoming client=%p, rx=%p, serial=%u, proc=%d, status=%d",
|
|
||||||
client, stream->rx, msg->header.proc,
|
|
||||||
msg->header.serial, msg->header.status);
|
|
||||||
|
|
||||||
virNetMessageQueuePush(&stream->rx, msg);
|
|
||||||
daemonStreamUpdateEvents(stream);
|
|
||||||
ret = 1;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virMutexUnlock(&stream->priv->lock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @conn: a connection object to associate the stream with
|
|
||||||
* @header: the method call to associate with the stream
|
|
||||||
*
|
|
||||||
* Creates a new stream for this conn
|
|
||||||
*
|
|
||||||
* Returns a new stream object, or NULL upon OOM
|
|
||||||
*/
|
|
||||||
daemonClientStream *
|
|
||||||
daemonCreateClientStream(virNetServerClientPtr client,
|
|
||||||
virStreamPtr st,
|
|
||||||
virNetServerProgramPtr prog,
|
|
||||||
virNetMessageHeaderPtr header)
|
|
||||||
{
|
|
||||||
daemonClientStream *stream;
|
|
||||||
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
|
|
||||||
client, header->proc, header->serial, st);
|
|
||||||
|
|
||||||
if (VIR_ALLOC(stream) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
stream->refs = 1;
|
|
||||||
stream->priv = priv;
|
|
||||||
stream->prog = virObjectRef(prog);
|
|
||||||
stream->procedure = header->proc;
|
|
||||||
stream->serial = header->serial;
|
|
||||||
stream->filterID = -1;
|
|
||||||
stream->st = st;
|
|
||||||
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @stream: an unused client stream
|
|
||||||
*
|
|
||||||
* Frees the memory associated with this inactive client
|
|
||||||
* stream
|
|
||||||
*/
|
|
||||||
int daemonFreeClientStream(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream)
|
|
||||||
{
|
|
||||||
virNetMessagePtr msg;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (!stream)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
stream->refs--;
|
|
||||||
if (stream->refs)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
VIR_DEBUG("client=%p, proc=%d, serial=%u",
|
|
||||||
client, stream->procedure, stream->serial);
|
|
||||||
|
|
||||||
virObjectUnref(stream->prog);
|
|
||||||
|
|
||||||
msg = stream->rx;
|
|
||||||
while (msg) {
|
|
||||||
virNetMessagePtr tmp = msg->next;
|
|
||||||
if (client) {
|
|
||||||
/* Send a dummy reply to free up 'msg' & unblock client rx */
|
|
||||||
virNetMessageClear(msg);
|
|
||||||
msg->header.type = VIR_NET_REPLY;
|
|
||||||
if (virNetServerClientSendMessage(client, msg) < 0) {
|
|
||||||
virNetServerClientImmediateClose(client);
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
}
|
|
||||||
msg = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
virObjectUnref(stream->st);
|
|
||||||
VIR_FREE(stream);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @client: a locked client to add the stream to
|
|
||||||
* @stream: a stream to add
|
|
||||||
*/
|
|
||||||
int daemonAddClientStream(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream,
|
|
||||||
bool transmit)
|
|
||||||
{
|
|
||||||
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p, transmit=%d",
|
|
||||||
client, stream->procedure, stream->serial, stream->st, transmit);
|
|
||||||
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
|
||||||
|
|
||||||
if (stream->filterID != -1) {
|
|
||||||
VIR_WARN("Filter already added to client %p", client);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virStreamEventAddCallback(stream->st, 0,
|
|
||||||
daemonStreamEvent, client,
|
|
||||||
virObjectFreeCallback) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
virObjectRef(client);
|
|
||||||
|
|
||||||
if ((stream->filterID = virNetServerClientAddFilter(client,
|
|
||||||
daemonStreamFilter,
|
|
||||||
stream)) < 0) {
|
|
||||||
virStreamEventRemoveCallback(stream->st);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (transmit)
|
|
||||||
stream->tx = true;
|
|
||||||
|
|
||||||
virMutexLock(&priv->lock);
|
|
||||||
stream->next = priv->streams;
|
|
||||||
priv->streams = stream;
|
|
||||||
|
|
||||||
daemonStreamUpdateEvents(stream);
|
|
||||||
|
|
||||||
virMutexUnlock(&priv->lock);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @client: a locked client object
|
|
||||||
* @stream: an inactive, closed stream object
|
|
||||||
*
|
|
||||||
* Removes a stream from the list of active streams for the client
|
|
||||||
*
|
|
||||||
* Returns 0 if the stream was removd, -1 if it doesn't exist
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
daemonRemoveClientStream(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream)
|
|
||||||
{
|
|
||||||
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
|
|
||||||
client, stream->procedure, stream->serial, stream->st);
|
|
||||||
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
|
||||||
daemonClientStream *curr = priv->streams;
|
|
||||||
daemonClientStream *prev = NULL;
|
|
||||||
|
|
||||||
if (stream->filterID != -1) {
|
|
||||||
virNetServerClientRemoveFilter(client,
|
|
||||||
stream->filterID);
|
|
||||||
stream->filterID = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stream->closed) {
|
|
||||||
stream->closed = true;
|
|
||||||
virStreamEventRemoveCallback(stream->st);
|
|
||||||
virStreamAbort(stream->st);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (curr) {
|
|
||||||
if (curr == stream) {
|
|
||||||
if (prev)
|
|
||||||
prev->next = curr->next;
|
|
||||||
else
|
|
||||||
priv->streams = curr->next;
|
|
||||||
return daemonFreeClientStream(client, stream);
|
|
||||||
}
|
|
||||||
prev = curr;
|
|
||||||
curr = curr->next;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
daemonRemoveAllClientStreams(daemonClientStream *stream)
|
|
||||||
{
|
|
||||||
daemonClientStream *tmp;
|
|
||||||
|
|
||||||
VIR_DEBUG("stream=%p", stream);
|
|
||||||
|
|
||||||
while (stream) {
|
|
||||||
tmp = stream->next;
|
|
||||||
|
|
||||||
if (!stream->closed) {
|
|
||||||
stream->closed = true;
|
|
||||||
virStreamEventRemoveCallback(stream->st);
|
|
||||||
virStreamAbort(stream->st);
|
|
||||||
}
|
|
||||||
|
|
||||||
daemonFreeClientStream(NULL, stream);
|
|
||||||
|
|
||||||
VIR_DEBUG("next stream=%p", tmp);
|
|
||||||
stream = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns:
|
|
||||||
* -1 if fatal error occurred
|
|
||||||
* 0 if message was fully processed
|
|
||||||
* 1 if message is still being processed
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
daemonStreamHandleWriteData(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream,
|
|
||||||
virNetMessagePtr msg)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u, len=%zu, offset=%zu",
|
|
||||||
client, stream, msg->header.proc, msg->header.serial,
|
|
||||||
msg->bufferLength, msg->bufferOffset);
|
|
||||||
|
|
||||||
ret = virStreamSend(stream->st,
|
|
||||||
msg->buffer + msg->bufferOffset,
|
|
||||||
msg->bufferLength - msg->bufferOffset);
|
|
||||||
|
|
||||||
if (ret > 0) {
|
|
||||||
msg->bufferOffset += ret;
|
|
||||||
|
|
||||||
/* Partial write, so indicate we have more todo later */
|
|
||||||
if (msg->bufferOffset < msg->bufferLength)
|
|
||||||
return 1;
|
|
||||||
} else if (ret == -2) {
|
|
||||||
/* Blocking, so indicate we have more todo later */
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
virNetMessageError rerr;
|
|
||||||
|
|
||||||
memset(&rerr, 0, sizeof(rerr));
|
|
||||||
|
|
||||||
VIR_INFO("Stream send failed");
|
|
||||||
stream->closed = true;
|
|
||||||
virStreamEventRemoveCallback(stream->st);
|
|
||||||
virStreamAbort(stream->st);
|
|
||||||
|
|
||||||
return virNetServerProgramSendReplyError(stream->prog,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
&rerr,
|
|
||||||
&msg->header);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process a finish handshake from the client.
|
|
||||||
*
|
|
||||||
* Returns a VIR_NET_OK confirmation if successful, or a VIR_NET_ERROR
|
|
||||||
* if there was a stream error
|
|
||||||
*
|
|
||||||
* Returns 0 if successfully sent RPC reply, -1 upon fatal error
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
daemonStreamHandleFinish(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream,
|
|
||||||
virNetMessagePtr msg)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
|
|
||||||
client, stream, msg->header.proc, msg->header.serial);
|
|
||||||
|
|
||||||
stream->closed = true;
|
|
||||||
virStreamEventRemoveCallback(stream->st);
|
|
||||||
ret = virStreamFinish(stream->st);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
virNetMessageError rerr;
|
|
||||||
memset(&rerr, 0, sizeof(rerr));
|
|
||||||
return virNetServerProgramSendReplyError(stream->prog,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
&rerr,
|
|
||||||
&msg->header);
|
|
||||||
} else {
|
|
||||||
/* Send zero-length confirm */
|
|
||||||
return virNetServerProgramSendStreamData(stream->prog,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
stream->procedure,
|
|
||||||
stream->serial,
|
|
||||||
NULL, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process an abort request from the client.
|
|
||||||
*
|
|
||||||
* Returns 0 if successfully aborted, -1 upon error
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
daemonStreamHandleAbort(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream,
|
|
||||||
virNetMessagePtr msg)
|
|
||||||
{
|
|
||||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
|
|
||||||
client, stream, msg->header.proc, msg->header.serial);
|
|
||||||
int ret;
|
|
||||||
bool raise_error = false;
|
|
||||||
|
|
||||||
stream->closed = true;
|
|
||||||
virStreamEventRemoveCallback(stream->st);
|
|
||||||
ret = virStreamAbort(stream->st);
|
|
||||||
|
|
||||||
if (msg->header.status == VIR_NET_ERROR) {
|
|
||||||
VIR_INFO("stream aborted at client request");
|
|
||||||
raise_error = (ret < 0);
|
|
||||||
} else {
|
|
||||||
virReportError(VIR_ERR_RPC,
|
|
||||||
_("stream aborted with unexpected status %d"),
|
|
||||||
msg->header.status);
|
|
||||||
raise_error = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (raise_error) {
|
|
||||||
virNetMessageError rerr;
|
|
||||||
memset(&rerr, 0, sizeof(rerr));
|
|
||||||
return virNetServerProgramSendReplyError(remoteProgram,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
&rerr,
|
|
||||||
&msg->header);
|
|
||||||
} else {
|
|
||||||
/* Send zero-length confirm */
|
|
||||||
return virNetServerProgramSendStreamData(stream->prog,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
stream->procedure,
|
|
||||||
stream->serial,
|
|
||||||
NULL, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called when the stream is signalled has being able to accept
|
|
||||||
* data writes. Will process all pending incoming messages
|
|
||||||
* until they're all gone, or I/O blocks
|
|
||||||
*
|
|
||||||
* Returns 0 on success, or -1 upon fatal error
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
daemonStreamHandleWrite(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream)
|
|
||||||
{
|
|
||||||
VIR_DEBUG("client=%p, stream=%p", client, stream);
|
|
||||||
|
|
||||||
while (stream->rx && !stream->closed) {
|
|
||||||
virNetMessagePtr msg = stream->rx;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
switch (msg->header.status) {
|
|
||||||
case VIR_NET_OK:
|
|
||||||
ret = daemonStreamHandleFinish(client, stream, msg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_NET_CONTINUE:
|
|
||||||
ret = daemonStreamHandleWriteData(client, stream, msg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_NET_ERROR:
|
|
||||||
default:
|
|
||||||
ret = daemonStreamHandleAbort(client, stream, msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret > 0)
|
|
||||||
break; /* still processing data from msg */
|
|
||||||
|
|
||||||
virNetMessageQueueServe(&stream->rx);
|
|
||||||
if (ret < 0) {
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
virNetServerClientImmediateClose(client);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 'CONTINUE' messages don't send a reply (unless error
|
|
||||||
* occurred), so to release the 'msg' object we need to
|
|
||||||
* send a fake zero-length reply. Nothing actually gets
|
|
||||||
* onto the wire, but this causes the client to reset
|
|
||||||
* its active request count / throttling
|
|
||||||
*/
|
|
||||||
if (msg->header.status == VIR_NET_CONTINUE) {
|
|
||||||
virNetMessageClear(msg);
|
|
||||||
msg->header.type = VIR_NET_REPLY;
|
|
||||||
if (virNetServerClientSendMessage(client, msg) < 0) {
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
virNetServerClientImmediateClose(client);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Invoked when a stream is signalled as having data
|
|
||||||
* available to read. This reads up to one message
|
|
||||||
* worth of data, and then queues that for transmission
|
|
||||||
* to the client.
|
|
||||||
*
|
|
||||||
* Returns 0 if data was queued for TX, or a error RPC
|
|
||||||
* was sent, or -1 on fatal error, indicating client should
|
|
||||||
* be killed
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
daemonStreamHandleRead(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream)
|
|
||||||
{
|
|
||||||
virNetMessagePtr msg = NULL;
|
|
||||||
virNetMessageError rerr;
|
|
||||||
char *buffer;
|
|
||||||
size_t bufferLen = VIR_NET_MESSAGE_LEGACY_PAYLOAD_MAX;
|
|
||||||
int ret = -1;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
VIR_DEBUG("client=%p, stream=%p tx=%d closed=%d",
|
|
||||||
client, stream, stream->tx, stream->closed);
|
|
||||||
|
|
||||||
/* We might have had an event pending before we shut
|
|
||||||
* down the stream, so if we're marked as closed,
|
|
||||||
* then do nothing
|
|
||||||
*/
|
|
||||||
if (stream->closed)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Shouldn't ever be called unless we're marked able to
|
|
||||||
* transmit, but doesn't hurt to check */
|
|
||||||
if (!stream->tx)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
memset(&rerr, 0, sizeof(rerr));
|
|
||||||
|
|
||||||
if (VIR_ALLOC_N(buffer, bufferLen) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (!(msg = virNetMessageNew(false)))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
rv = virStreamRecv(stream->st, buffer, bufferLen);
|
|
||||||
if (rv == -2) {
|
|
||||||
/* Should never get this, since we're only called when we know
|
|
||||||
* we're readable, but hey things change... */
|
|
||||||
} else if (rv < 0) {
|
|
||||||
if (virNetServerProgramSendStreamError(remoteProgram,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
&rerr,
|
|
||||||
stream->procedure,
|
|
||||||
stream->serial) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
msg = NULL;
|
|
||||||
} else {
|
|
||||||
stream->tx = false;
|
|
||||||
if (rv == 0)
|
|
||||||
stream->recvEOF = true;
|
|
||||||
|
|
||||||
msg->cb = daemonStreamMessageFinished;
|
|
||||||
msg->opaque = stream;
|
|
||||||
stream->refs++;
|
|
||||||
if (virNetServerProgramSendStreamData(remoteProgram,
|
|
||||||
client,
|
|
||||||
msg,
|
|
||||||
stream->procedure,
|
|
||||||
stream->serial,
|
|
||||||
buffer, rv) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
msg = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
cleanup:
|
|
||||||
VIR_FREE(buffer);
|
|
||||||
virNetMessageFree(msg);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* stream.h: APIs for managing client streams
|
|
||||||
*
|
|
||||||
* Copyright (C) 2009 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/>.
|
|
||||||
*
|
|
||||||
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __LIBVIRTD_STREAM_H__
|
|
||||||
# define __LIBVIRTD_STREAM_H__
|
|
||||||
|
|
||||||
# include "libvirtd.h"
|
|
||||||
|
|
||||||
daemonClientStream *
|
|
||||||
daemonCreateClientStream(virNetServerClientPtr client,
|
|
||||||
virStreamPtr st,
|
|
||||||
virNetServerProgramPtr prog,
|
|
||||||
virNetMessageHeaderPtr hdr);
|
|
||||||
|
|
||||||
int daemonFreeClientStream(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream);
|
|
||||||
|
|
||||||
int daemonAddClientStream(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream,
|
|
||||||
bool transmit);
|
|
||||||
|
|
||||||
int
|
|
||||||
daemonRemoveClientStream(virNetServerClientPtr client,
|
|
||||||
daemonClientStream *stream);
|
|
||||||
|
|
||||||
void
|
|
||||||
daemonRemoveAllClientStreams(daemonClientStream *stream);
|
|
||||||
|
|
||||||
#endif /* __LIBVIRTD_STREAM_H__ */
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
module Test_libvirtd =
|
|
||||||
::CONFIG::
|
|
||||||
|
|
||||||
test Libvirtd.lns get conf =
|
|
||||||
{ "listen_tls" = "0" }
|
|
||||||
{ "listen_tcp" = "1" }
|
|
||||||
{ "tls_port" = "16514" }
|
|
||||||
{ "tcp_port" = "16509" }
|
|
||||||
{ "listen_addr" = "192.168.0.1" }
|
|
||||||
{ "mdns_adv" = "1" }
|
|
||||||
{ "mdns_name" = "Virtualization Host Joe Demo" }
|
|
||||||
{ "unix_sock_group" = "libvirt" }
|
|
||||||
{ "unix_sock_ro_perms" = "0777" }
|
|
||||||
{ "unix_sock_rw_perms" = "0770" }
|
|
||||||
{ "unix_sock_admin_perms" = "0700" }
|
|
||||||
{ "unix_sock_dir" = "/var/run/libvirt" }
|
|
||||||
{ "auth_unix_ro" = "none" }
|
|
||||||
{ "auth_unix_rw" = "none" }
|
|
||||||
{ "auth_tcp" = "sasl" }
|
|
||||||
{ "auth_tls" = "none" }
|
|
||||||
{ "access_drivers"
|
|
||||||
{ "1" = "polkit" }
|
|
||||||
}
|
|
||||||
{ "key_file" = "/etc/pki/libvirt/private/serverkey.pem" }
|
|
||||||
{ "cert_file" = "/etc/pki/libvirt/servercert.pem" }
|
|
||||||
{ "ca_file" = "/etc/pki/CA/cacert.pem" }
|
|
||||||
{ "crl_file" = "/etc/pki/CA/crl.pem" }
|
|
||||||
{ "tls_no_sanity_certificate" = "1" }
|
|
||||||
{ "tls_no_verify_certificate" = "1" }
|
|
||||||
{ "tls_allowed_dn_list"
|
|
||||||
{ "1" = "DN1"}
|
|
||||||
{ "2" = "DN2"}
|
|
||||||
}
|
|
||||||
{ "sasl_allowed_username_list"
|
|
||||||
{ "1" = "joe@EXAMPLE.COM" }
|
|
||||||
{ "2" = "fred@EXAMPLE.COM" }
|
|
||||||
}
|
|
||||||
{ "tls_priority" = "NORMAL" }
|
|
||||||
{ "max_clients" = "5000" }
|
|
||||||
{ "max_queued_clients" = "1000" }
|
|
||||||
{ "max_anonymous_clients" = "20" }
|
|
||||||
{ "min_workers" = "5" }
|
|
||||||
{ "max_workers" = "20" }
|
|
||||||
{ "prio_workers" = "5" }
|
|
||||||
{ "max_requests" = "20" }
|
|
||||||
{ "max_client_requests" = "5" }
|
|
||||||
{ "admin_min_workers" = "1" }
|
|
||||||
{ "admin_max_workers" = "5" }
|
|
||||||
{ "admin_max_clients" = "5" }
|
|
||||||
{ "admin_max_queued_clients" = "5" }
|
|
||||||
{ "admin_max_client_requests" = "5" }
|
|
||||||
{ "log_level" = "3" }
|
|
||||||
{ "log_filters" = "3:remote 4:event" }
|
|
||||||
{ "log_outputs" = "3:syslog:libvirtd" }
|
|
||||||
{ "log_buffer_size" = "64" }
|
|
||||||
{ "audit_level" = "2" }
|
|
||||||
{ "audit_logging" = "1" }
|
|
||||||
{ "host_uuid" = "00000000-0000-0000-0000-000000000000" }
|
|
||||||
{ "host_uuid_source" = "smbios" }
|
|
||||||
{ "keepalive_interval" = "5" }
|
|
||||||
{ "keepalive_count" = "5" }
|
|
||||||
{ "keepalive_required" = "1" }
|
|
||||||
{ "admin_keepalive_required" = "1" }
|
|
||||||
{ "admin_keepalive_interval" = "5" }
|
|
||||||
{ "admin_keepalive_count" = "5" }
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 783 B |
@@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>404 page not found</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Someone appears to have eaten the <del>penguin</del>
|
|
||||||
page you were looking for. You might want to try
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>going back to the <a href="http://libvirt.org/">home page</a> to find
|
|
||||||
a collection of links to interesting pages on this site</li>
|
|
||||||
<li>using the search box at the top right corner of the screen to
|
|
||||||
locate the content on this site or mailing list archives</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p class="image">
|
|
||||||
<img src="/libvirtLogo404.png" alt="libvirt Logo"/>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
379
docs/Makefile.am
379
docs/Makefile.am
@@ -1,379 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
## Copyright (C) 2005-2016 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/>.
|
|
||||||
|
|
||||||
PERL = perl
|
|
||||||
|
|
||||||
# The directory containing the source code (if it contains documentation).
|
|
||||||
DOC_SOURCE_DIR=../src
|
|
||||||
|
|
||||||
DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt
|
|
||||||
|
|
||||||
apihtml = \
|
|
||||||
html/index.html \
|
|
||||||
$(apihtml_generated)
|
|
||||||
|
|
||||||
apihtml_generated = \
|
|
||||||
html/libvirt-libvirt-common.html \
|
|
||||||
html/libvirt-libvirt-domain.html \
|
|
||||||
html/libvirt-libvirt-domain-snapshot.html \
|
|
||||||
html/libvirt-libvirt-event.html \
|
|
||||||
html/libvirt-libvirt-host.html \
|
|
||||||
html/libvirt-libvirt-interface.html \
|
|
||||||
html/libvirt-libvirt-network.html \
|
|
||||||
html/libvirt-libvirt-nodedev.html \
|
|
||||||
html/libvirt-libvirt-nwfilter.html \
|
|
||||||
html/libvirt-libvirt-secret.html \
|
|
||||||
html/libvirt-libvirt-storage.html \
|
|
||||||
html/libvirt-libvirt-stream.html \
|
|
||||||
html/libvirt-virterror.html
|
|
||||||
|
|
||||||
apipng = \
|
|
||||||
html/left.png \
|
|
||||||
html/up.png \
|
|
||||||
html/home.png \
|
|
||||||
html/right.png
|
|
||||||
|
|
||||||
devhelphtml = \
|
|
||||||
devhelp/libvirt.devhelp \
|
|
||||||
devhelp/index.html \
|
|
||||||
devhelp/general.html \
|
|
||||||
devhelp/libvirt-virterror.html
|
|
||||||
|
|
||||||
css = \
|
|
||||||
generic.css \
|
|
||||||
libvirt.css \
|
|
||||||
main.css
|
|
||||||
|
|
||||||
devhelppng = \
|
|
||||||
devhelp/home.png \
|
|
||||||
devhelp/left.png \
|
|
||||||
devhelp/right.png \
|
|
||||||
devhelp/up.png
|
|
||||||
|
|
||||||
devhelpcss = devhelp/style.css
|
|
||||||
|
|
||||||
devhelpxsl = devhelp/devhelp.xsl devhelp/html.xsl
|
|
||||||
|
|
||||||
png = \
|
|
||||||
32favicon.png \
|
|
||||||
libvirt-header-bg.png \
|
|
||||||
libvirt-header-logo.png \
|
|
||||||
libvirtLogo.png \
|
|
||||||
libvirt-net-logical.png \
|
|
||||||
libvirt-net-physical.png \
|
|
||||||
libvirt-daemon-arch.png \
|
|
||||||
libvirt-driver-arch.png \
|
|
||||||
libvirt-object-model.png \
|
|
||||||
madeWith.png \
|
|
||||||
migration-managed-direct.png \
|
|
||||||
migration-managed-p2p.png \
|
|
||||||
migration-native.png \
|
|
||||||
migration-tunnel.png \
|
|
||||||
migration-unmanaged-direct.png
|
|
||||||
|
|
||||||
gif = \
|
|
||||||
architecture.gif \
|
|
||||||
node.gif
|
|
||||||
|
|
||||||
|
|
||||||
internals_html_in = \
|
|
||||||
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in))
|
|
||||||
internals_html = $(internals_html_in:%.html.in=%.html)
|
|
||||||
|
|
||||||
# todo.html is special - it is shipped in the tarball, but we
|
|
||||||
# have a dedicated 'todo' target to rebuild it from a proper
|
|
||||||
# config file, all other users are able to build it locally.
|
|
||||||
# For all other files, since we ship pre-built html in the
|
|
||||||
# tarball, we must also ship the sources, even when those
|
|
||||||
# sources are themselves generated.
|
|
||||||
dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) \
|
|
||||||
todo.html.in \
|
|
||||||
hvsupport.html.in
|
|
||||||
dot_html = $(dot_html_in:%.html.in=%.html)
|
|
||||||
|
|
||||||
dot_php_in = $(notdir $(wildcard $(srcdir)/*.php.in))
|
|
||||||
dot_php_code_in = $(dot_php_in:%.php.in=%.php.code.in)
|
|
||||||
dot_php = $(dot_php_in:%.php.in=%.php)
|
|
||||||
|
|
||||||
patches = $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/api_extension/*.patch))
|
|
||||||
|
|
||||||
xml = \
|
|
||||||
libvirt-api.xml \
|
|
||||||
libvirt-refs.xml
|
|
||||||
|
|
||||||
qemu_xml = \
|
|
||||||
libvirt-qemu-api.xml \
|
|
||||||
libvirt-qemu-refs.xml
|
|
||||||
|
|
||||||
lxc_xml = \
|
|
||||||
libvirt-lxc-api.xml \
|
|
||||||
libvirt-lxc-refs.xml
|
|
||||||
|
|
||||||
admin_xml = \
|
|
||||||
libvirt-admin-api.xml \
|
|
||||||
libvirt-admin-refs.xml
|
|
||||||
|
|
||||||
apidir = $(pkgdatadir)/api
|
|
||||||
api_DATA = \
|
|
||||||
libvirt-api.xml \
|
|
||||||
libvirt-qemu-api.xml \
|
|
||||||
libvirt-lxc-api.xml \
|
|
||||||
libvirt-admin-api.xml
|
|
||||||
|
|
||||||
fig = \
|
|
||||||
libvirt-net-logical.fig \
|
|
||||||
libvirt-net-physical.fig \
|
|
||||||
libvirt-daemon-arch.fig \
|
|
||||||
libvirt-driver-arch.fig \
|
|
||||||
libvirt-object-model.fig \
|
|
||||||
migration-managed-direct.fig \
|
|
||||||
migration-managed-p2p.fig \
|
|
||||||
migration-native.fig \
|
|
||||||
migration-tunnel.fig \
|
|
||||||
migration-unmanaged-direct.fig
|
|
||||||
|
|
||||||
schemadir = $(pkgdatadir)/schemas
|
|
||||||
schema_DATA = $(wildcard $(srcdir)/schemas/*.rng)
|
|
||||||
|
|
||||||
EXTRA_DIST= \
|
|
||||||
apibuild.py genaclperms.pl \
|
|
||||||
site.xsl newapi.xsl news.xsl page.xsl \
|
|
||||||
hacking1.xsl hacking2.xsl wrapstring.xsl \
|
|
||||||
$(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \
|
|
||||||
$(devhelphtml) $(devhelppng) $(devhelpcss) $(devhelpxsl) \
|
|
||||||
$(xml) $(qemu_xml) $(lxc_xml) $(admin_xml) $(fig) $(png) $(css) \
|
|
||||||
$(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
|
|
||||||
$(internals_html_in) $(internals_html) \
|
|
||||||
sitemap.html.in aclperms.htmlinc \
|
|
||||||
todo.pl hvsupport.pl todo.cfg-example \
|
|
||||||
$(schema_DATA)
|
|
||||||
|
|
||||||
acl_generated = aclperms.htmlinc
|
|
||||||
|
|
||||||
$(srcdir)/aclperms.htmlinc: $(top_srcdir)/src/access/viraccessperm.h \
|
|
||||||
$(srcdir)/genaclperms.pl Makefile.am
|
|
||||||
$(AM_V_GEN)$(PERL) $(srcdir)/genaclperms.pl $< > $@
|
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = \
|
|
||||||
$(addprefix $(srcdir)/,$(dot_html)) \
|
|
||||||
$(addprefix $(srcdir)/,$(apihtml)) \
|
|
||||||
$(addprefix $(srcdir)/,$(devhelphtml)) \
|
|
||||||
$(addprefix $(srcdir)/,$(internals_html)) \
|
|
||||||
$(addprefix $(srcdir)/,$(dot_php)) \
|
|
||||||
$(srcdir)/hvsupport.html.in $(srcdir)/aclperms.htmlinc
|
|
||||||
|
|
||||||
all-am: web
|
|
||||||
|
|
||||||
api: $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
|
|
||||||
qemu_api: $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
|
|
||||||
lxc_api: $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml
|
|
||||||
admin_api: $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
|
|
||||||
|
|
||||||
web: $(dot_html) $(internals_html) html/index.html devhelp/index.html \
|
|
||||||
$(dot_php)
|
|
||||||
|
|
||||||
todo.html.in: todo.pl
|
|
||||||
if [ -f todo.cfg ]; then \
|
|
||||||
echo "Generating $@"; \
|
|
||||||
$(PERL) $< > $@ \
|
|
||||||
|| { rm $@ && exit 1; }; \
|
|
||||||
else \
|
|
||||||
echo "Stubbing $@"; \
|
|
||||||
printf "%s\n" \
|
|
||||||
"<html xmlns=\"http://www.w3.org/1999/xhtml\">" \
|
|
||||||
"<body>" \
|
|
||||||
"<h1>Todo list unavailable: no config file</h1>" \
|
|
||||||
"</body></html>" > $@ ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
todo:
|
|
||||||
rm -f todo.html.in
|
|
||||||
$(MAKE) todo.html
|
|
||||||
|
|
||||||
hvsupport.html: $(srcdir)/hvsupport.html.in
|
|
||||||
|
|
||||||
$(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
|
|
||||||
$(top_srcdir)/src/libvirt_public.syms \
|
|
||||||
$(top_srcdir)/src/libvirt_qemu.syms $(top_srcdir)/src/libvirt_lxc.syms \
|
|
||||||
$(top_srcdir)/src/driver.h
|
|
||||||
$(AM_V_GEN)$(PERL) $(srcdir)/hvsupport.pl $(top_srcdir)/src > $@ \
|
|
||||||
|| { rm $@ && exit 1; }
|
|
||||||
|
|
||||||
.PHONY: todo
|
|
||||||
|
|
||||||
%.png: %.fig
|
|
||||||
convert -rotate 90 $< $@
|
|
||||||
|
|
||||||
%.html.tmp: %.html.in site.xsl subsite.xsl page.xsl \
|
|
||||||
sitemap.html.in $(acl_generated)
|
|
||||||
@if [ -x $(XSLTPROC) ] ; then \
|
|
||||||
echo "Generating $@"; \
|
|
||||||
name=`echo $@ | sed -e 's/.tmp//'`; \
|
|
||||||
dir=`dirname $@` ; \
|
|
||||||
if test "$$dir" = "."; \
|
|
||||||
then \
|
|
||||||
style=site.xsl; \
|
|
||||||
else \
|
|
||||||
$(MKDIR_P) $$dir; \
|
|
||||||
style=subsite.xsl; \
|
|
||||||
fi; \
|
|
||||||
$(XSLTPROC) --stringparam pagename $$name --nonet \
|
|
||||||
$(top_srcdir)/docs/$$style $< > $@ \
|
|
||||||
|| { rm $@ && exit 1; }; fi
|
|
||||||
|
|
||||||
%.html: %.html.tmp
|
|
||||||
@if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
|
|
||||||
if $(XMLCATALOG) '$(XML_CATALOG_FILE)' \
|
|
||||||
"-//W3C//DTD XHTML 1.0 Strict//EN" > /dev/null ; then \
|
|
||||||
echo "Validating $@" ; \
|
|
||||||
SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \
|
|
||||||
$(XMLLINT) --catalogs --nonet --format --valid $< > $(srcdir)/$@ \
|
|
||||||
|| { rm $(srcdir)/$@ && exit 1; }; \
|
|
||||||
else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi
|
|
||||||
|
|
||||||
%.php.tmp: %.php.in site.xsl page.xsl sitemap.html.in
|
|
||||||
@if [ -x $(XSLTPROC) ] ; then \
|
|
||||||
echo "Generating $@"; \
|
|
||||||
$(XSLTPROC) --stringparam pagename $(@:.tmp=) --nonet \
|
|
||||||
$(top_srcdir)/docs/site.xsl $< > $@ \
|
|
||||||
|| { rm $@ && exit 1; }; fi
|
|
||||||
|
|
||||||
%.php: %.php.tmp %.php.code.in
|
|
||||||
@if [ -x $(XSLTPROC) ] ; then \
|
|
||||||
echo "Scripting $@"; \
|
|
||||||
sed -e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \
|
|
||||||
-e /php_placeholder/d < $@.tmp > $(srcdir)/$@ \
|
|
||||||
|| { rm $(srcdir)/$@ && exit 1; }; fi
|
|
||||||
|
|
||||||
$(apihtml_generated): html/index.html
|
|
||||||
|
|
||||||
html/index.html: libvirt-api.xml newapi.xsl page.xsl sitemap.html.in
|
|
||||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
|
||||||
$(XSLTPROC) --nonet -o $(srcdir)/ \
|
|
||||||
--stringparam builddir '$(abs_top_builddir)' \
|
|
||||||
$(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml ; fi && \
|
|
||||||
if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
|
|
||||||
if $(XMLCATALOG) '$(XML_CATALOG_FILE)' "-//W3C//DTD XHTML 1.0 Strict//EN" \
|
|
||||||
> /dev/null ; then \
|
|
||||||
SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \
|
|
||||||
$(XMLLINT) --catalogs --nonet --valid --noout $(srcdir)/html/*.html ; \
|
|
||||||
else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi
|
|
||||||
|
|
||||||
$(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
|
|
||||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
|
||||||
$(XSLTPROC) --nonet -o $(srcdir)/devhelp/ \
|
|
||||||
$(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml ; fi
|
|
||||||
|
|
||||||
|
|
||||||
python_generated_files = \
|
|
||||||
$(srcdir)/html/libvirt-libvirt-lxc.html \
|
|
||||||
$(srcdir)/html/libvirt-libvirt-qemu.html \
|
|
||||||
$(srcdir)/html/libvirt-libvirt-admin.html \
|
|
||||||
$(srcdir)/html/libvirt-virterror.html \
|
|
||||||
$(srcdir)/libvirt-api.xml \
|
|
||||||
$(srcdir)/libvirt-refs.xml \
|
|
||||||
$(srcdir)/libvirt-lxc-api.xml \
|
|
||||||
$(srcdir)/libvirt-lxc-refs.xml \
|
|
||||||
$(srcdir)/libvirt-qemu-api.xml \
|
|
||||||
$(srcdir)/libvirt-qemu-refs.xml \
|
|
||||||
$(srcdir)/libvirt-admin-api.xml \
|
|
||||||
$(srcdir)/libvirt-admin-refs.xml \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
APIBUILD=$(srcdir)/apibuild.py
|
|
||||||
APIBUILD_STAMP=$(APIBUILD).stamp
|
|
||||||
EXTRA_DIST += $(APIBUILD_STAMP)
|
|
||||||
|
|
||||||
$(python_generated_files): $(APIBUILD_STAMP)
|
|
||||||
|
|
||||||
$(APIBUILD_STAMP): $(srcdir)/apibuild.py \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-common.h.in \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-domain-snapshot.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-domain.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-event.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-host.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-interface.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-network.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-nodedev.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-nwfilter.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-secret.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-storage.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-stream.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-lxc.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-qemu.h \
|
|
||||||
$(top_srcdir)/include/libvirt/libvirt-admin.h \
|
|
||||||
$(top_srcdir)/include/libvirt/virterror.h \
|
|
||||||
$(top_srcdir)/src/libvirt.c \
|
|
||||||
$(top_srcdir)/src/libvirt-lxc.c \
|
|
||||||
$(top_srcdir)/src/libvirt-qemu.c \
|
|
||||||
$(top_srcdir)/src/libvirt-admin.c \
|
|
||||||
$(top_srcdir)/src/util/virerror.c \
|
|
||||||
$(top_srcdir)/src/util/virevent.c \
|
|
||||||
$(top_srcdir)/src/util/virtypedparam.c
|
|
||||||
$(AM_V_GEN)srcdir=$(srcdir) builddir=$(builddir) $(PYTHON) $(APIBUILD)
|
|
||||||
touch $@
|
|
||||||
|
|
||||||
|
|
||||||
check-local: all
|
|
||||||
dist-local: all
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html
|
|
||||||
|
|
||||||
maintainer-clean-local: clean-local
|
|
||||||
rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml \
|
|
||||||
todo.html.in
|
|
||||||
rm -rf $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
|
|
||||||
rm -rf $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml
|
|
||||||
rm -rf $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
|
|
||||||
rm -rf $(APIBUILD_STAMP)
|
|
||||||
|
|
||||||
rebuild: api qemu_api lxc_api admin_api all
|
|
||||||
|
|
||||||
install-data-local:
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)
|
|
||||||
for f in $(css) $(dot_html) $(gif) $(png); do \
|
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR); done
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/html
|
|
||||||
for h in $(apihtml); do \
|
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$h $(DESTDIR)$(HTML_DIR)/html; done
|
|
||||||
for p in $(apipng); do \
|
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$p $(DESTDIR)$(HTML_DIR)/html; done
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/internals
|
|
||||||
for f in $(internals_html); do \
|
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/internals; done
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(DEVHELP_DIR)
|
|
||||||
for file in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \
|
|
||||||
done
|
|
||||||
$(INSTALL_DATA) $(srcdir)/libvirtLogo.png $(DESTDIR)$(pkgdatadir)
|
|
||||||
|
|
||||||
uninstall-local:
|
|
||||||
for f in $(css) $(dot_html) $(gif) $(png); do \
|
|
||||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
|
||||||
done
|
|
||||||
for h in $(apihtml); do rm -f $(DESTDIR)$(HTML_DIR)/$$h; done
|
|
||||||
for p in $(apipng); do rm -f $(DESTDIR)$(HTML_DIR)/$$p; done
|
|
||||||
for f in $(internals_html); do \
|
|
||||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
|
||||||
done
|
|
||||||
for f in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
|
||||||
rm -f $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \
|
|
||||||
done
|
|
||||||
rm -f $(DESTDIR)$(pkgdatadir)/libvirtLogo.png
|
|
||||||
100
docs/acl.html.in
100
docs/acl.html.in
@@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Client access control</h1>
|
|
||||||
<p>
|
|
||||||
Libvirt's client access control framework allows administrators
|
|
||||||
to setup fine grained permission rules across client users,
|
|
||||||
managed objects and API operations. This allows client connections
|
|
||||||
to be locked down to a minimal set of privileges.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="intro">Access control introduction</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In a default configuration, the libvirtd daemon has three levels
|
|
||||||
of access control. All connections start off in an unauthenticated
|
|
||||||
state, where the only API operations allowed are those required
|
|
||||||
to complete authentication. After successful authentication, a
|
|
||||||
connection either has full, unrestricted access to all libvirt
|
|
||||||
API calls, or is locked down to only "read only" operations,
|
|
||||||
according to what socket a client connection originated on.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The access control framework allows authenticated connections to
|
|
||||||
have fine grained permission rules to be defined by the administrator.
|
|
||||||
Every API call in libvirt has a set of permissions that will
|
|
||||||
be validated against the object being used. For example, the
|
|
||||||
<code>virDomainSetSchedulerParametersFlags</code> method will
|
|
||||||
check whether the client user has the <code>write</code>
|
|
||||||
permission on the <code>domain</code> object instance passed
|
|
||||||
in as a parameter. Further permissions will also be checked
|
|
||||||
if certain flags are set in the API call. In addition to
|
|
||||||
checks on the object passed in to an API call, some methods
|
|
||||||
will filter their results. For example the <code>virConnectListAllDomains</code>
|
|
||||||
method will check the <code>search_domains</code> on the <code>connect</code>
|
|
||||||
object, but will also filter the returned <code>domain</code>
|
|
||||||
objects to only those on which the client user has the
|
|
||||||
<code>getattr</code> permission.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="drivers">Access control drivers</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The access control framework is designed as a pluggable
|
|
||||||
system to enable future integration with arbitrary access
|
|
||||||
control technologies. By default, the <code>none</code>
|
|
||||||
driver is used, which does no access control checks at
|
|
||||||
all. At this time, libvirt ships with support for using
|
|
||||||
<a href="http://www.freedesktop.org/wiki/Software/polkit/">polkit</a> as a real access
|
|
||||||
control driver. To learn how to use the polkit access
|
|
||||||
driver consult <a href="aclpolkit.html">the configuration
|
|
||||||
docs</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The access driver is configured in the <code>libvirtd.conf</code>
|
|
||||||
configuration file, using the <code>access_drivers</code>
|
|
||||||
parameter. This parameter accepts an array of access control
|
|
||||||
driver names. If more than one access driver is requested,
|
|
||||||
then all must succeed in order for access to be granted.
|
|
||||||
To enable 'polkit' as the driver:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# augtool -s set '/files/etc/libvirt/libvirtd.conf/access_drivers[1]' polkit
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
And to reset back to the default (no-op) driver
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# augtool -s rm /files/etc/libvirt/libvirtd.conf/access_drivers
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<strong>Note:</strong> changes to libvirtd.conf require that
|
|
||||||
the libvirtd daemon be restarted.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="perms">Objects and permissions</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Libvirt applies access control to all the main object
|
|
||||||
types in its API. Each object type, in turn, has a set
|
|
||||||
of permissions defined. To determine what permissions
|
|
||||||
are checked for specific API call, consult the
|
|
||||||
<a href="html/index.html">API reference manual</a>
|
|
||||||
documentation for the API in question.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div id="include" filename="aclperms.htmlinc"/>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,414 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Polkit access control</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Libvirt's client <a href="acl.html">access control framework</a> allows
|
|
||||||
administrators to setup fine grained permission rules across client users,
|
|
||||||
managed objects and API operations. This allows client connections
|
|
||||||
to be locked down to a minimal set of privileges. The polkit driver
|
|
||||||
provides a simple implementation of the access control framework.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="intro">Introduction</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
A default install of libvirt will typically use
|
|
||||||
<a href="http://www.freedesktop.org/wiki/Software/polkit/">polkit</a>
|
|
||||||
to authenticate the initial user connection to libvirtd. This is a
|
|
||||||
very coarse grained check though, either allowing full read-write
|
|
||||||
access to all APIs, or just read-only access. The polkit access
|
|
||||||
control driver in libvirt builds on this capability to allow for
|
|
||||||
fine grained control over the operations a user may perform on an
|
|
||||||
object.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="perms">Permission names</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The libvirt <a href="acl.html#perms">object names and permission names</a>
|
|
||||||
are mapped onto polkit action names using the simple pattern:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>org.libvirt.api.$object.$permission
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The only caveat is that any underscore characters in the
|
|
||||||
object or permission names are converted to hyphens. So,
|
|
||||||
for example, the <code>search_storage_vols</code> permission
|
|
||||||
on the <code>storage_pool</code> object maps to the polkit
|
|
||||||
action:
|
|
||||||
</p>
|
|
||||||
<pre>org.libvirt.api.storage-pool.search-storage-vols
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The default policy for any permission which corresponds to
|
|
||||||
a "read only" operation, is to allow access. All other
|
|
||||||
permissions default to deny access.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="attrs">Object identity attributes</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To allow polkit authorization rules to be written to match
|
|
||||||
against individual object instances, libvirt provides a number
|
|
||||||
of authorization detail attributes when performing a permission
|
|
||||||
check. The set of attributes varies according to the type
|
|
||||||
of object being checked
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a name="object_connect">virConnectPtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_domain">virDomainPtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>domain_name</td>
|
|
||||||
<td>Name of the domain, unique to the local host</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>domain_uuid</td>
|
|
||||||
<td>UUID of the domain, globally unique</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_interface">virInterfacePtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>interface_name</td>
|
|
||||||
<td>Name of the network interface, unique to the local host</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>interface_macaddr</td>
|
|
||||||
<td>MAC address of the network interface, not unique</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_network">virNetworkPtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>network_name</td>
|
|
||||||
<td>Name of the network, unique to the local host</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>network_uuid</td>
|
|
||||||
<td>UUID of the network, globally unique</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_node_device">virNodeDevicePtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>node_device_name</td>
|
|
||||||
<td>Name of the node device, unique to the local host</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_nwfilter">virNWFilterPtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>nwfilter_name</td>
|
|
||||||
<td>Name of the network filter, unique to the local host</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>nwfilter_uuid</td>
|
|
||||||
<td>UUID of the network filter, globally unique</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_secret">virSecretPtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>secret_uuid</td>
|
|
||||||
<td>UUID of the secret, globally unique</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>secret_usage_volume</td>
|
|
||||||
<td>Name of the associated volume, if any</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>secret_usage_ceph</td>
|
|
||||||
<td>Name of the associated Ceph server, if any</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>secret_usage_target</td>
|
|
||||||
<td>Name of the associated iSCSI target, if any</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_storage_pool">virStoragePoolPtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>pool_name</td>
|
|
||||||
<td>Name of the storage pool, unique to the local host</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>pool_uuid</td>
|
|
||||||
<td>UUID of the storage pool, globally unique</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3><a name="object_storage_vol">virStorageVolPtr</a></h3>
|
|
||||||
<table class="acl">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Attribute</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>connect_driver</td>
|
|
||||||
<td>Name of the libvirt connection driver</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>pool_name</td>
|
|
||||||
<td>Name of the storage pool, unique to the local host</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>pool_uuid</td>
|
|
||||||
<td>UUID of the storage pool, globally unique</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>vol_name</td>
|
|
||||||
<td>Name of the storage volume, unique to the pool</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>vol_key</td>
|
|
||||||
<td>Key of the storage volume, globally unique</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
|
|
||||||
<h2><a name="user">User identity attributes</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
At this point in time, the only attribute provided by
|
|
||||||
libvirt to identify the user invoking the operation
|
|
||||||
is the PID of the client program. This means that the
|
|
||||||
polkit access control driver is only useful if connections
|
|
||||||
to libvirt are restricted to its UNIX domain socket. If
|
|
||||||
connections are being made to a TCP socket, no identifying
|
|
||||||
information is available and access will be denied.
|
|
||||||
Also note that if the client is connecting via an SSH
|
|
||||||
tunnel, it is the local SSH user that will be identified.
|
|
||||||
In future versions, it is expected that more information
|
|
||||||
about the client user will be provided, including the
|
|
||||||
SASL / Kerberos username and/or x509 distinguished
|
|
||||||
name obtained from the authentication provider in use.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2><a name="checks">Writing access control policies</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If using versions of polkit prior to 0.106 then it is only
|
|
||||||
possible to validate (user, permission) pairs via the <code>.pkla</code>
|
|
||||||
files. Fully validation of the (user, permission, object) triple
|
|
||||||
requires the new JavaScript <code>.rules</code> support that
|
|
||||||
was introduced in version 0.106. The latter is what will be
|
|
||||||
described here.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Libvirt does not ship any rules files by default. It merely
|
|
||||||
provides a definition of the default behaviour for each
|
|
||||||
action (permission). As noted earlier, permissions which
|
|
||||||
correspond to read-only operations in libvirt will be allowed
|
|
||||||
to all users by default; everything else is denied by default.
|
|
||||||
Defining custom rules requires creation of a file in the
|
|
||||||
<code>/etc/polkit-1/rules.d</code> directory with a name
|
|
||||||
chosen by the administrator (<code>100-libvirt-acl.rules</code>
|
|
||||||
would be a reasonable choice). See the <code>polkit(8)</code>
|
|
||||||
manual page for a description of how to write these files
|
|
||||||
in general. The key idea is to create a file containing
|
|
||||||
something like
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
polkit.addRule(function(action, subject) {
|
|
||||||
....logic to check 'action' and 'subject'...
|
|
||||||
});
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In this code snippet above, the <code>action</code> object
|
|
||||||
instance will represent the libvirt permission being checked
|
|
||||||
along with identifying attributes for the object it is being
|
|
||||||
applied to. The <code>subject</code> meanwhile will identify
|
|
||||||
the libvirt client app (with the caveat above about it only
|
|
||||||
dealing with local clients connected via the UNIX socket).
|
|
||||||
On the <code>action</code> object, the permission name is
|
|
||||||
accessible via the <code>id</code> attribute, while the
|
|
||||||
object identifying attributes are exposed via the
|
|
||||||
<code>lookup</code> method.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
See
|
|
||||||
<a href="http://libvirt.org/git/?p=libvirt.git;a=tree;f=examples/polkit;hb=HEAD">source code</a>
|
|
||||||
for a more complex example.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a name="exconnect">Example: restricting ability to connect to drivers</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Consider a local user <code>berrange</code>
|
|
||||||
who has been granted permission to connect to libvirt in
|
|
||||||
full read-write mode. The goal is to only allow them to
|
|
||||||
use the <code>QEMU</code> driver and not the Xen or LXC
|
|
||||||
drivers which are also available in libvirtd.
|
|
||||||
To achieve this we need to write a rule which checks
|
|
||||||
whether the <code>connect_driver</code> attribute
|
|
||||||
is <code>QEMU</code>, and match on an action
|
|
||||||
name of <code>org.libvirt.api.connect.getattr</code>. Using
|
|
||||||
the javascript rules format, this ends up written as
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
polkit.addRule(function(action, subject) {
|
|
||||||
if (action.id == "org.libvirt.api.connect.getattr" &&
|
|
||||||
subject.user == "berrange") {
|
|
||||||
if (action.lookup("connect_driver") == 'QEMU') {
|
|
||||||
return polkit.Result.YES;
|
|
||||||
} else {
|
|
||||||
return polkit.Result.NO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h3><a name="exdomain">Example: restricting access to a single domain</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Consider a local user <code>berrange</code>
|
|
||||||
who has been granted permission to connect to libvirt in
|
|
||||||
full read-write mode. The goal is to only allow them to
|
|
||||||
see the domain called <code>demo</code> on the LXC driver.
|
|
||||||
To achieve this we need to write a rule which checks
|
|
||||||
whether the <code>connect_driver</code> attribute
|
|
||||||
is <code>LXC</code> and the <code>domain_name</code>
|
|
||||||
attribute is <code>demo</code>, and match on a action
|
|
||||||
name of <code>org.libvirt.api.domain.getattr</code>. Using
|
|
||||||
the javascript rules format, this ends up written as
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
polkit.addRule(function(action, subject) {
|
|
||||||
if (action.id == "org.libvirt.api.domain.getattr" &&
|
|
||||||
subject.user == "berrange") {
|
|
||||||
if (action.lookup("connect_driver") == 'LXC' &&
|
|
||||||
action.lookup("domain_name") == 'demo') {
|
|
||||||
return polkit.Result.YES;
|
|
||||||
} else {
|
|
||||||
return polkit.Result.NO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
380
docs/api.html.in
380
docs/api.html.in
@@ -1,380 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>The libvirt API concepts</h1>
|
|
||||||
|
|
||||||
<p> This page describes the main principles and architecture choices
|
|
||||||
behind the definition of the libvirt API:</p>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="Objects">Objects Exposed</a></h2>
|
|
||||||
<p> As defined in the <a href="goals.html">goals section</a>, the libvirt
|
|
||||||
API is designed to expose all the resources needed to manage the
|
|
||||||
virtualization support of recent operating systems. The first object
|
|
||||||
manipulated through the API is the <code>virConnectPtr</code>, which
|
|
||||||
represents the connection to a hypervisor. Any application using libvirt
|
|
||||||
is likely to start using the
|
|
||||||
API by calling one of <a href="html/libvirt-libvirt-host.html#virConnectOpen"
|
|
||||||
>the virConnectOpen functions</a>. You will note that those functions take
|
|
||||||
a name argument which is actually a <a href="uri.html">connection URI</a>
|
|
||||||
to select the right hypervisor to open.
|
|
||||||
A URI is needed to allow remote connections and also select between
|
|
||||||
different possible hypervisors. For example, on a Linux system it may be
|
|
||||||
possible to use both KVM and LinuxContainers on the same node. A NULL
|
|
||||||
name will default to a preselected hypervisor, but it's probably not a
|
|
||||||
wise thing to do in most cases. See the <a href="uri.html">connection
|
|
||||||
URI</a> page for a full descriptions of the values allowed.</p>
|
|
||||||
<p> OnDevice the application obtains a
|
|
||||||
<a href="/html/libvirt-libvirt-host.html#virConnectPtr">
|
|
||||||
<code>virConnectPtr</code>
|
|
||||||
</a>
|
|
||||||
connection to the hypervisor it can then use it to manage the hypervisor's
|
|
||||||
available domains and related virtualization
|
|
||||||
resources, such as storage and networking. All those are
|
|
||||||
exposed as first class objects and connected to the hypervisor connection
|
|
||||||
(and the node or cluster where it is available).</p>
|
|
||||||
<p class="image">
|
|
||||||
<img alt="first class objects exposed by the API"
|
|
||||||
src="libvirt-object-model.png"/>
|
|
||||||
</p>
|
|
||||||
<p> The figure above shows the five main objects exported by the API:</p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-host.html#virConnectPtr">
|
|
||||||
<code>virConnectPtr</code>
|
|
||||||
</a>
|
|
||||||
<p>Represents the connection to a hypervisor. Use one of the
|
|
||||||
<a href="html/libvirt-libvirt-host.html#virConnectOpen">virConnectOpen</a>
|
|
||||||
functions to obtain connection to the hypervisor which is then used
|
|
||||||
as a parameter to other connection API's.</p></li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainPtr">
|
|
||||||
<code>virDomainPtr</code>
|
|
||||||
</a>
|
|
||||||
<p>Represents one domain either active or defined (i.e. existing as
|
|
||||||
permanent config file and storage but not currently running on that
|
|
||||||
node). The function
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virConnectListAllDomains">
|
|
||||||
<code>virConnectListAllDomains</code>
|
|
||||||
</a>
|
|
||||||
lists all the domains for the hypervisor.</p></li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-network.html#virNetworkPtr">
|
|
||||||
<code>virNetworkPtr</code>
|
|
||||||
</a>
|
|
||||||
<p>Represents one network either active or defined (i.e. existing
|
|
||||||
as permanent config file and storage but not currently activated).
|
|
||||||
The function
|
|
||||||
<a href="html/libvirt-libvirt-network.html#virConnectListAllNetworks">
|
|
||||||
<code>virConnectListAllNetworks</code>
|
|
||||||
</a>
|
|
||||||
lists all the virtualization networks for the hypervisor.</p></li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStorageVolPtr">
|
|
||||||
<code>virStorageVolPtr</code>
|
|
||||||
</a>
|
|
||||||
<p>Represents one storage volume generally used
|
|
||||||
as a block device available to one of the domains. The function
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStorageVolLookupByPath">
|
|
||||||
<code>virStorageVolLookupByPath</code>
|
|
||||||
</a>
|
|
||||||
finds the storage volume object based on its path on the node.</p></li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolPtr">
|
|
||||||
<code>virStoragePoolPtr</code>
|
|
||||||
</a>
|
|
||||||
<p>Represents a storage pool, which is a logical area
|
|
||||||
used to allocate and store storage volumes. The function
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virConnectListAllStoragePools">
|
|
||||||
<code>virConnectListAllStoragePools</code>
|
|
||||||
</a>
|
|
||||||
lists all of the virtualization storage pools on the hypervisor.
|
|
||||||
The function
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolLookupByVolume">
|
|
||||||
<code>virStoragePoolLookupByVolume</code>
|
|
||||||
</a>
|
|
||||||
finds the storage pool containing a given storage volume.</p></li>
|
|
||||||
</ul>
|
|
||||||
<p> Most objects manipulated by the library can also be represented using
|
|
||||||
XML descriptions. This is used primarily to create those object, but is
|
|
||||||
also helpful to modify or save their description back.</p>
|
|
||||||
<p> Domains, networks, and storage pools can be either <code>active</code>
|
|
||||||
i.e. either running or available for immediate use, or
|
|
||||||
<code>defined</code> in which case they are inactive but there is
|
|
||||||
a permanent definition available in the system for them. Based on this
|
|
||||||
they can be activated dynamically in order to be used.</p>
|
|
||||||
<p> Most objects can also be named in various ways:</p>
|
|
||||||
<ul>
|
|
||||||
<li><code>name</code>
|
|
||||||
<p>A user friendly identifier but whose uniqueness
|
|
||||||
cannot be guaranteed between two nodes.</p></li>
|
|
||||||
<li><code>ID</code>
|
|
||||||
<p>A runtime unique identifier
|
|
||||||
provided by the hypervisor for one given activation of the object;
|
|
||||||
however, it becomes invalid once the resource is deactivated.</p></li >
|
|
||||||
<li><code>UUID</code>
|
|
||||||
<p> A 16 byte unique identifier
|
|
||||||
as defined in <a href="http://www.ietf.org/rfc/rfc4122.txt">RFC 4122</a>,
|
|
||||||
which is guaranteed to be unique for long term usage and across a
|
|
||||||
set of nodes.</p></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2><a name="Functions">Functions and Naming Conventions</a></h2>
|
|
||||||
<p> The naming of the functions present in the library is usually
|
|
||||||
composed by a prefix describing the object associated to the function
|
|
||||||
and a verb describing the action on that object.</p>
|
|
||||||
<p> For each first class object you will find APIs
|
|
||||||
for the following actions:</p>
|
|
||||||
<ul>
|
|
||||||
<li><b>Lookup</b> [...LookupBy...]
|
|
||||||
<p>Used to perform lookups on objects by some type of identifier,
|
|
||||||
such as:</p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByID">
|
|
||||||
<code>virDomainLookupByID</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByName">
|
|
||||||
<code>virDomainLookupByName</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByUUID">
|
|
||||||
<code>virDomainLookupByUUID</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByUUIDString">
|
|
||||||
<code>virDomainLookupByUUIDString</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li><b>Enumeration</b> [virConnectList..., virConnectNumOf...]
|
|
||||||
<p>Used to enumerate a set of object available to an given
|
|
||||||
hypervisor connection such as:</p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virConnectListDomains">
|
|
||||||
<code>virConnectListDomains</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virConnectNumOfDomains">
|
|
||||||
<code>virConnectNumOfDomains</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-network.html#virConnectListNetworks">
|
|
||||||
<code>virConnectListNetworks</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virConnectListStoragePools">
|
|
||||||
<code>virConnectListStoragePools</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li><b>Description</b> [...GetInfo]
|
|
||||||
<p>Generic accessor providing a set of generic information about an
|
|
||||||
object, such as: </p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-host.html#virNodeGetInfo">
|
|
||||||
<code>virNodeGetInfo</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainGetInfo">
|
|
||||||
<code>virDomainGetInfo</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolGetInfo">
|
|
||||||
<code>virStoragePoolGetInfo</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStorageVolGetInfo">
|
|
||||||
<code>virStorageVolGetInfo</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li><b>Accessors</b> [...Get..., ...Set...]
|
|
||||||
<p>Specific accessors used to query or modify data for the given object,
|
|
||||||
such as: </p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-host.html#virConnectGetType">
|
|
||||||
<code>virConnectGetType</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainGetMaxMemory">
|
|
||||||
<code>virDomainGetMaxMemory</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainSetMemory">
|
|
||||||
<code>virDomainSetMemory</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainGetVcpus">
|
|
||||||
<code>virDomainGetVcpus</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolSetAutostart">
|
|
||||||
<code>virStoragePoolSetAutostart</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-network.html#virNetworkGetBridgeName">
|
|
||||||
<code>virNetworkGetBridgeName</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li><b>Creation</b> [...Create, ...CreateXML]
|
|
||||||
<p>Used to create and start objects. The ...CreateXML APIs will create
|
|
||||||
the object based on an XML description, while the ...Create APIs will
|
|
||||||
create the object based on existing object pointer, such as: </p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainCreate">
|
|
||||||
<code>virDomainCreate</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainCreateXML">
|
|
||||||
<code>virDomainCreateXML</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-network.html#virNetworkCreate">
|
|
||||||
<code>virNetworkCreate</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-network.html#virNetworkCreateXML">
|
|
||||||
<code>virNetworkCreateXML</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li><b>Destruction</b> [...Destroy]
|
|
||||||
<p>Used to shutdown or deactivate and destroy objects, such as: </p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-domain.html#virDomainDestroy">
|
|
||||||
<code>virDomainDestroy</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-network.html#virNetworkDestroy">
|
|
||||||
<code>virNetworkDestroy</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolDestroy">
|
|
||||||
<code>virStoragePoolDestroy</code>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<p>Note: functions returning vir*Ptr (like the virDomainLookup functions)
|
|
||||||
allocate memory which needs to be freed by the caller by the corresponding
|
|
||||||
vir*Free function (e.g. virDomainFree for a virDomainPtr object).
|
|
||||||
</p>
|
|
||||||
<p> For more in-depth details of the storage related APIs see
|
|
||||||
<a href="storage.html">the storage management page</a>.
|
|
||||||
</p>
|
|
||||||
<h2><a name="Drivers">The libvirt Drivers</a></h2>
|
|
||||||
<p>Drivers are the basic building block for libvirt functionality
|
|
||||||
to support the capability to handle specific hypervisor driver calls.
|
|
||||||
Drivers are discovered and registered during connection processing as
|
|
||||||
part of the
|
|
||||||
<a href="html/libvirt-libvirt-host.html#virInitialize">
|
|
||||||
<code>virInitialize</code>
|
|
||||||
</a>
|
|
||||||
API. Each driver
|
|
||||||
has a registration API which loads up the driver specific function
|
|
||||||
references for the libvirt APIs to call. The following is a simplistic
|
|
||||||
view of the hypervisor driver mechanism. Consider the stacked list of
|
|
||||||
drivers as a series of modules that can be plugged into the architecture
|
|
||||||
depending on how libvirt is configured to be built.</p>
|
|
||||||
<p class="image">
|
|
||||||
<img alt="The libvirt driver architecture"
|
|
||||||
src="libvirt-driver-arch.png"/>
|
|
||||||
</p>
|
|
||||||
<p>The driver architecture is also used to support other virtualization
|
|
||||||
components such as storage, storage pools, host device, networking,
|
|
||||||
network interfaces, and network filters.</p>
|
|
||||||
<p>See the <a href="drivers.html">libvirt drivers</a> page for more
|
|
||||||
information on hypervisor and storage specific drivers.</p>
|
|
||||||
<p>Not all drivers support every virtualization function possible.
|
|
||||||
The <a href="hvsupport.html">libvirt API support matrix</a> lists
|
|
||||||
the various functions and support found in each driver by the version
|
|
||||||
support was added into libvirt.
|
|
||||||
</p>
|
|
||||||
<h2><a name="Remote">Daemon and Remote Access</a></h2>
|
|
||||||
<p>Access to libvirt drivers is primarily handled by the libvirtd
|
|
||||||
daemon through the <a href="remote.html">remote</a> driver via an
|
|
||||||
<a href="internals/rpc.html">RPC</a>. Some hypervisors do support
|
|
||||||
client-side connections and responses, such as Test, OpenVZ, VMware,
|
|
||||||
Power VM (phyp), VirtualBox (vbox), ESX, Hyper-V, Xen, and Virtuozzo.
|
|
||||||
The libvirtd daemon service is started on the host at system boot
|
|
||||||
time and can also be restarted at any time by a properly privileged
|
|
||||||
user, such as root. The libvirtd daemon uses the same libvirt API
|
|
||||||
<a href="html/libvirt-libvirt-host.html#virInitialize">
|
|
||||||
<code>virInitialize</code>
|
|
||||||
</a>
|
|
||||||
sequence as applications
|
|
||||||
for client-side driver registrations, but then extends the registered
|
|
||||||
driver list to encompass all known drivers supported for all driver
|
|
||||||
types supported on the host. </p>
|
|
||||||
<p>The libvirt client <a href="apps.html">applications</a> use a
|
|
||||||
<a href="uri.html">URI</a> to obtain the <code>virConnectPtr</code>.
|
|
||||||
The <code>virConnectPtr</code> keeps track of the driver connection
|
|
||||||
plus a variety of other connections (network, interface, storage, etc.).
|
|
||||||
The <code>virConnectPtr</code> is then used as a parameter to other
|
|
||||||
virtualization <a href="#Functions">functions</a>. Depending upon the
|
|
||||||
driver being used, calls will be routed through the remote driver to
|
|
||||||
the libvirtd daemon. The daemon will reference the connection specific
|
|
||||||
driver in order to retrieve the requested information and then pass
|
|
||||||
back status and/or data through the connection back to the application.
|
|
||||||
The application can then decide what to do with that data, such as
|
|
||||||
display, write log data, etc. <a href="migration.html">Migration</a>
|
|
||||||
is an example of many facets of the architecture in use.</p>
|
|
||||||
|
|
||||||
<p class="image">
|
|
||||||
<img alt="The libvirt daemon and remote architecture"
|
|
||||||
src="libvirt-daemon-arch.png"/>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The key takeaway from the above diagram is that there is a remote driver
|
|
||||||
which handles transactions for a majority of the drivers. The libvirtd
|
|
||||||
daemon running on the host will receive transaction requests from the
|
|
||||||
remote driver and will then query the hypervisor driver as specified in
|
|
||||||
the <code>virConnectPtr</code> in order to fetch the data. The data will
|
|
||||||
then be returned through the remote driver to the client application
|
|
||||||
for processing.
|
|
||||||
</p>
|
|
||||||
<p>If you are interested in contributing to libvirt, read the
|
|
||||||
<a href="http://wiki.libvirt.org/page/FAQ">FAQ</a> and
|
|
||||||
<a href="hacking.html">hacking</a> guidelines to gain an understanding
|
|
||||||
of basic rules and guidelines. In order to add new API functionality
|
|
||||||
follow the instructions regarding
|
|
||||||
<a href="api_extension.html">implementing a new API in libvirt</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,432 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Implementing a new API in Libvirt</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This document walks you through the process of implementing a new
|
|
||||||
API in libvirt. It uses as an example the addition of an API for
|
|
||||||
separating maximum from current vcpu usage of a domain, over
|
|
||||||
the course of a fifteen-patch series.
|
|
||||||
Remember that new API consists of any new public functions, as
|
|
||||||
well as the addition of flags or extensions of XML used by
|
|
||||||
existing functions. The example in this document adds both new
|
|
||||||
functions and an XML extension. Not all libvirt API additions
|
|
||||||
require quite as many patches.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Before you begin coding, it is critical that you propose your
|
|
||||||
changes on the libvirt mailing list and get feedback on your ideas to
|
|
||||||
make sure what you're proposing fits with the general direction of the
|
|
||||||
project. Even before doing a proof of concept implementation, send an
|
|
||||||
email giving an overview of the functionality you think should be
|
|
||||||
added to libvirt. Someone may already be working on the feature you
|
|
||||||
want. Also, recognize that everything you write is likely to undergo
|
|
||||||
significant rework as you discuss it with the other developers, so
|
|
||||||
don't wait too long before getting feedback. In the vcpu example
|
|
||||||
below, list feedback was first requested
|
|
||||||
<a href="https://www.redhat.com/archives/libvir-list/2010-September/msg00423.html">here</a>
|
|
||||||
and resulted in several rounds of improvements before coding
|
|
||||||
began. In turn, this example is slightly rearranged from the actual
|
|
||||||
order of the commits.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Adding a new API to libvirt is not difficult, but there are quite a
|
|
||||||
few steps. This document assumes that you are familiar with C
|
|
||||||
programming and have checked out the libvirt code from the source code
|
|
||||||
repository and successfully built the existing tree. Instructions on
|
|
||||||
how to check out and build the code can be found at:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="http://libvirt.org/downloads.html">http://libvirt.org/downloads.html</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Once you have a working development environment, the steps to create a
|
|
||||||
new API are:
|
|
||||||
</p>
|
|
||||||
<ol>
|
|
||||||
<li>define the public API</li>
|
|
||||||
<li>define the internal driver API</li>
|
|
||||||
<li>implement the public API</li>
|
|
||||||
<li>implement the remote protocol:
|
|
||||||
<ol>
|
|
||||||
<li>define the wire protocol format</li>
|
|
||||||
<li>implement the RPC client</li>
|
|
||||||
<li>implement the server side dispatcher</li>
|
|
||||||
</ol>
|
|
||||||
</li>
|
|
||||||
<li>use new API where appropriate in drivers</li>
|
|
||||||
<li>add virsh support</li>
|
|
||||||
<li>add common handling for new API</li>
|
|
||||||
<li>for each driver that can support the new API:
|
|
||||||
<ol>
|
|
||||||
<li>add prerequisite support</li>
|
|
||||||
<li>fully implement new API</li>
|
|
||||||
</ol>
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
It is, of course, possible to implement the pieces in any order, but
|
|
||||||
if the development tasks are completed in the order listed, the code
|
|
||||||
will compile after each step. Given the number of changes required,
|
|
||||||
verification after each step is highly recommended.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Submit new code in the form shown in the example code: one patch
|
|
||||||
per step. That's not to say submit patches before you have working
|
|
||||||
functionality--get the whole thing working and make sure you're happy
|
|
||||||
with it. Then use git or some other version control system that lets
|
|
||||||
you rewrite your commit history and break patches into pieces so you
|
|
||||||
don't drop a big blob of code on the mailing list in one go.
|
|
||||||
Also, you should follow the upstream tree, and rebase your
|
|
||||||
series to adapt your patches to work with any other changes
|
|
||||||
that were accepted upstream during your development.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Don't mix anything else into the patches you submit. The patches
|
|
||||||
should be the minimal changes required to implement the functionality
|
|
||||||
you're adding. If you notice a bug in unrelated code (i.e., code you
|
|
||||||
don't have to touch to implement your API change) during development,
|
|
||||||
create a patch that just addresses that bug and submit it
|
|
||||||
separately.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>With that said, let's begin.</p>
|
|
||||||
|
|
||||||
<h2><a name='publicapi'>Defining the public API</a></h2>
|
|
||||||
|
|
||||||
<p>The first task is to define the public API. If the new API
|
|
||||||
involves an XML extension, you have to enhance the RelaxNG
|
|
||||||
schema and document the new elements or attributes:</p>
|
|
||||||
|
|
||||||
<p><code>
|
|
||||||
docs/schemas/domain.rng<br/>
|
|
||||||
docs/formatdomain.html.in
|
|
||||||
</code></p>
|
|
||||||
|
|
||||||
<p>If the API extension involves a new function, you have to add a
|
|
||||||
declaration in the public header, and arrange to export the
|
|
||||||
function name (symbol) so other programs can link against the
|
|
||||||
libvirt library and call the new function:</p>
|
|
||||||
|
|
||||||
<p><code>
|
|
||||||
include/libvirt/libvirt.h.in
|
|
||||||
src/libvirt_public.syms
|
|
||||||
</code></p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This task is in many ways the most important to get right, since once
|
|
||||||
the API has been committed to the repository, it's libvirt's policy
|
|
||||||
never to change it. Mistakes in the implementation are bugs that you
|
|
||||||
can fix. Make a mistake in the API definition and you're stuck with
|
|
||||||
it, so think carefully about the interface and don't be afraid to
|
|
||||||
rework it as you go through the process of implementing it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0001-add-to-xml.patch">0001-add-to-xml.patch</a>
|
|
||||||
and <a href="api_extension/0002-add-new-public-API.patch">0002-add-new-public-API.patch</a>
|
|
||||||
for example code.</p>
|
|
||||||
|
|
||||||
<h2><a name='internalapi'>Defining the internal API</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Each public API call is associated with a driver, such as a host
|
|
||||||
virtualization driver, a network virtualization driver, a storage
|
|
||||||
virtualization driver, a state driver, or a device monitor. Adding
|
|
||||||
the internal API is ordinarily a matter of adding a new member to the
|
|
||||||
struct representing one of these drivers.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Of course, it's possible that the new API will involve the creation of
|
|
||||||
an entirely new driver type, in which case the changes will include the
|
|
||||||
creation of a new struct type to represent the new driver type.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>The driver structs are defined in:</p>
|
|
||||||
|
|
||||||
<p><code>src/driver.h</code></p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To define the internal API, first typedef the driver function
|
|
||||||
prototype and then add a new field for it to the relevant driver
|
|
||||||
struct. Then, update all existing instances of the driver to
|
|
||||||
provide a <code>NULL</code> stub for the new function.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0003-define-internal-driver-API.patch">0003-define-internal-driver-API.patch</a></p>
|
|
||||||
|
|
||||||
<h2><a name='implpublic'>Implementing the public API</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Implementing the public API is largely a formality in which we wire up
|
|
||||||
public API to the internal driver API. The public API implementation
|
|
||||||
takes care of some basic validity checks before passing control to the
|
|
||||||
driver implementation. In RFC 2119 vocabulary, this function:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ol class="ordinarylist">
|
|
||||||
<li>SHOULD log a message with VIR_DEBUG() indicating that it is
|
|
||||||
being called and its parameters;</li>
|
|
||||||
<li>MUST call virResetLastError();</li>
|
|
||||||
<li>SHOULD confirm that the connection is valid with
|
|
||||||
virCheckConnectReturn() or virCheckConnectGoto();</li>
|
|
||||||
<li><strong>SECURITY: If the API requires a connection with write
|
|
||||||
privileges, MUST confirm that the connection flags do not
|
|
||||||
indicate that the connection is read-only with
|
|
||||||
virCheckReadOnlyGoto();</strong></li>
|
|
||||||
<li>SHOULD do basic validation of the parameters that are being
|
|
||||||
passed in, using helpers like virCheckNonNullArgGoto();</li>
|
|
||||||
<li>MUST confirm that the driver for this connection exists and that
|
|
||||||
it implements this function;</li>
|
|
||||||
<li>MUST call the internal API;</li>
|
|
||||||
<li>SHOULD log a message with VIR_DEBUG() indicating that it is
|
|
||||||
returning, its return value, and status.</li>
|
|
||||||
<li>MUST return status to the caller.</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<p>The public API calls are implemented in:</p>
|
|
||||||
|
|
||||||
<p><code>src/libvirt.c</code></p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0004-implement-the-public-APIs.patch">0004-implement-the-public-APIs.patch</a></p>
|
|
||||||
|
|
||||||
<h2><a name='remoteproto'>Implementing the remote protocol</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Implementing the remote protocol is essentially a
|
|
||||||
straightforward exercise which is probably most easily
|
|
||||||
understood by referring to the existing code and the example
|
|
||||||
patch. It involves several related changes, including the
|
|
||||||
regeneration of derived files, with further details below.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0005-implement-the-remote-protocol.patch">0005-implement-the-remote-protocol.patch</a></p>
|
|
||||||
|
|
||||||
<h3><a name='wireproto'>Defining the wire protocol format</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Defining the wire protocol involves making additions to:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p><code>src/remote/remote_protocol.x</code></p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
First, create two new structs for each new function that you're adding
|
|
||||||
to the API. One struct describes the parameters to be passed to the
|
|
||||||
remote function, and a second struct describes the value returned by
|
|
||||||
the remote function. The one exception to this rule is that functions
|
|
||||||
that return only 0 or -1 for status do not require a struct for returned
|
|
||||||
data.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Second, add values to the remote_procedure enum for each new function
|
|
||||||
added to the API.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Once these changes are in place, it's necessary to run 'make rpcgen'
|
|
||||||
in the src directory to create the .c and .h files required by the
|
|
||||||
remote protocol code. This must be done on a Linux host using the
|
|
||||||
GLibC rpcgen program. Other rpcgen versions may generate code which
|
|
||||||
results in bogus compile time warnings. This regenerates the
|
|
||||||
following files:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p><code>
|
|
||||||
daemon/remote_dispatch_args.h
|
|
||||||
daemon/remote_dispatch_prototypes.h
|
|
||||||
daemon/remote_dispatch_table.h
|
|
||||||
src/remote/remote_protocol.c
|
|
||||||
src/remote/remote_protocol.h
|
|
||||||
</code></p>
|
|
||||||
|
|
||||||
<h3><a name='rpcclient'>Implement the RPC client</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Implementing the uses the rpcgen generated .h files. The remote
|
|
||||||
method calls go in:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p><code>src/remote/remote_internal.c</code></p>
|
|
||||||
|
|
||||||
<p>Each remote method invocation does the following:</p>
|
|
||||||
|
|
||||||
<ol class="ordinarylist">
|
|
||||||
<li>locks the remote driver;</li>
|
|
||||||
<li>sets up the method arguments;</li>
|
|
||||||
<li>invokes the remote function;</li>
|
|
||||||
<li>checks the return value, if necessary;</li>
|
|
||||||
<li>extracts any returned data;</li>
|
|
||||||
<li>frees any returned data;</li>
|
|
||||||
<li>unlocks the remote driver.</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<h3><a name="serverdispatch">Implement the server side dispatcher</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Implementing the server side of the remote function call is simply a
|
|
||||||
matter of deserializing the parameters passed in from the remote
|
|
||||||
caller and passing them to the corresponding internal API function.
|
|
||||||
The server side dispatchers are implemented in:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p><code>daemon/remote.c</code></p>
|
|
||||||
|
|
||||||
<p>Again, this step uses the .h files generated by make rpcgen.</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
After all three pieces of the remote protocol are complete, and
|
|
||||||
the generated files have been updated, it will be necessary to
|
|
||||||
update the file:</p>
|
|
||||||
|
|
||||||
<p><code>src/remote_protocol-structs</code></p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This file should only have new lines added; modifications to
|
|
||||||
existing lines probably imply a backwards-incompatible API change.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0005-implement-the-remote-protocol.patch">0005-implement-the-remote-protocol.patch</a></p>
|
|
||||||
|
|
||||||
<h2><a name="internaluseapi">Use the new API internally</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Sometimes, a new API serves as a superset of existing API, by
|
|
||||||
adding more granularity in what can be managed. When this is
|
|
||||||
the case, it makes sense to share a common implementation by
|
|
||||||
making the older API become a trivial wrapper around the new
|
|
||||||
API, rather than duplicating the common code. This step should
|
|
||||||
not introduce any semantic differences for the old API, and is
|
|
||||||
not necessary if the new API has no relation to existing API.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch">0006-make-old-API-trivially-wrap-to-new-API.patch</a></p>
|
|
||||||
|
|
||||||
<h2><a name="virshuseapi">Expose the new API in virsh</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
All new API should be manageable from the virsh command line
|
|
||||||
shell. This proves that the API is sufficient for the intended
|
|
||||||
purpose, and helps to identify whether the proposed API needs
|
|
||||||
slight changes for easier usage. However, remember that virsh
|
|
||||||
is used to connect to hosts running older versions of libvirtd,
|
|
||||||
so new commands should have fallbacks to an older API if
|
|
||||||
possible; implementing the virsh hooks at this point makes it
|
|
||||||
very easy to test these fallbacks. Also remember to document
|
|
||||||
virsh additions.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
A virsh command is composed of a few pieces of code. You need to
|
|
||||||
define an array of vshCmdInfo structs for each new command that
|
|
||||||
contain the help text and the command description text. You also need
|
|
||||||
an array of vshCmdOptDef structs to describe the command options.
|
|
||||||
Once you have those pieces in place you can write the function
|
|
||||||
implementing the virsh command. Finally, you need to add the new
|
|
||||||
command to the commands[] array. The following files need changes:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p><code>
|
|
||||||
tools/virsh.c<br/>
|
|
||||||
tools/virsh.pod
|
|
||||||
</code></p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0007-add-virsh-support.patch">0007-add-virsh-support.patch</a></p>
|
|
||||||
|
|
||||||
<h2><a name="driverimpl">Implement the driver methods</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
So, after all that, we get to the fun part. All functionality in
|
|
||||||
libvirt is implemented inside a driver. Thus, here is where you
|
|
||||||
implement whatever functionality you're adding to libvirt. You'll
|
|
||||||
either need to add additional files to the src directory or extend
|
|
||||||
files that are already there, depending on what functionality you're
|
|
||||||
adding.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a name="commonimpl">Implement common handling</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If the new API is applicable to more than one driver, it may
|
|
||||||
make sense to provide some utility routines, or to factor some
|
|
||||||
of the work into the dispatcher, to avoid reimplementing the
|
|
||||||
same code in every driver. In the example code, this involved
|
|
||||||
adding a member to the virDomainDefPtr struct for mapping
|
|
||||||
between the XML API addition and the in-memory representation of
|
|
||||||
a domain, along with updating all clients to use the new member.
|
|
||||||
Up to this point, there have been no changes to existing
|
|
||||||
semantics, and the new APIs will fail unless they are used in
|
|
||||||
the same way as the older API wrappers.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0008-support-new-xml.patch">0008-support-new-xml.patch</a></p>
|
|
||||||
|
|
||||||
<h3><a name="drivercode">Implement driver handling</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The remaining patches should only touch one driver at a time.
|
|
||||||
It is possible to implement all changes for a driver in one
|
|
||||||
patch, but for review purposes it may still make sense to break
|
|
||||||
things into simpler steps. Here is where the new APIs finally
|
|
||||||
start working.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In the example patches, three separate drivers are supported:
|
|
||||||
test, qemu, and xen. It is always a good idea to patch the test
|
|
||||||
driver in addition to the target driver, to prove that the API
|
|
||||||
can be used for more than one driver. The example updates the
|
|
||||||
test driver in one patch:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0009-support-all-flags-in-test-driver.patch">0009-support-all-flags-in-test-driver.patch</a></p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The qemu changes were easier to split into two phases, one for
|
|
||||||
updating the mapping between the new XML and the hypervisor
|
|
||||||
command line arguments, and one for supporting all possible
|
|
||||||
flags of the new API:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0010-improve-vcpu-support-in-qemu-command-line.patch">0010-improve-vcpu-support-in-qemu-command-line.patch</a>
|
|
||||||
and <a href="api_extension/0011-complete-vcpu-support-in-qemu-driver.patch">0011-complete-vcpu-support-in-qemu-driver.patch</a></p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Finally, the example breaks the xen driver changes across four
|
|
||||||
patches. One maps the XML changes to the hypervisor command,
|
|
||||||
the next two are independently implementing the getter and
|
|
||||||
setter APIs, and the last one provides cleanup of code that was
|
|
||||||
rendered dead by the new API.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="example">See <a href="api_extension/0012-improve-vcpu-support-in-xen-command-line.patch">0012-improve-vcpu-support-in-xen-command-line.patch</a>,
|
|
||||||
<a href="api_extension/0013-improve-getting-xen-vcpu-counts.patch">0013-improve-getting-xen-vcpu-counts.patch</a>,
|
|
||||||
<a href="api_extension/0014-improve-setting-xen-vcpu-counts.patch">0014-improve-setting-xen-vcpu-counts.patch</a>,
|
|
||||||
and <a href="api_extension/0015-remove-dead-xen-code.patch">0015-remove-dead-xen-code.patch</a></p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The exact details of the example code are probably uninteresting
|
|
||||||
unless you're concerned with virtual cpu management.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Once you have working functionality, run make check and make
|
|
||||||
syntax-check on each patch of the series before submitting
|
|
||||||
patches. It may also be worth writing tests for the libvirt-TCK
|
|
||||||
testsuite to exercise your new API, although those patches are
|
|
||||||
not kept in the libvirt repository.
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
From a74f4e44649906dcd82151f7ef837f66d7fa2ab1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Mon, 27 Sep 2010 17:36:06 -0600
|
|
||||||
Subject: [PATCH 01/15] vcpu: add current attribute to <vcpu> element
|
|
||||||
|
|
||||||
Syntax agreed on in
|
|
||||||
https://www.redhat.com/archives/libvir-list/2010-September/msg00476.html
|
|
||||||
|
|
||||||
<domain ...>
|
|
||||||
<vcpu current='x'>y</vcpu>
|
|
||||||
...
|
|
||||||
|
|
||||||
can now be used to specify 1 <= x <= y current vcpus, in relation
|
|
||||||
to the boot-time max of y vcpus. If current is omitted, then
|
|
||||||
current and max are assumed to be the same value.
|
|
||||||
|
|
||||||
* docs/schemas/domain.rng: Add new attribute.
|
|
||||||
* docs/formatdomain.html.in: Document it.
|
|
||||||
* tests/qemuxml2argvdata/qemuxml2argv-smp.xml: Add to
|
|
||||||
domainschematest.
|
|
||||||
* tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml: Likewise.
|
|
||||||
---
|
|
||||||
docs/formatdomain.html.in | 9 +++++--
|
|
||||||
docs/schemas/domain.rng | 5 ++++
|
|
||||||
tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 28 +++++++++++++++++++++++++++
|
|
||||||
tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml | 22 +++++++++++++++++++++
|
|
||||||
4 files changed, 61 insertions(+), 3 deletions(-)
|
|
||||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-smp.xml
|
|
||||||
create mode 100644 tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml
|
|
||||||
|
|
||||||
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
|
|
||||||
index a8a1fac..96de121 100644
|
|
||||||
--- a/docs/formatdomain.html.in
|
|
||||||
+++ b/docs/formatdomain.html.in
|
|
||||||
@@ -200,7 +200,7 @@
|
|
||||||
<swap_hard_limit>2097152</swap_hard_limit>
|
|
||||||
<min_guarantee>65536</min_guarantee>
|
|
||||||
</memtune>
|
|
||||||
- <vcpu cpuset="1-4,^3,6">2</vcpu>
|
|
||||||
+ <vcpu cpuset="1-4,^3,6" current="1">2</vcpu>
|
|
||||||
...</pre>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
@@ -238,7 +238,7 @@
|
|
||||||
minimum memory allocation for the guest. The units for this value are
|
|
||||||
kilobytes (i.e. blocks of 1024 bytes)</dd>
|
|
||||||
<dt><code>vcpu</code></dt>
|
|
||||||
- <dd>The content of this element defines the number of virtual
|
|
||||||
+ <dd>The content of this element defines the maximum number of virtual
|
|
||||||
CPUs allocated for the guest OS, which must be between 1 and
|
|
||||||
the maximum supported by the hypervisor. <span class="since">Since
|
|
||||||
0.4.4</span>, this element can contain an optional
|
|
||||||
@@ -246,7 +246,10 @@
|
|
||||||
list of physical CPU numbers that virtual CPUs can be pinned
|
|
||||||
to. Each element in that list is either a single CPU number,
|
|
||||||
a range of CPU numbers, or a caret followed by a CPU number to
|
|
||||||
- be excluded from a previous range.
|
|
||||||
+ be excluded from a previous range. <span class="since">Since
|
|
||||||
+ 0.8.5</span>, the optional attribute <code>current</code> can
|
|
||||||
+ be used to specify whether fewer than the maximum number of
|
|
||||||
+ virtual CPUs should be enabled.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
|
|
||||||
index f230263..a934a77 100644
|
|
||||||
--- a/docs/schemas/domain.rng
|
|
||||||
+++ b/docs/schemas/domain.rng
|
|
||||||
@@ -337,6 +337,11 @@
|
|
||||||
<ref name="cpuset"/>
|
|
||||||
</attribute>
|
|
||||||
</optional>
|
|
||||||
+ <optional>
|
|
||||||
+ <attribute name="current">
|
|
||||||
+ <ref name="countCPU"/>
|
|
||||||
+ </attribute>
|
|
||||||
+ </optional>
|
|
||||||
<ref name="countCPU"/>
|
|
||||||
</element>
|
|
||||||
</optional>
|
|
||||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smp.xml b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..975f873
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml
|
|
||||||
@@ -0,0 +1,28 @@
|
|
||||||
+<domain type='qemu'>
|
|
||||||
+ <name>QEMUGuest1</name>
|
|
||||||
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
|
||||||
+ <memory>219200</memory>
|
|
||||||
+ <currentMemory>219200</currentMemory>
|
|
||||||
+ <vcpu current='1'>2</vcpu>
|
|
||||||
+ <os>
|
|
||||||
+ <type arch='i686' machine='pc'>hvm</type>
|
|
||||||
+ <boot dev='hd'/>
|
|
||||||
+ </os>
|
|
||||||
+ <cpu>
|
|
||||||
+ <topology sockets='2' cores='1' threads='1'/>
|
|
||||||
+ </cpu>
|
|
||||||
+ <clock offset='utc'/>
|
|
||||||
+ <on_poweroff>destroy</on_poweroff>
|
|
||||||
+ <on_reboot>restart</on_reboot>
|
|
||||||
+ <on_crash>destroy</on_crash>
|
|
||||||
+ <devices>
|
|
||||||
+ <emulator>/usr/bin/qemu</emulator>
|
|
||||||
+ <disk type='block' device='disk'>
|
|
||||||
+ <source dev='/dev/HostVG/QEMUGuest1'/>
|
|
||||||
+ <target dev='hda' bus='ide'/>
|
|
||||||
+ <address type='drive' controller='0' bus='0' unit='0'/>
|
|
||||||
+ </disk>
|
|
||||||
+ <controller type='ide' index='0'/>
|
|
||||||
+ <memballoon model='virtio'/>
|
|
||||||
+ </devices>
|
|
||||||
+</domain>
|
|
||||||
diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..d061e11
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml
|
|
||||||
@@ -0,0 +1,22 @@
|
|
||||||
+<domain type='xen' id='15'>
|
|
||||||
+ <name>pvtest</name>
|
|
||||||
+ <uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
|
|
||||||
+ <os>
|
|
||||||
+ <type>linux</type>
|
|
||||||
+ <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
|
|
||||||
+ <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
|
|
||||||
+ <cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os </cmdline>
|
|
||||||
+ </os>
|
|
||||||
+ <memory>430080</memory>
|
|
||||||
+ <vcpu current='2'>4</vcpu>
|
|
||||||
+ <on_poweroff>destroy</on_poweroff>
|
|
||||||
+ <on_reboot>destroy</on_reboot>
|
|
||||||
+ <on_crash>destroy</on_crash>
|
|
||||||
+ <devices>
|
|
||||||
+ <disk type='file' device='disk'>
|
|
||||||
+ <source file='/root/some.img'/>
|
|
||||||
+ <target dev='xvda'/>
|
|
||||||
+ </disk>
|
|
||||||
+ <console tty='/dev/pts/4'/>
|
|
||||||
+ </devices>
|
|
||||||
+</domain>
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
From ea3f5c68093429c6ad507b45689cdf209c2c257b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Fri, 24 Sep 2010 16:48:45 -0600
|
|
||||||
Subject: [PATCH 02/15] vcpu: add new public API
|
|
||||||
|
|
||||||
API agreed on in
|
|
||||||
https://www.redhat.com/archives/libvir-list/2010-September/msg00456.html,
|
|
||||||
but modified for enum names to be consistent with virDomainDeviceModifyFlags.
|
|
||||||
|
|
||||||
* include/libvirt/libvirt.h.in (virDomainVcpuFlags)
|
|
||||||
(virDomainSetVcpusFlags, virDomainGetVcpusFlags): New
|
|
||||||
declarations.
|
|
||||||
* src/libvirt_public.syms: Export new symbols.
|
|
||||||
---
|
|
||||||
include/libvirt/libvirt.h.in | 15 +++++++++++++++
|
|
||||||
src/libvirt_public.syms | 2 ++
|
|
||||||
2 files changed, 17 insertions(+), 0 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
|
|
||||||
index 2eba61e..d0cc4c0 100644
|
|
||||||
--- a/include/libvirt/libvirt.h.in
|
|
||||||
+++ b/include/libvirt/libvirt.h.in
|
|
||||||
@@ -915,8 +915,23 @@ struct _virVcpuInfo {
|
|
||||||
};
|
|
||||||
typedef virVcpuInfo *virVcpuInfoPtr;
|
|
||||||
|
|
||||||
+/* Flags for controlling virtual CPU hot-plugging. */
|
|
||||||
+typedef enum {
|
|
||||||
+ /* Must choose at least one of these two bits; SetVcpus can choose both */
|
|
||||||
+ VIR_DOMAIN_VCPU_LIVE = (1 << 0), /* Affect active domain */
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG = (1 << 1), /* Affect next boot */
|
|
||||||
+
|
|
||||||
+ /* Additional flags to be bit-wise OR'd in */
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM = (1 << 2), /* Max rather than current count */
|
|
||||||
+} virDomainVcpuFlags;
|
|
||||||
+
|
|
||||||
int virDomainSetVcpus (virDomainPtr domain,
|
|
||||||
unsigned int nvcpus);
|
|
||||||
+int virDomainSetVcpusFlags (virDomainPtr domain,
|
|
||||||
+ unsigned int nvcpus,
|
|
||||||
+ unsigned int flags);
|
|
||||||
+int virDomainGetVcpusFlags (virDomainPtr domain,
|
|
||||||
+ unsigned int flags);
|
|
||||||
|
|
||||||
int virDomainPinVcpu (virDomainPtr domain,
|
|
||||||
unsigned int vcpu,
|
|
||||||
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
|
|
||||||
index fceb516..a8091b1 100644
|
|
||||||
--- a/src/libvirt_public.syms
|
|
||||||
+++ b/src/libvirt_public.syms
|
|
||||||
@@ -409,6 +409,8 @@ LIBVIRT_0.8.5 {
|
|
||||||
global:
|
|
||||||
virDomainSetMemoryParameters;
|
|
||||||
virDomainGetMemoryParameters;
|
|
||||||
+ virDomainGetVcpusFlags;
|
|
||||||
+ virDomainSetVcpusFlags;
|
|
||||||
} LIBVIRT_0.8.2;
|
|
||||||
|
|
||||||
# .... define new API here using predicted next version number ....
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
From dd255d64053e9960cd375994ce8f056522e12acc Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Mon, 27 Sep 2010 09:18:22 -0600
|
|
||||||
Subject: [PATCH 03/15] vcpu: define internal driver API
|
|
||||||
|
|
||||||
* src/driver.h (virDrvDomainSetVcpusFlags)
|
|
||||||
(virDrvDomainGetVcpusFlags): New typedefs.
|
|
||||||
(_virDriver): New callback members.
|
|
||||||
* src/esx/esx_driver.c (esxDriver): Add stub for driver.
|
|
||||||
* src/lxc/lxc_driver.c (lxcDriver): Likewise.
|
|
||||||
* src/opennebula/one_driver.c (oneDriver): Likewise.
|
|
||||||
* src/openvz/openvz_driver.c (openvzDriver): Likewise.
|
|
||||||
* src/phyp/phyp_driver.c (phypDriver): Likewise.
|
|
||||||
* src/qemu/qemu_driver.c (qemuDriver): Likewise.
|
|
||||||
* src/remote/remote_driver.c (remote_driver): Likewise.
|
|
||||||
* src/test/test_driver.c (testDriver): Likewise.
|
|
||||||
* src/uml/uml_driver.c (umlDriver): Likewise.
|
|
||||||
* src/vbox/vbox_tmpl.c (Driver): Likewise.
|
|
||||||
* src/xen/xen_driver.c (xenUnifiedDriver): Likewise.
|
|
||||||
* src/xenapi/xenapi_driver.c (xenapiDriver): Likewise.
|
|
||||||
---
|
|
||||||
src/driver.h | 9 +++++++++
|
|
||||||
src/esx/esx_driver.c | 2 ++
|
|
||||||
src/lxc/lxc_driver.c | 2 ++
|
|
||||||
src/opennebula/one_driver.c | 2 ++
|
|
||||||
src/openvz/openvz_driver.c | 2 ++
|
|
||||||
src/phyp/phyp_driver.c | 2 ++
|
|
||||||
src/qemu/qemu_driver.c | 2 ++
|
|
||||||
src/remote/remote_driver.c | 2 ++
|
|
||||||
src/test/test_driver.c | 2 ++
|
|
||||||
src/uml/uml_driver.c | 2 ++
|
|
||||||
src/vbox/vbox_tmpl.c | 2 ++
|
|
||||||
src/xen/xen_driver.c | 2 ++
|
|
||||||
src/xenapi/xenapi_driver.c | 2 ++
|
|
||||||
13 files changed, 33 insertions(+), 0 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/driver.h b/src/driver.h
|
|
||||||
index 32aeb04..79a96c1 100644
|
|
||||||
--- a/src/driver.h
|
|
||||||
+++ b/src/driver.h
|
|
||||||
@@ -185,6 +185,13 @@ typedef int
|
|
||||||
(*virDrvDomainSetVcpus) (virDomainPtr domain,
|
|
||||||
unsigned int nvcpus);
|
|
||||||
typedef int
|
|
||||||
+ (*virDrvDomainSetVcpusFlags) (virDomainPtr domain,
|
|
||||||
+ unsigned int nvcpus,
|
|
||||||
+ unsigned int flags);
|
|
||||||
+typedef int
|
|
||||||
+ (*virDrvDomainGetVcpusFlags) (virDomainPtr domain,
|
|
||||||
+ unsigned int flags);
|
|
||||||
+typedef int
|
|
||||||
(*virDrvDomainPinVcpu) (virDomainPtr domain,
|
|
||||||
unsigned int vcpu,
|
|
||||||
unsigned char *cpumap,
|
|
||||||
@@ -520,6 +527,8 @@ struct _virDriver {
|
|
||||||
virDrvDomainRestore domainRestore;
|
|
||||||
virDrvDomainCoreDump domainCoreDump;
|
|
||||||
virDrvDomainSetVcpus domainSetVcpus;
|
|
||||||
+ virDrvDomainSetVcpusFlags domainSetVcpusFlags;
|
|
||||||
+ virDrvDomainGetVcpusFlags domainGetVcpusFlags;
|
|
||||||
virDrvDomainPinVcpu domainPinVcpu;
|
|
||||||
virDrvDomainGetVcpus domainGetVcpus;
|
|
||||||
virDrvDomainGetMaxVcpus domainGetMaxVcpus;
|
|
||||||
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
|
|
||||||
index 1b4ee29..2a32374 100644
|
|
||||||
--- a/src/esx/esx_driver.c
|
|
||||||
+++ b/src/esx/esx_driver.c
|
|
||||||
@@ -4160,6 +4160,8 @@ static virDriver esxDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
esxDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
esxDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
|
|
||||||
index df814da..7563a8c 100644
|
|
||||||
--- a/src/lxc/lxc_driver.c
|
|
||||||
+++ b/src/lxc/lxc_driver.c
|
|
||||||
@@ -2768,6 +2768,8 @@ static virDriver lxcDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
NULL, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
NULL, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c
|
|
||||||
index ced9a38..199fca3 100644
|
|
||||||
--- a/src/opennebula/one_driver.c
|
|
||||||
+++ b/src/opennebula/one_driver.c
|
|
||||||
@@ -751,6 +751,8 @@ static virDriver oneDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
NULL, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
NULL, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
|
|
||||||
index 92cf4a1..9d19aeb 100644
|
|
||||||
--- a/src/openvz/openvz_driver.c
|
|
||||||
+++ b/src/openvz/openvz_driver.c
|
|
||||||
@@ -1590,6 +1590,8 @@ static virDriver openvzDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
openvzDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
openvzDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
|
|
||||||
index e63d8d9..6e0a5e9 100644
|
|
||||||
--- a/src/phyp/phyp_driver.c
|
|
||||||
+++ b/src/phyp/phyp_driver.c
|
|
||||||
@@ -3941,6 +3941,8 @@ static virDriver phypDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
phypDomainSetCPU, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
phypGetLparCPUMAX, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
||||||
index abd8e9d..3d17e04 100644
|
|
||||||
--- a/src/qemu/qemu_driver.c
|
|
||||||
+++ b/src/qemu/qemu_driver.c
|
|
||||||
@@ -12938,6 +12938,8 @@ static virDriver qemuDriver = {
|
|
||||||
qemudDomainRestore, /* domainRestore */
|
|
||||||
qemudDomainCoreDump, /* domainCoreDump */
|
|
||||||
qemudDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
qemudDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
qemudDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
qemudDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
|
|
||||||
index 0b10406..1a687ad 100644
|
|
||||||
--- a/src/remote/remote_driver.c
|
|
||||||
+++ b/src/remote/remote_driver.c
|
|
||||||
@@ -10468,6 +10468,8 @@ static virDriver remote_driver = {
|
|
||||||
remoteDomainRestore, /* domainRestore */
|
|
||||||
remoteDomainCoreDump, /* domainCoreDump */
|
|
||||||
remoteDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
remoteDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
remoteDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
remoteDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
|
|
||||||
index 7d4d119..6a00558 100644
|
|
||||||
--- a/src/test/test_driver.c
|
|
||||||
+++ b/src/test/test_driver.c
|
|
||||||
@@ -5260,6 +5260,8 @@ static virDriver testDriver = {
|
|
||||||
testDomainRestore, /* domainRestore */
|
|
||||||
testDomainCoreDump, /* domainCoreDump */
|
|
||||||
testSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
testDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
testDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
testDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
|
|
||||||
index 3dcd321..5161012 100644
|
|
||||||
--- a/src/uml/uml_driver.c
|
|
||||||
+++ b/src/uml/uml_driver.c
|
|
||||||
@@ -2129,6 +2129,8 @@ static virDriver umlDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
NULL, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
NULL, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
|
|
||||||
index 7e7d8e4..cb9193a 100644
|
|
||||||
--- a/src/vbox/vbox_tmpl.c
|
|
||||||
+++ b/src/vbox/vbox_tmpl.c
|
|
||||||
@@ -8267,6 +8267,8 @@ virDriver NAME(Driver) = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
vboxDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
vboxDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
|
|
||||||
index c2a4de3..7d67ced 100644
|
|
||||||
--- a/src/xen/xen_driver.c
|
|
||||||
+++ b/src/xen/xen_driver.c
|
|
||||||
@@ -1951,6 +1951,8 @@ static virDriver xenUnifiedDriver = {
|
|
||||||
xenUnifiedDomainRestore, /* domainRestore */
|
|
||||||
xenUnifiedDomainCoreDump, /* domainCoreDump */
|
|
||||||
xenUnifiedDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
xenUnifiedDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
xenUnifiedDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
xenUnifiedDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
|
|
||||||
index e62a139..753169c 100644
|
|
||||||
--- a/src/xenapi/xenapi_driver.c
|
|
||||||
+++ b/src/xenapi/xenapi_driver.c
|
|
||||||
@@ -1754,6 +1754,8 @@ static virDriver xenapiDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
xenapiDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
+ NULL, /* domainSetVcpusFlags */
|
|
||||||
+ NULL, /* domainGetVcpusFlags */
|
|
||||||
xenapiDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
xenapiDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
xenapiDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,188 +0,0 @@
|
|||||||
From 9d2c60799271d605f82dfd4bfa6ed7d14ad87e26 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Mon, 27 Sep 2010 09:37:22 -0600
|
|
||||||
Subject: [PATCH 04/15] vcpu: implement the public APIs
|
|
||||||
|
|
||||||
Factors common checks (such as nonzero vcpu count) up front, but
|
|
||||||
drivers will still need to do additional flag checks.
|
|
||||||
|
|
||||||
* src/libvirt.c (virDomainSetVcpusFlags, virDomainGetVcpusFlags):
|
|
||||||
New functions.
|
|
||||||
(virDomainSetVcpus, virDomainGetMaxVcpus): Refer to new API.
|
|
||||||
---
|
|
||||||
src/libvirt.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
|
|
||||||
1 files changed, 134 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/libvirt.c b/src/libvirt.c
|
|
||||||
index 629d97b..1b39210 100644
|
|
||||||
--- a/src/libvirt.c
|
|
||||||
+++ b/src/libvirt.c
|
|
||||||
@@ -5192,7 +5192,9 @@ error:
|
|
||||||
* This function requires privileged access to the hypervisor.
|
|
||||||
*
|
|
||||||
* This command only changes the runtime configuration of the domain,
|
|
||||||
- * so can only be called on an active domain.
|
|
||||||
+ * so can only be called on an active domain. It is hypervisor-dependent
|
|
||||||
+ * whether it also affects persistent configuration; for more control,
|
|
||||||
+ * use virDomainSetVcpusFlags().
|
|
||||||
*
|
|
||||||
* Returns 0 in case of success, -1 in case of failure.
|
|
||||||
*/
|
|
||||||
@@ -5237,13 +5239,139 @@ error:
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
+ * virDomainSetVcpusFlags:
|
|
||||||
+ * @domain: pointer to domain object, or NULL for Domain0
|
|
||||||
+ * @nvcpus: the new number of virtual CPUs for this domain, must be at least 1
|
|
||||||
+ * @flags: an OR'ed set of virDomainVcpuFlags
|
|
||||||
+ *
|
|
||||||
+ * Dynamically change the number of virtual CPUs used by the domain.
|
|
||||||
+ * Note that this call may fail if the underlying virtualization hypervisor
|
|
||||||
+ * does not support it or if growing the number is arbitrary limited.
|
|
||||||
+ * This function requires privileged access to the hypervisor.
|
|
||||||
+ *
|
|
||||||
+ * @flags must include VIR_DOMAIN_VCPU_LIVE to affect a running
|
|
||||||
+ * domain (which may fail if domain is not active), or
|
|
||||||
+ * VIR_DOMAIN_VCPU_CONFIG to affect the next boot via the XML
|
|
||||||
+ * description of the domain. Both flags may be set.
|
|
||||||
+ *
|
|
||||||
+ * If @flags includes VIR_DOMAIN_VCPU_MAXIMUM, then
|
|
||||||
+ * VIR_DOMAIN_VCPU_LIVE must be clear, and only the maximum virtual
|
|
||||||
+ * CPU limit is altered; generally, this value must be less than or
|
|
||||||
+ * equal to virConnectGetMaxVcpus(). Otherwise, this call affects the
|
|
||||||
+ * current virtual CPU limit, which must be less than or equal to the
|
|
||||||
+ * maximum limit.
|
|
||||||
+ *
|
|
||||||
+ * Returns 0 in case of success, -1 in case of failure.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+virDomainSetVcpusFlags(virDomainPtr domain, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ virConnectPtr conn;
|
|
||||||
+ VIR_DEBUG("domain=%p, nvcpus=%u, flags=%u", domain, nvcpus, flags);
|
|
||||||
+
|
|
||||||
+ virResetLastError();
|
|
||||||
+
|
|
||||||
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
|
|
||||||
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
|
|
||||||
+ virDispatchError(NULL);
|
|
||||||
+ return (-1);
|
|
||||||
+ }
|
|
||||||
+ if (domain->conn->flags & VIR_CONNECT_RO) {
|
|
||||||
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
|
|
||||||
+ goto error;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Perform some argument validation common to all implementations. */
|
|
||||||
+ if (nvcpus < 1 || (unsigned short) nvcpus != nvcpus ||
|
|
||||||
+ (flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0) {
|
|
||||||
+ virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
+ goto error;
|
|
||||||
+ }
|
|
||||||
+ conn = domain->conn;
|
|
||||||
+
|
|
||||||
+ if (conn->driver->domainSetVcpusFlags) {
|
|
||||||
+ int ret;
|
|
||||||
+ ret = conn->driver->domainSetVcpusFlags (domain, nvcpus, flags);
|
|
||||||
+ if (ret < 0)
|
|
||||||
+ goto error;
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
||||||
+
|
|
||||||
+error:
|
|
||||||
+ virDispatchError(domain->conn);
|
|
||||||
+ return -1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * virDomainGetVcpusFlags:
|
|
||||||
+ * @domain: pointer to domain object, or NULL for Domain0
|
|
||||||
+ * @flags: an OR'ed set of virDomainVcpuFlags
|
|
||||||
+ *
|
|
||||||
+ * Query the number of virtual CPUs used by the domain. Note that
|
|
||||||
+ * this call may fail if the underlying virtualization hypervisor does
|
|
||||||
+ * not support it. This function requires privileged access to the
|
|
||||||
+ * hypervisor.
|
|
||||||
+ *
|
|
||||||
+ * @flags must include either VIR_DOMAIN_VCPU_ACTIVE to query a
|
|
||||||
+ * running domain (which will fail if domain is not active), or
|
|
||||||
+ * VIR_DOMAIN_VCPU_PERSISTENT to query the XML description of the
|
|
||||||
+ * domain. It is an error to set both flags.
|
|
||||||
+ *
|
|
||||||
+ * If @flags includes VIR_DOMAIN_VCPU_MAXIMUM, then the maximum
|
|
||||||
+ * virtual CPU limit is queried. Otherwise, this call queries the
|
|
||||||
+ * current virtual CPU limit.
|
|
||||||
+ *
|
|
||||||
+ * Returns 0 in case of success, -1 in case of failure.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+virDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ virConnectPtr conn;
|
|
||||||
+ VIR_DEBUG("domain=%p, flags=%u", domain, flags);
|
|
||||||
+
|
|
||||||
+ virResetLastError();
|
|
||||||
+
|
|
||||||
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
|
|
||||||
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
|
|
||||||
+ virDispatchError(NULL);
|
|
||||||
+ return (-1);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Exactly one of these two flags should be set. */
|
|
||||||
+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
|
|
||||||
+ virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
+ goto error;
|
|
||||||
+ }
|
|
||||||
+ conn = domain->conn;
|
|
||||||
+
|
|
||||||
+ if (conn->driver->domainGetVcpusFlags) {
|
|
||||||
+ int ret;
|
|
||||||
+ ret = conn->driver->domainGetVcpusFlags (domain, flags);
|
|
||||||
+ if (ret < 0)
|
|
||||||
+ goto error;
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
||||||
+
|
|
||||||
+error:
|
|
||||||
+ virDispatchError(domain->conn);
|
|
||||||
+ return -1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
* virDomainPinVcpu:
|
|
||||||
* @domain: pointer to domain object, or NULL for Domain0
|
|
||||||
* @vcpu: virtual CPU number
|
|
||||||
* @cpumap: 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.
|
|
||||||
+ * 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.
|
|
||||||
* @maplen: number of bytes in cpumap, from 1 up to size of CPU map in
|
|
||||||
* underlying virtualization system (Xen...).
|
|
||||||
* If maplen < size, missing bytes are set to zero.
|
|
||||||
@@ -5371,9 +5499,9 @@ error:
|
|
||||||
*
|
|
||||||
* Provides the maximum number of virtual CPUs supported for
|
|
||||||
* the guest VM. If the guest is inactive, this is basically
|
|
||||||
- * the same as virConnectGetMaxVcpus. If the guest is running
|
|
||||||
+ * the same as virConnectGetMaxVcpus(). If the guest is running
|
|
||||||
* this will reflect the maximum number of virtual CPUs the
|
|
||||||
- * guest was booted with.
|
|
||||||
+ * guest was booted with. For more details, see virDomainGetVcpusFlags().
|
|
||||||
*
|
|
||||||
* Returns the maximum of virtual CPU or -1 in case of error.
|
|
||||||
*/
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,421 +0,0 @@
|
|||||||
From eb826444f90c2563dadf148630b0cd6a9b41ba1e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Mon, 27 Sep 2010 10:10:06 -0600
|
|
||||||
Subject: [PATCH 05/15] vcpu: implement the remote protocol
|
|
||||||
|
|
||||||
Done by editing the first three files, then running
|
|
||||||
'make -C src rpcgen', then editing src/remote_protocol-structs
|
|
||||||
to match.
|
|
||||||
|
|
||||||
* daemon/remote.c (remoteDispatchDomainSetVcpusFlags)
|
|
||||||
(remoteDispatchDomainGetVcpusFlags): New functions.
|
|
||||||
* src/remote/remote_driver.c (remoteDomainSetVcpusFlags)
|
|
||||||
(remoteDomainGetVcpusFlags, remote_driver): Client side
|
|
||||||
serialization.
|
|
||||||
* src/remote/remote_protocol.x
|
|
||||||
(remote_domain_set_vcpus_flags_args)
|
|
||||||
(remote_domain_get_vcpus_flags_args)
|
|
||||||
(remote_domain_get_vcpus_flags_ret)
|
|
||||||
(REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS)
|
|
||||||
(REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS): Define wire format.
|
|
||||||
* daemon/remote_dispatch_args.h: Regenerate.
|
|
||||||
* daemon/remote_dispatch_prototypes.h: Likewise.
|
|
||||||
* daemon/remote_dispatch_table.h: Likewise.
|
|
||||||
* src/remote/remote_protocol.c: Likewise.
|
|
||||||
* src/remote/remote_protocol.h: Likewise.
|
|
||||||
* src/remote_protocol-structs: Likewise.
|
|
||||||
---
|
|
||||||
daemon/remote.c | 53 ++++++++++++++++++++++++++++++++
|
|
||||||
daemon/remote_dispatch_args.h | 2 +
|
|
||||||
daemon/remote_dispatch_prototypes.h | 16 ++++++++++
|
|
||||||
daemon/remote_dispatch_ret.h | 1 +
|
|
||||||
daemon/remote_dispatch_table.h | 10 ++++++
|
|
||||||
src/remote/remote_driver.c | 57 +++++++++++++++++++++++++++++++++-
|
|
||||||
src/remote/remote_protocol.c | 33 ++++++++++++++++++++
|
|
||||||
src/remote/remote_protocol.h | 26 ++++++++++++++++
|
|
||||||
src/remote/remote_protocol.x | 19 +++++++++++-
|
|
||||||
src/remote_protocol-structs | 12 +++++++
|
|
||||||
10 files changed, 226 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/daemon/remote.c b/daemon/remote.c
|
|
||||||
index 7a96e29..323f00c 100644
|
|
||||||
--- a/daemon/remote.c
|
|
||||||
+++ b/daemon/remote.c
|
|
||||||
@@ -1751,6 +1751,33 @@ oom:
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
+remoteDispatchDomainGetVcpusFlags (struct qemud_server *server ATTRIBUTE_UNUSED,
|
|
||||||
+ struct qemud_client *client ATTRIBUTE_UNUSED,
|
|
||||||
+ virConnectPtr conn,
|
|
||||||
+ remote_message_header *hdr ATTRIBUTE_UNUSED,
|
|
||||||
+ remote_error *rerr,
|
|
||||||
+ remote_domain_get_vcpus_flags_args *args,
|
|
||||||
+ remote_domain_get_vcpus_flags_ret *ret)
|
|
||||||
+{
|
|
||||||
+ virDomainPtr dom;
|
|
||||||
+
|
|
||||||
+ dom = get_nonnull_domain (conn, args->dom);
|
|
||||||
+ if (dom == NULL) {
|
|
||||||
+ remoteDispatchConnError(rerr, conn);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret->num = virDomainGetVcpusFlags (dom, args->flags);
|
|
||||||
+ if (ret->num == -1) {
|
|
||||||
+ virDomainFree(dom);
|
|
||||||
+ remoteDispatchConnError(rerr, conn);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ virDomainFree(dom);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
remoteDispatchDomainMigratePrepare (struct qemud_server *server ATTRIBUTE_UNUSED,
|
|
||||||
struct qemud_client *client ATTRIBUTE_UNUSED,
|
|
||||||
virConnectPtr conn,
|
|
||||||
@@ -2568,6 +2595,32 @@ remoteDispatchDomainSetVcpus (struct qemud_server *server ATTRIBUTE_UNUSED,
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
+remoteDispatchDomainSetVcpusFlags (struct qemud_server *server ATTRIBUTE_UNUSED,
|
|
||||||
+ struct qemud_client *client ATTRIBUTE_UNUSED,
|
|
||||||
+ virConnectPtr conn,
|
|
||||||
+ remote_message_header *hdr ATTRIBUTE_UNUSED,
|
|
||||||
+ remote_error *rerr,
|
|
||||||
+ remote_domain_set_vcpus_flags_args *args,
|
|
||||||
+ void *ret ATTRIBUTE_UNUSED)
|
|
||||||
+{
|
|
||||||
+ virDomainPtr dom;
|
|
||||||
+
|
|
||||||
+ dom = get_nonnull_domain (conn, args->dom);
|
|
||||||
+ if (dom == NULL) {
|
|
||||||
+ remoteDispatchConnError(rerr, conn);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (virDomainSetVcpusFlags (dom, args->nvcpus, args->flags) == -1) {
|
|
||||||
+ virDomainFree(dom);
|
|
||||||
+ remoteDispatchConnError(rerr, conn);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ virDomainFree(dom);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
remoteDispatchDomainShutdown (struct qemud_server *server ATTRIBUTE_UNUSED,
|
|
||||||
struct qemud_client *client ATTRIBUTE_UNUSED,
|
|
||||||
virConnectPtr conn,
|
|
||||||
diff --git a/daemon/remote_dispatch_args.h b/daemon/remote_dispatch_args.h
|
|
||||||
index d8528b6..9583e9c 100644
|
|
||||||
--- a/daemon/remote_dispatch_args.h
|
|
||||||
+++ b/daemon/remote_dispatch_args.h
|
|
||||||
@@ -167,3 +167,5 @@
|
|
||||||
remote_domain_create_with_flags_args val_remote_domain_create_with_flags_args;
|
|
||||||
remote_domain_set_memory_parameters_args val_remote_domain_set_memory_parameters_args;
|
|
||||||
remote_domain_get_memory_parameters_args val_remote_domain_get_memory_parameters_args;
|
|
||||||
+ remote_domain_set_vcpus_flags_args val_remote_domain_set_vcpus_flags_args;
|
|
||||||
+ remote_domain_get_vcpus_flags_args val_remote_domain_get_vcpus_flags_args;
|
|
||||||
diff --git a/daemon/remote_dispatch_prototypes.h b/daemon/remote_dispatch_prototypes.h
|
|
||||||
index b674bb4..6b35851 100644
|
|
||||||
--- a/daemon/remote_dispatch_prototypes.h
|
|
||||||
+++ b/daemon/remote_dispatch_prototypes.h
|
|
||||||
@@ -306,6 +306,14 @@ static int remoteDispatchDomainGetVcpus(
|
|
||||||
remote_error *err,
|
|
||||||
remote_domain_get_vcpus_args *args,
|
|
||||||
remote_domain_get_vcpus_ret *ret);
|
|
||||||
+static int remoteDispatchDomainGetVcpusFlags(
|
|
||||||
+ struct qemud_server *server,
|
|
||||||
+ struct qemud_client *client,
|
|
||||||
+ virConnectPtr conn,
|
|
||||||
+ remote_message_header *hdr,
|
|
||||||
+ remote_error *err,
|
|
||||||
+ remote_domain_get_vcpus_flags_args *args,
|
|
||||||
+ remote_domain_get_vcpus_flags_ret *ret);
|
|
||||||
static int remoteDispatchDomainHasCurrentSnapshot(
|
|
||||||
struct qemud_server *server,
|
|
||||||
struct qemud_client *client,
|
|
||||||
@@ -554,6 +562,14 @@ static int remoteDispatchDomainSetVcpus(
|
|
||||||
remote_error *err,
|
|
||||||
remote_domain_set_vcpus_args *args,
|
|
||||||
void *ret);
|
|
||||||
+static int remoteDispatchDomainSetVcpusFlags(
|
|
||||||
+ struct qemud_server *server,
|
|
||||||
+ struct qemud_client *client,
|
|
||||||
+ virConnectPtr conn,
|
|
||||||
+ remote_message_header *hdr,
|
|
||||||
+ remote_error *err,
|
|
||||||
+ remote_domain_set_vcpus_flags_args *args,
|
|
||||||
+ void *ret);
|
|
||||||
static int remoteDispatchDomainShutdown(
|
|
||||||
struct qemud_server *server,
|
|
||||||
struct qemud_client *client,
|
|
||||||
diff --git a/daemon/remote_dispatch_ret.h b/daemon/remote_dispatch_ret.h
|
|
||||||
index 17c9bca..3723b00 100644
|
|
||||||
--- a/daemon/remote_dispatch_ret.h
|
|
||||||
+++ b/daemon/remote_dispatch_ret.h
|
|
||||||
@@ -136,3 +136,4 @@
|
|
||||||
remote_domain_get_block_info_ret val_remote_domain_get_block_info_ret;
|
|
||||||
remote_domain_create_with_flags_ret val_remote_domain_create_with_flags_ret;
|
|
||||||
remote_domain_get_memory_parameters_ret val_remote_domain_get_memory_parameters_ret;
|
|
||||||
+ remote_domain_get_vcpus_flags_ret val_remote_domain_get_vcpus_flags_ret;
|
|
||||||
diff --git a/daemon/remote_dispatch_table.h b/daemon/remote_dispatch_table.h
|
|
||||||
index 47d95eb..dd2adc7 100644
|
|
||||||
--- a/daemon/remote_dispatch_table.h
|
|
||||||
+++ b/daemon/remote_dispatch_table.h
|
|
||||||
@@ -997,3 +997,13 @@
|
|
||||||
.args_filter = (xdrproc_t) xdr_remote_domain_get_memory_parameters_args,
|
|
||||||
.ret_filter = (xdrproc_t) xdr_remote_domain_get_memory_parameters_ret,
|
|
||||||
},
|
|
||||||
+{ /* DomainSetVcpusFlags => 199 */
|
|
||||||
+ .fn = (dispatch_fn) remoteDispatchDomainSetVcpusFlags,
|
|
||||||
+ .args_filter = (xdrproc_t) xdr_remote_domain_set_vcpus_flags_args,
|
|
||||||
+ .ret_filter = (xdrproc_t) xdr_void,
|
|
||||||
+},
|
|
||||||
+{ /* DomainGetVcpusFlags => 200 */
|
|
||||||
+ .fn = (dispatch_fn) remoteDispatchDomainGetVcpusFlags,
|
|
||||||
+ .args_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args,
|
|
||||||
+ .ret_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret,
|
|
||||||
+},
|
|
||||||
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
|
|
||||||
index 1a687ad..37c37ef 100644
|
|
||||||
--- a/src/remote/remote_driver.c
|
|
||||||
+++ b/src/remote/remote_driver.c
|
|
||||||
@@ -2580,6 +2580,59 @@ done:
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
+remoteDomainSetVcpusFlags (virDomainPtr domain, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ int rv = -1;
|
|
||||||
+ remote_domain_set_vcpus_flags_args args;
|
|
||||||
+ struct private_data *priv = domain->conn->privateData;
|
|
||||||
+
|
|
||||||
+ remoteDriverLock(priv);
|
|
||||||
+
|
|
||||||
+ make_nonnull_domain (&args.dom, domain);
|
|
||||||
+ args.nvcpus = nvcpus;
|
|
||||||
+ args.flags = flags;
|
|
||||||
+
|
|
||||||
+ if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS,
|
|
||||||
+ (xdrproc_t) xdr_remote_domain_set_vcpus_flags_args,
|
|
||||||
+ (char *) &args,
|
|
||||||
+ (xdrproc_t) xdr_void, (char *) NULL) == -1)
|
|
||||||
+ goto done;
|
|
||||||
+
|
|
||||||
+ rv = 0;
|
|
||||||
+
|
|
||||||
+done:
|
|
||||||
+ remoteDriverUnlock(priv);
|
|
||||||
+ return rv;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+remoteDomainGetVcpusFlags (virDomainPtr domain, unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ int rv = -1;
|
|
||||||
+ remote_domain_get_vcpus_flags_args args;
|
|
||||||
+ remote_domain_get_vcpus_flags_ret ret;
|
|
||||||
+ struct private_data *priv = domain->conn->privateData;
|
|
||||||
+
|
|
||||||
+ remoteDriverLock(priv);
|
|
||||||
+
|
|
||||||
+ make_nonnull_domain (&args.dom, domain);
|
|
||||||
+ args.flags = flags;
|
|
||||||
+
|
|
||||||
+ memset (&ret, 0, sizeof ret);
|
|
||||||
+ if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS,
|
|
||||||
+ (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args, (char *) &args,
|
|
||||||
+ (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret, (char *) &ret) == -1)
|
|
||||||
+ goto done;
|
|
||||||
+
|
|
||||||
+ rv = ret.num;
|
|
||||||
+
|
|
||||||
+done:
|
|
||||||
+ remoteDriverUnlock(priv);
|
|
||||||
+ return rv;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
remoteDomainPinVcpu (virDomainPtr domain,
|
|
||||||
unsigned int vcpu,
|
|
||||||
unsigned char *cpumap,
|
|
||||||
@@ -10468,8 +10521,8 @@ static virDriver remote_driver = {
|
|
||||||
remoteDomainRestore, /* domainRestore */
|
|
||||||
remoteDomainCoreDump, /* domainCoreDump */
|
|
||||||
remoteDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ remoteDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ remoteDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
remoteDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
remoteDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
remoteDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/remote/remote_protocol.c b/src/remote/remote_protocol.c
|
|
||||||
index 5c55713..38ea050 100644
|
|
||||||
--- a/src/remote/remote_protocol.c
|
|
||||||
+++ b/src/remote/remote_protocol.c
|
|
||||||
@@ -1355,6 +1355,39 @@ xdr_remote_domain_set_vcpus_args (XDR *xdrs, remote_domain_set_vcpus_args *objp)
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t
|
|
||||||
+xdr_remote_domain_set_vcpus_flags_args (XDR *xdrs, remote_domain_set_vcpus_flags_args *objp)
|
|
||||||
+{
|
|
||||||
+
|
|
||||||
+ if (!xdr_remote_nonnull_domain (xdrs, &objp->dom))
|
|
||||||
+ return FALSE;
|
|
||||||
+ if (!xdr_u_int (xdrs, &objp->nvcpus))
|
|
||||||
+ return FALSE;
|
|
||||||
+ if (!xdr_u_int (xdrs, &objp->flags))
|
|
||||||
+ return FALSE;
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool_t
|
|
||||||
+xdr_remote_domain_get_vcpus_flags_args (XDR *xdrs, remote_domain_get_vcpus_flags_args *objp)
|
|
||||||
+{
|
|
||||||
+
|
|
||||||
+ if (!xdr_remote_nonnull_domain (xdrs, &objp->dom))
|
|
||||||
+ return FALSE;
|
|
||||||
+ if (!xdr_u_int (xdrs, &objp->flags))
|
|
||||||
+ return FALSE;
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool_t
|
|
||||||
+xdr_remote_domain_get_vcpus_flags_ret (XDR *xdrs, remote_domain_get_vcpus_flags_ret *objp)
|
|
||||||
+{
|
|
||||||
+
|
|
||||||
+ if (!xdr_int (xdrs, &objp->num))
|
|
||||||
+ return FALSE;
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool_t
|
|
||||||
xdr_remote_domain_pin_vcpu_args (XDR *xdrs, remote_domain_pin_vcpu_args *objp)
|
|
||||||
{
|
|
||||||
char **objp_cpp0 = (char **) (void *) &objp->cpumap.cpumap_val;
|
|
||||||
diff --git a/src/remote/remote_protocol.h b/src/remote/remote_protocol.h
|
|
||||||
index 756da11..d75e76c 100644
|
|
||||||
--- a/src/remote/remote_protocol.h
|
|
||||||
+++ b/src/remote/remote_protocol.h
|
|
||||||
@@ -750,6 +750,24 @@ struct remote_domain_set_vcpus_args {
|
|
||||||
};
|
|
||||||
typedef struct remote_domain_set_vcpus_args remote_domain_set_vcpus_args;
|
|
||||||
|
|
||||||
+struct remote_domain_set_vcpus_flags_args {
|
|
||||||
+ remote_nonnull_domain dom;
|
|
||||||
+ u_int nvcpus;
|
|
||||||
+ u_int flags;
|
|
||||||
+};
|
|
||||||
+typedef struct remote_domain_set_vcpus_flags_args remote_domain_set_vcpus_flags_args;
|
|
||||||
+
|
|
||||||
+struct remote_domain_get_vcpus_flags_args {
|
|
||||||
+ remote_nonnull_domain dom;
|
|
||||||
+ u_int flags;
|
|
||||||
+};
|
|
||||||
+typedef struct remote_domain_get_vcpus_flags_args remote_domain_get_vcpus_flags_args;
|
|
||||||
+
|
|
||||||
+struct remote_domain_get_vcpus_flags_ret {
|
|
||||||
+ int num;
|
|
||||||
+};
|
|
||||||
+typedef struct remote_domain_get_vcpus_flags_ret remote_domain_get_vcpus_flags_ret;
|
|
||||||
+
|
|
||||||
struct remote_domain_pin_vcpu_args {
|
|
||||||
remote_nonnull_domain dom;
|
|
||||||
int vcpu;
|
|
||||||
@@ -2281,6 +2299,8 @@ enum remote_procedure {
|
|
||||||
REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS = 196,
|
|
||||||
REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
|
|
||||||
REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
|
|
||||||
+ REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
|
|
||||||
+ REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200,
|
|
||||||
};
|
|
||||||
typedef enum remote_procedure remote_procedure;
|
|
||||||
|
|
||||||
@@ -2422,6 +2442,9 @@ extern bool_t xdr_remote_domain_define_xml_args (XDR *, remote_domain_define_xm
|
|
||||||
extern bool_t xdr_remote_domain_define_xml_ret (XDR *, remote_domain_define_xml_ret*);
|
|
||||||
extern bool_t xdr_remote_domain_undefine_args (XDR *, remote_domain_undefine_args*);
|
|
||||||
extern bool_t xdr_remote_domain_set_vcpus_args (XDR *, remote_domain_set_vcpus_args*);
|
|
||||||
+extern bool_t xdr_remote_domain_set_vcpus_flags_args (XDR *, remote_domain_set_vcpus_flags_args*);
|
|
||||||
+extern bool_t xdr_remote_domain_get_vcpus_flags_args (XDR *, remote_domain_get_vcpus_flags_args*);
|
|
||||||
+extern bool_t xdr_remote_domain_get_vcpus_flags_ret (XDR *, remote_domain_get_vcpus_flags_ret*);
|
|
||||||
extern bool_t xdr_remote_domain_pin_vcpu_args (XDR *, remote_domain_pin_vcpu_args*);
|
|
||||||
extern bool_t xdr_remote_domain_get_vcpus_args (XDR *, remote_domain_get_vcpus_args*);
|
|
||||||
extern bool_t xdr_remote_domain_get_vcpus_ret (XDR *, remote_domain_get_vcpus_ret*);
|
|
||||||
@@ -2762,6 +2785,9 @@ extern bool_t xdr_remote_domain_define_xml_args ();
|
|
||||||
extern bool_t xdr_remote_domain_define_xml_ret ();
|
|
||||||
extern bool_t xdr_remote_domain_undefine_args ();
|
|
||||||
extern bool_t xdr_remote_domain_set_vcpus_args ();
|
|
||||||
+extern bool_t xdr_remote_domain_set_vcpus_flags_args ();
|
|
||||||
+extern bool_t xdr_remote_domain_get_vcpus_flags_args ();
|
|
||||||
+extern bool_t xdr_remote_domain_get_vcpus_flags_ret ();
|
|
||||||
extern bool_t xdr_remote_domain_pin_vcpu_args ();
|
|
||||||
extern bool_t xdr_remote_domain_get_vcpus_args ();
|
|
||||||
extern bool_t xdr_remote_domain_get_vcpus_ret ();
|
|
||||||
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
|
|
||||||
index e80fb5f..d57e6d0 100644
|
|
||||||
--- a/src/remote/remote_protocol.x
|
|
||||||
+++ b/src/remote/remote_protocol.x
|
|
||||||
@@ -768,6 +768,21 @@ struct remote_domain_set_vcpus_args {
|
|
||||||
int nvcpus;
|
|
||||||
};
|
|
||||||
|
|
||||||
+struct remote_domain_set_vcpus_flags_args {
|
|
||||||
+ remote_nonnull_domain dom;
|
|
||||||
+ unsigned int nvcpus;
|
|
||||||
+ unsigned int flags;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+struct remote_domain_get_vcpus_flags_args {
|
|
||||||
+ remote_nonnull_domain dom;
|
|
||||||
+ unsigned int flags;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+struct remote_domain_get_vcpus_flags_ret {
|
|
||||||
+ int num;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
struct remote_domain_pin_vcpu_args {
|
|
||||||
remote_nonnull_domain dom;
|
|
||||||
int vcpu;
|
|
||||||
@@ -2062,7 +2077,9 @@ enum remote_procedure {
|
|
||||||
REMOTE_PROC_DOMAIN_EVENT_IO_ERROR_REASON = 195,
|
|
||||||
REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS = 196,
|
|
||||||
REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
|
|
||||||
- REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198
|
|
||||||
+ REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
|
|
||||||
+ REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
|
|
||||||
+ REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Notice how the entries are grouped in sets of 10 ?
|
|
||||||
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
|
|
||||||
index 838423e..d505886 100644
|
|
||||||
--- a/src/remote_protocol-structs
|
|
||||||
+++ b/src/remote_protocol-structs
|
|
||||||
@@ -461,6 +461,18 @@ struct remote_domain_set_vcpus_args {
|
|
||||||
remote_nonnull_domain dom;
|
|
||||||
int nvcpus;
|
|
||||||
};
|
|
||||||
+struct remote_domain_set_vcpus_flags_args {
|
|
||||||
+ remote_nonnull_domain dom;
|
|
||||||
+ u_int nvcpus;
|
|
||||||
+ u_int flags;
|
|
||||||
+};
|
|
||||||
+struct remote_domain_get_vcpus_flags_args {
|
|
||||||
+ remote_nonnull_domain dom;
|
|
||||||
+ u_int flags;
|
|
||||||
+};
|
|
||||||
+struct remote_domain_get_vcpus_flags_ret {
|
|
||||||
+ int num;
|
|
||||||
+};
|
|
||||||
struct remote_domain_pin_vcpu_args {
|
|
||||||
remote_nonnull_domain dom;
|
|
||||||
int vcpu;
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,735 +0,0 @@
|
|||||||
From 50c51f13e2af04afac46e181c4ed62581545a488 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Mon, 27 Sep 2010 16:37:53 -0600
|
|
||||||
Subject: [PATCH 06/15] vcpu: make old API trivially wrap to new API
|
|
||||||
|
|
||||||
Note - this wrapping is completely mechanical; the old API will
|
|
||||||
function identically, since the new API validates that the exact
|
|
||||||
same flags are provided by the old API. On a per-driver basis,
|
|
||||||
it may make sense to have the old API pass a different set of flags,
|
|
||||||
but that should be done in the per-driver patch that implements
|
|
||||||
the full range of flag support in the new API.
|
|
||||||
|
|
||||||
* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
|
|
||||||
Move guts...
|
|
||||||
(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
|
|
||||||
functions.
|
|
||||||
(esxDriver): Trivially support the new API.
|
|
||||||
* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
|
|
||||||
(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
|
|
||||||
(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
|
|
||||||
* src/phyp/phyp_driver.c (phypDomainSetCPU)
|
|
||||||
(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
|
|
||||||
(phypDomainGetVcpusFlags, phypDriver): Likewise.
|
|
||||||
* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
|
|
||||||
(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
|
|
||||||
(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
|
|
||||||
* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
|
|
||||||
(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
|
|
||||||
Likewise.
|
|
||||||
* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
|
|
||||||
(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
|
|
||||||
(virDomainGetVcpusFlags, virDriver): Likewise.
|
|
||||||
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
|
|
||||||
(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
|
|
||||||
(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
|
|
||||||
* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
|
|
||||||
(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
|
|
||||||
(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
|
|
||||||
(xenapiError): New helper macro.
|
|
||||||
---
|
|
||||||
src/esx/esx_driver.c | 32 +++++++++++++++++++---
|
|
||||||
src/openvz/openvz_driver.c | 34 +++++++++++++++++++++---
|
|
||||||
src/phyp/phyp_driver.c | 32 ++++++++++++++++++++---
|
|
||||||
src/qemu/qemu_driver.c | 38 +++++++++++++++++++++++++---
|
|
||||||
src/test/test_driver.c | 36 ++++++++++++++++++++++---
|
|
||||||
src/vbox/vbox_tmpl.c | 36 +++++++++++++++++++++++---
|
|
||||||
src/xen/xen_driver.c | 34 ++++++++++++++++++++++---
|
|
||||||
src/xenapi/xenapi_driver.c | 60 ++++++++++++++++++++++++++++++++++++++------
|
|
||||||
8 files changed, 263 insertions(+), 39 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
|
|
||||||
index 2a32374..b3e1284 100644
|
|
||||||
--- a/src/esx/esx_driver.c
|
|
||||||
+++ b/src/esx/esx_driver.c
|
|
||||||
@@ -2384,7 +2384,8 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
-esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
|
|
||||||
+esxDomainSetVcpusFlags(virDomainPtr domain, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
{
|
|
||||||
int result = -1;
|
|
||||||
esxPrivate *priv = domain->conn->privateData;
|
|
||||||
@@ -2394,6 +2395,11 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
|
|
||||||
esxVI_ManagedObjectReference *task = NULL;
|
|
||||||
esxVI_TaskInfoState taskInfoState;
|
|
||||||
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ ESX_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (nvcpus < 1) {
|
|
||||||
ESX_ERROR(VIR_ERR_INVALID_ARG, "%s",
|
|
||||||
_("Requested number of virtual CPUs must at least be 1"));
|
|
||||||
@@ -2453,15 +2459,26 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
|
|
||||||
+{
|
|
||||||
+ return esxDomainSetVcpusFlags(domain, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
|
|
||||||
static int
|
|
||||||
-esxDomainGetMaxVcpus(virDomainPtr domain)
|
|
||||||
+esxDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
|
|
||||||
{
|
|
||||||
esxPrivate *priv = domain->conn->privateData;
|
|
||||||
esxVI_String *propertyNameList = NULL;
|
|
||||||
esxVI_ObjectContent *hostSystem = NULL;
|
|
||||||
esxVI_DynamicProperty *dynamicProperty = NULL;
|
|
||||||
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ ESX_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (priv->maxVcpus > 0) {
|
|
||||||
return priv->maxVcpus;
|
|
||||||
}
|
|
||||||
@@ -2507,7 +2524,12 @@ esxDomainGetMaxVcpus(virDomainPtr domain)
|
|
||||||
return priv->maxVcpus;
|
|
||||||
}
|
|
||||||
|
|
||||||
-
|
|
||||||
+static int
|
|
||||||
+esxDomainGetMaxVcpus(virDomainPtr domain)
|
|
||||||
+{
|
|
||||||
+ return esxDomainGetVcpusFlags(domain, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
esxDomainDumpXML(virDomainPtr domain, int flags)
|
|
||||||
@@ -4160,8 +4182,8 @@ static virDriver esxDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
esxDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ esxDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ esxDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
esxDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
|
|
||||||
index 9d19aeb..0f3cfdf 100644
|
|
||||||
--- a/src/openvz/openvz_driver.c
|
|
||||||
+++ b/src/openvz/openvz_driver.c
|
|
||||||
@@ -67,7 +67,6 @@
|
|
||||||
static int openvzGetProcessInfo(unsigned long long *cpuTime, int vpsid);
|
|
||||||
static int openvzGetMaxVCPUs(virConnectPtr conn, const char *type);
|
|
||||||
static int openvzDomainGetMaxVcpus(virDomainPtr dom);
|
|
||||||
-static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus);
|
|
||||||
static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
|
|
||||||
unsigned int nvcpus);
|
|
||||||
static int openvzDomainSetMemoryInternal(virDomainObjPtr vm,
|
|
||||||
@@ -1211,11 +1210,24 @@ static int openvzGetMaxVCPUs(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+openvzDomainGetVcpusFlags(virDomainPtr dom ATTRIBUTE_UNUSED,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ openvzError(VIR_ERR_INVALID_ARG, _("unsupported flags (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
-static int openvzDomainGetMaxVcpus(virDomainPtr dom ATTRIBUTE_UNUSED) {
|
|
||||||
return openvzGetMaxVCPUs(NULL, "openvz");
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int openvzDomainGetMaxVcpus(virDomainPtr dom)
|
|
||||||
+{
|
|
||||||
+ return openvzDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
|
|
||||||
unsigned int nvcpus)
|
|
||||||
{
|
|
||||||
@@ -1241,12 +1253,18 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+static int openvzDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
{
|
|
||||||
virDomainObjPtr vm;
|
|
||||||
struct openvz_driver *driver = dom->conn->privateData;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ openvzError(VIR_ERR_INVALID_ARG, _("unsupported flags (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
openvzDriverLock(driver);
|
|
||||||
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
|
||||||
openvzDriverUnlock(driver);
|
|
||||||
@@ -1272,6 +1290,12 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+{
|
|
||||||
+ return openvzDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static virDrvOpenStatus openvzOpen(virConnectPtr conn,
|
|
||||||
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
|
|
||||||
int flags ATTRIBUTE_UNUSED)
|
|
||||||
@@ -1590,8 +1614,8 @@ static virDriver openvzDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
openvzDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ openvzDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ openvzDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
openvzDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
|
|
||||||
index 6e0a5e9..e284ae0 100644
|
|
||||||
--- a/src/phyp/phyp_driver.c
|
|
||||||
+++ b/src/phyp/phyp_driver.c
|
|
||||||
@@ -1497,15 +1497,27 @@ phypGetLparCPU(virConnectPtr conn, const char *managed_system, int lpar_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
-phypGetLparCPUMAX(virDomainPtr dom)
|
|
||||||
+phypDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
|
|
||||||
{
|
|
||||||
phyp_driverPtr phyp_driver = dom->conn->privateData;
|
|
||||||
char *managed_system = phyp_driver->managed_system;
|
|
||||||
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ PHYP_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return phypGetLparCPUGeneric(dom->conn, managed_system, dom->id, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
+phypGetLparCPUMAX(virDomainPtr dom)
|
|
||||||
+{
|
|
||||||
+ return phypDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
phypGetRemoteSlot(virConnectPtr conn, const char *managed_system,
|
|
||||||
const char *lpar_name)
|
|
||||||
{
|
|
||||||
@@ -3831,7 +3843,8 @@ phypConnectGetCapabilities(virConnectPtr conn)
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
-phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+phypDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
{
|
|
||||||
ConnectionData *connection_data = dom->conn->networkPrivateData;
|
|
||||||
phyp_driverPtr phyp_driver = dom->conn->privateData;
|
|
||||||
@@ -3846,6 +3859,11 @@ phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
unsigned int amount = 0;
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ PHYP_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if ((ncpus = phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
@@ -3891,6 +3909,12 @@ phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+{
|
|
||||||
+ return phypDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static virDrvOpenStatus
|
|
||||||
phypVIOSDriverOpen(virConnectPtr conn,
|
|
||||||
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
|
|
||||||
@@ -3941,8 +3965,8 @@ static virDriver phypDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
phypDomainSetCPU, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ phypDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ phypDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
phypGetLparCPUMAX, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
||||||
index 3d17e04..7a2ea8f 100644
|
|
||||||
--- a/src/qemu/qemu_driver.c
|
|
||||||
+++ b/src/qemu/qemu_driver.c
|
|
||||||
@@ -5934,13 +5934,22 @@ unsupported:
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
|
|
||||||
+static int
|
|
||||||
+qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
struct qemud_driver *driver = dom->conn->privateData;
|
|
||||||
virDomainObjPtr vm;
|
|
||||||
const char * type;
|
|
||||||
int max;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
+ flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
qemuDriverLock(driver);
|
|
||||||
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
|
||||||
qemuDriverUnlock(driver);
|
|
||||||
@@ -5994,6 +6003,12 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+{
|
|
||||||
+ return qemudDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
|
|
||||||
static int
|
|
||||||
qemudDomainPinVcpu(virDomainPtr dom,
|
|
||||||
@@ -6150,12 +6165,20 @@ cleanup:
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-static int qemudDomainGetMaxVcpus(virDomainPtr dom) {
|
|
||||||
+static int
|
|
||||||
+qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
|
|
||||||
+{
|
|
||||||
struct qemud_driver *driver = dom->conn->privateData;
|
|
||||||
virDomainObjPtr vm;
|
|
||||||
const char *type;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
+ flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
qemuDriverLock(driver);
|
|
||||||
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
|
|
||||||
qemuDriverUnlock(driver);
|
|
||||||
@@ -6183,6 +6206,13 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+qemudDomainGetMaxVcpus(virDomainPtr dom)
|
|
||||||
+{
|
|
||||||
+ return qemudDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int qemudDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr seclabel)
|
|
||||||
{
|
|
||||||
struct qemud_driver *driver = (struct qemud_driver *)dom->conn->privateData;
|
|
||||||
@@ -12938,8 +12968,8 @@ static virDriver qemuDriver = {
|
|
||||||
qemudDomainRestore, /* domainRestore */
|
|
||||||
qemudDomainCoreDump, /* domainCoreDump */
|
|
||||||
qemudDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ qemudDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ qemudDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
qemudDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
qemudDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
qemudDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
|
|
||||||
index 6a00558..b70c80d 100644
|
|
||||||
--- a/src/test/test_driver.c
|
|
||||||
+++ b/src/test/test_driver.c
|
|
||||||
@@ -2029,17 +2029,37 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int testDomainGetMaxVcpus(virDomainPtr domain)
|
|
||||||
+static int
|
|
||||||
+testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
|
|
||||||
{
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return testGetMaxVCPUs(domain->conn, "test");
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int testSetVcpus(virDomainPtr domain,
|
|
||||||
- unsigned int nrCpus) {
|
|
||||||
+static int
|
|
||||||
+testDomainGetMaxVcpus(virDomainPtr domain)
|
|
||||||
+{
|
|
||||||
+ return testDomainGetVcpusFlags(domain, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
testConnPtr privconn = domain->conn->privateData;
|
|
||||||
virDomainObjPtr privdom = NULL;
|
|
||||||
int ret = -1, maxvcpus;
|
|
||||||
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* Do this first before locking */
|
|
||||||
maxvcpus = testDomainGetMaxVcpus(domain);
|
|
||||||
if (maxvcpus < 0)
|
|
||||||
@@ -2082,6 +2102,12 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+testSetVcpus(virDomainPtr domain, unsigned int nrCpus)
|
|
||||||
+{
|
|
||||||
+ return testDomainSetVcpusFlags(domain, nrCpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int testDomainGetVcpus(virDomainPtr domain,
|
|
||||||
virVcpuInfoPtr info,
|
|
||||||
int maxinfo,
|
|
||||||
@@ -5260,8 +5286,8 @@ static virDriver testDriver = {
|
|
||||||
testDomainRestore, /* domainRestore */
|
|
||||||
testDomainCoreDump, /* domainCoreDump */
|
|
||||||
testSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ testDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ testDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
testDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
testDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
testDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
|
|
||||||
index cb9193a..0cbe8b3 100644
|
|
||||||
--- a/src/vbox/vbox_tmpl.c
|
|
||||||
+++ b/src/vbox/vbox_tmpl.c
|
|
||||||
@@ -1839,13 +1839,21 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
|
|
||||||
+static int
|
|
||||||
+vboxDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
VBOX_OBJECT_CHECK(dom->conn, int, -1);
|
|
||||||
IMachine *machine = NULL;
|
|
||||||
vboxIID *iid = NULL;
|
|
||||||
PRUint32 CPUCount = nvcpus;
|
|
||||||
nsresult rc;
|
|
||||||
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ vboxError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
#if VBOX_API_VERSION == 2002
|
|
||||||
if (VIR_ALLOC(iid) < 0) {
|
|
||||||
virReportOOMError();
|
|
||||||
@@ -1887,11 +1895,24 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int vboxDomainGetMaxVcpus(virDomainPtr dom) {
|
|
||||||
+static int
|
|
||||||
+vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+{
|
|
||||||
+ return vboxDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+vboxDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
|
|
||||||
+{
|
|
||||||
VBOX_OBJECT_CHECK(dom->conn, int, -1);
|
|
||||||
ISystemProperties *systemProperties = NULL;
|
|
||||||
PRUint32 maxCPUCount = 0;
|
|
||||||
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ vboxError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* Currently every domain supports the same number of max cpus
|
|
||||||
* as that supported by vbox and thus take it directly from
|
|
||||||
* the systemproperties.
|
|
||||||
@@ -1909,6 +1930,13 @@ static int vboxDomainGetMaxVcpus(virDomainPtr dom) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+vboxDomainGetMaxVcpus(virDomainPtr dom)
|
|
||||||
+{
|
|
||||||
+ return vboxDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
|
|
||||||
VBOX_OBJECT_CHECK(dom->conn, char *, NULL);
|
|
||||||
virDomainDefPtr def = NULL;
|
|
||||||
@@ -8267,8 +8295,8 @@ virDriver NAME(Driver) = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
vboxDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ vboxDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ vboxDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
vboxDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
|
|
||||||
index 7d67ced..d6c9c57 100644
|
|
||||||
--- a/src/xen/xen_driver.c
|
|
||||||
+++ b/src/xen/xen_driver.c
|
|
||||||
@@ -1069,11 +1069,18 @@ xenUnifiedDomainCoreDump (virDomainPtr dom, const char *to, int flags)
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
-xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+xenUnifiedDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
{
|
|
||||||
GET_PRIVATE(dom->conn);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
+ flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* Try non-hypervisor methods first, then hypervisor direct method
|
|
||||||
* as a last resort.
|
|
||||||
*/
|
|
||||||
@@ -1093,6 +1100,12 @@ xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
+xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+{
|
|
||||||
+ return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
xenUnifiedDomainPinVcpu (virDomainPtr dom, unsigned int vcpu,
|
|
||||||
unsigned char *cpumap, int maplen)
|
|
||||||
{
|
|
||||||
@@ -1126,11 +1139,17 @@ xenUnifiedDomainGetVcpus (virDomainPtr dom,
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
-xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
|
|
||||||
+xenUnifiedDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
|
|
||||||
{
|
|
||||||
GET_PRIVATE(dom->conn);
|
|
||||||
int i, ret;
|
|
||||||
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
+ flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
||||||
if (priv->opened[i] && drivers[i]->domainGetMaxVcpus) {
|
|
||||||
ret = drivers[i]->domainGetMaxVcpus (dom);
|
|
||||||
@@ -1140,6 +1159,13 @@ xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
|
|
||||||
+{
|
|
||||||
+ return xenUnifiedDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static char *
|
|
||||||
xenUnifiedDomainDumpXML (virDomainPtr dom, int flags)
|
|
||||||
{
|
|
||||||
@@ -1951,8 +1977,8 @@ static virDriver xenUnifiedDriver = {
|
|
||||||
xenUnifiedDomainRestore, /* domainRestore */
|
|
||||||
xenUnifiedDomainCoreDump, /* domainCoreDump */
|
|
||||||
xenUnifiedDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ xenUnifiedDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ xenUnifiedDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
xenUnifiedDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
xenUnifiedDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
xenUnifiedDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
|
|
||||||
index 753169c..7d4ab8d 100644
|
|
||||||
--- a/src/xenapi/xenapi_driver.c
|
|
||||||
+++ b/src/xenapi/xenapi_driver.c
|
|
||||||
@@ -40,6 +40,11 @@
|
|
||||||
#include "xenapi_driver_private.h"
|
|
||||||
#include "xenapi_utils.h"
|
|
||||||
|
|
||||||
+#define VIR_FROM_THIS VIR_FROM_XENAPI
|
|
||||||
+
|
|
||||||
+#define xenapiError(code, ...) \
|
|
||||||
+ virReportErrorHelper(NULL, VIR_FROM_THIS, code, __FILE__, \
|
|
||||||
+ __FUNCTION__, __LINE__, __VA_ARGS__)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getCapsObject
|
|
||||||
@@ -987,19 +992,26 @@ xenapiDomainGetInfo (virDomainPtr dom, virDomainInfoPtr info)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * xenapiDomainSetVcpus
|
|
||||||
+ * xenapiDomainSetVcpusFlags
|
|
||||||
*
|
|
||||||
* Sets the VCPUs on the domain
|
|
||||||
* Return 0 on success or -1 in case of error
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
-xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+xenapiDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
{
|
|
||||||
-
|
|
||||||
/* vm.set_vcpus_max */
|
|
||||||
xen_vm vm;
|
|
||||||
xen_vm_set *vms;
|
|
||||||
xen_session *session = ((struct _xenapiPrivate *)(dom->conn->privateData))->session;
|
|
||||||
+
|
|
||||||
+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ xenapiError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
+ flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (xen_vm_get_by_name_label(session, &vms, dom->name) && vms->size > 0) {
|
|
||||||
if (vms->size != 1) {
|
|
||||||
xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
|
|
||||||
@@ -1019,6 +1031,18 @@ xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * xenapiDomainSetVcpus
|
|
||||||
+ *
|
|
||||||
+ * Sets the VCPUs on the domain
|
|
||||||
+ * Return 0 on success or -1 in case of error
|
|
||||||
+ */
|
|
||||||
+static int
|
|
||||||
+xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
+{
|
|
||||||
+ return xenapiDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* xenapiDomainPinVcpu
|
|
||||||
*
|
|
||||||
* Dynamically change the real CPUs which can be allocated to a virtual CPU
|
|
||||||
@@ -1140,19 +1164,26 @@ xenapiDomainGetVcpus (virDomainPtr dom,
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * xenapiDomainGetMaxVcpus
|
|
||||||
+ * xenapiDomainGetVcpusFlags
|
|
||||||
*
|
|
||||||
*
|
|
||||||
- * Returns maximum number of Vcpus on success or -1 in case of error
|
|
||||||
+ * Returns Vcpus count on success or -1 in case of error
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
-xenapiDomainGetMaxVcpus (virDomainPtr dom)
|
|
||||||
+xenapiDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
|
|
||||||
{
|
|
||||||
xen_vm vm;
|
|
||||||
xen_vm_set *vms;
|
|
||||||
int64_t maxvcpu = 0;
|
|
||||||
enum xen_vm_power_state state;
|
|
||||||
xen_session *session = ((struct _xenapiPrivate *)(dom->conn->privateData))->session;
|
|
||||||
+
|
|
||||||
+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ xenapiError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
+ flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (xen_vm_get_by_name_label(session, &vms, dom->name) && vms->size > 0) {
|
|
||||||
if (vms->size != 1) {
|
|
||||||
xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
|
|
||||||
@@ -1176,6 +1207,19 @@ xenapiDomainGetMaxVcpus (virDomainPtr dom)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * xenapiDomainGetMaxVcpus
|
|
||||||
+ *
|
|
||||||
+ *
|
|
||||||
+ * Returns maximum number of Vcpus on success or -1 in case of error
|
|
||||||
+ */
|
|
||||||
+static int
|
|
||||||
+xenapiDomainGetMaxVcpus (virDomainPtr dom)
|
|
||||||
+{
|
|
||||||
+ return xenapiDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* xenapiDomainDumpXML
|
|
||||||
*
|
|
||||||
*
|
|
||||||
@@ -1754,8 +1798,8 @@ static virDriver xenapiDriver = {
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
xenapiDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
- NULL, /* domainSetVcpusFlags */
|
|
||||||
- NULL, /* domainGetVcpusFlags */
|
|
||||||
+ xenapiDomainSetVcpusFlags, /* domainSetVcpusFlags */
|
|
||||||
+ xenapiDomainGetVcpusFlags, /* domainGetVcpusFlags */
|
|
||||||
xenapiDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
xenapiDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
xenapiDomainGetMaxVcpus, /* domainGetMaxVcpus */
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,388 +0,0 @@
|
|||||||
From bf945ee97b72d3b0c4fc2da04530f5294f529d66 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Wed, 29 Sep 2010 15:20:23 -0600
|
|
||||||
Subject: [PATCH 08/15] vcpu: add virsh support
|
|
||||||
|
|
||||||
* tools/virsh.c (cmdSetvcpus): Add new flags. Let invalid
|
|
||||||
commands through to driver, to ease testing of hypervisor argument
|
|
||||||
validation.
|
|
||||||
(cmdMaxvcpus, cmdVcpucount): New commands.
|
|
||||||
(commands): Add new commands.
|
|
||||||
* tools/virsh.pod (setvcpus, vcpucount, maxvcpus): Document new
|
|
||||||
behavior.
|
|
||||||
---
|
|
||||||
tools/virsh.c | 247 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
|
|
||||||
tools/virsh.pod | 38 ++++++++-
|
|
||||||
2 files changed, 262 insertions(+), 23 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tools/virsh.c b/tools/virsh.c
|
|
||||||
index 4f8c495..7fb7fbd 100644
|
|
||||||
--- a/tools/virsh.c
|
|
||||||
+++ b/tools/virsh.c
|
|
||||||
@@ -2281,10 +2281,216 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * "maxvcpus" command
|
|
||||||
+ */
|
|
||||||
+static const vshCmdInfo info_maxvcpus[] = {
|
|
||||||
+ {"help", N_("connection vcpu maximum")},
|
|
||||||
+ {"desc", N_("Show maximum number of virtual CPUs for guests on this connection.")},
|
|
||||||
+ {NULL, NULL}
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static const vshCmdOptDef opts_maxvcpus[] = {
|
|
||||||
+ {"type", VSH_OT_STRING, 0, N_("domain type")},
|
|
||||||
+ {NULL, 0, 0, NULL}
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+cmdMaxvcpus(vshControl *ctl, const vshCmd *cmd)
|
|
||||||
+{
|
|
||||||
+ char *type;
|
|
||||||
+ int vcpus;
|
|
||||||
+
|
|
||||||
+ type = vshCommandOptString(cmd, "type", NULL);
|
|
||||||
+
|
|
||||||
+ if (!vshConnectionUsability(ctl, ctl->conn))
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
+ vcpus = virConnectGetMaxVcpus(ctl->conn, type);
|
|
||||||
+ if (vcpus < 0)
|
|
||||||
+ return FALSE;
|
|
||||||
+ vshPrint(ctl, "%d\n", vcpus);
|
|
||||||
+
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * "vcpucount" command
|
|
||||||
+ */
|
|
||||||
+static const vshCmdInfo info_vcpucount[] = {
|
|
||||||
+ {"help", N_("domain vcpu counts")},
|
|
||||||
+ {"desc", N_("Returns the number of virtual CPUs used by the domain.")},
|
|
||||||
+ {NULL, NULL}
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static const vshCmdOptDef opts_vcpucount[] = {
|
|
||||||
+ {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
|
|
||||||
+ {"maximum", VSH_OT_BOOL, 0, N_("get maximum cap on vcpus")},
|
|
||||||
+ {"current", VSH_OT_BOOL, 0, N_("get current vcpu usage")},
|
|
||||||
+ {"config", VSH_OT_BOOL, 0, N_("get value to be used on next boot")},
|
|
||||||
+ {"live", VSH_OT_BOOL, 0, N_("get value from running domain")},
|
|
||||||
+ {NULL, 0, 0, NULL}
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+cmdVcpucount(vshControl *ctl, const vshCmd *cmd)
|
|
||||||
+{
|
|
||||||
+ virDomainPtr dom;
|
|
||||||
+ int ret = TRUE;
|
|
||||||
+ int maximum = vshCommandOptBool(cmd, "maximum");
|
|
||||||
+ int current = vshCommandOptBool(cmd, "current");
|
|
||||||
+ int config = vshCommandOptBool(cmd, "config");
|
|
||||||
+ int live = vshCommandOptBool(cmd, "live");
|
|
||||||
+ bool all = maximum + current + config + live == 0;
|
|
||||||
+ int count;
|
|
||||||
+
|
|
||||||
+ if (maximum && current) {
|
|
||||||
+ vshError(ctl, "%s",
|
|
||||||
+ _("--maximum and --current cannot both be specified"));
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ if (config && live) {
|
|
||||||
+ vshError(ctl, "%s",
|
|
||||||
+ _("--config and --live cannot both be specified"));
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ /* We want one of each pair of mutually exclusive options; that
|
|
||||||
+ * is, use of flags requires exactly two options. */
|
|
||||||
+ if (maximum + current + config + live == 1) {
|
|
||||||
+ vshError(ctl,
|
|
||||||
+ _("when using --%s, either --%s or --%s must be specified"),
|
|
||||||
+ (maximum ? "maximum" : current ? "current"
|
|
||||||
+ : config ? "config" : "live"),
|
|
||||||
+ maximum + current ? "config" : "maximum",
|
|
||||||
+ maximum + current ? "live" : "current");
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!vshConnectionUsability(ctl, ctl->conn))
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
+ if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
+ /* In all cases, try the new API first; if it fails because we are
|
|
||||||
+ * talking to an older client, try a fallback API before giving
|
|
||||||
+ * up. */
|
|
||||||
+ if (all || (maximum && config)) {
|
|
||||||
+ count = virDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_MAXIMUM |
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG));
|
|
||||||
+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
|
|
||||||
+ || last_error->code == VIR_ERR_INVALID_ARG)) {
|
|
||||||
+ char *tmp;
|
|
||||||
+ char *xml = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
|
|
||||||
+ if (xml && (tmp = strstr(xml, "<vcpu"))) {
|
|
||||||
+ tmp = strchr(tmp, '>');
|
|
||||||
+ if (!tmp || virStrToLong_i(tmp + 1, &tmp, 10, &count) < 0)
|
|
||||||
+ count = -1;
|
|
||||||
+ }
|
|
||||||
+ VIR_FREE(xml);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (count < 0) {
|
|
||||||
+ virshReportError(ctl);
|
|
||||||
+ ret = FALSE;
|
|
||||||
+ } else if (all) {
|
|
||||||
+ vshPrint(ctl, "%-12s %-12s %3d\n", _("maximum"), _("config"),
|
|
||||||
+ count);
|
|
||||||
+ } else {
|
|
||||||
+ vshPrint(ctl, "%d\n", count);
|
|
||||||
+ }
|
|
||||||
+ virFreeError(last_error);
|
|
||||||
+ last_error = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (all || (maximum && live)) {
|
|
||||||
+ count = virDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_MAXIMUM |
|
|
||||||
+ VIR_DOMAIN_VCPU_LIVE));
|
|
||||||
+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
|
|
||||||
+ || last_error->code == VIR_ERR_INVALID_ARG)) {
|
|
||||||
+ count = virDomainGetMaxVcpus(dom);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (count < 0) {
|
|
||||||
+ virshReportError(ctl);
|
|
||||||
+ ret = FALSE;
|
|
||||||
+ } else if (all) {
|
|
||||||
+ vshPrint(ctl, "%-12s %-12s %3d\n", _("maximum"), _("live"),
|
|
||||||
+ count);
|
|
||||||
+ } else {
|
|
||||||
+ vshPrint(ctl, "%d\n", count);
|
|
||||||
+ }
|
|
||||||
+ virFreeError(last_error);
|
|
||||||
+ last_error = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (all || (current && config)) {
|
|
||||||
+ count = virDomainGetVcpusFlags(dom, VIR_DOMAIN_VCPU_CONFIG);
|
|
||||||
+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
|
|
||||||
+ || last_error->code == VIR_ERR_INVALID_ARG)) {
|
|
||||||
+ char *tmp, *end;
|
|
||||||
+ char *xml = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
|
|
||||||
+ if (xml && (tmp = strstr(xml, "<vcpu"))) {
|
|
||||||
+ end = strchr(tmp, '>');
|
|
||||||
+ if (end) {
|
|
||||||
+ *end = '\0';
|
|
||||||
+ tmp = strstr(tmp, "current=");
|
|
||||||
+ if (!tmp)
|
|
||||||
+ tmp = end + 1;
|
|
||||||
+ else {
|
|
||||||
+ tmp += strlen("current=");
|
|
||||||
+ tmp += *tmp == '\'' || *tmp == '"';
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (!tmp || virStrToLong_i(tmp, &tmp, 10, &count) < 0)
|
|
||||||
+ count = -1;
|
|
||||||
+ }
|
|
||||||
+ VIR_FREE(xml);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (count < 0) {
|
|
||||||
+ virshReportError(ctl);
|
|
||||||
+ ret = FALSE;
|
|
||||||
+ } else if (all) {
|
|
||||||
+ vshPrint(ctl, "%-12s %-12s %3d\n", _("current"), _("config"),
|
|
||||||
+ count);
|
|
||||||
+ } else {
|
|
||||||
+ vshPrint(ctl, "%d\n", count);
|
|
||||||
+ }
|
|
||||||
+ virFreeError(last_error);
|
|
||||||
+ last_error = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (all || (current && live)) {
|
|
||||||
+ count = virDomainGetVcpusFlags(dom, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
|
|
||||||
+ || last_error->code == VIR_ERR_INVALID_ARG)) {
|
|
||||||
+ virDomainInfo info;
|
|
||||||
+ if (virDomainGetInfo(dom, &info) == 0)
|
|
||||||
+ count = info.nrVirtCpu;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (count < 0) {
|
|
||||||
+ virshReportError(ctl);
|
|
||||||
+ ret = FALSE;
|
|
||||||
+ } else if (all) {
|
|
||||||
+ vshPrint(ctl, "%-12s %-12s %3d\n", _("current"), _("live"),
|
|
||||||
+ count);
|
|
||||||
+ } else {
|
|
||||||
+ vshPrint(ctl, "%d\n", count);
|
|
||||||
+ }
|
|
||||||
+ virFreeError(last_error);
|
|
||||||
+ last_error = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ virDomainFree(dom);
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* "vcpuinfo" command
|
|
||||||
*/
|
|
||||||
static const vshCmdInfo info_vcpuinfo[] = {
|
|
||||||
- {"help", N_("domain vcpu information")},
|
|
||||||
+ {"help", N_("detailed domain vcpu information")},
|
|
||||||
{"desc", N_("Returns basic information about the domain virtual CPUs.")},
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
@@ -2514,6 +2720,9 @@ static const vshCmdInfo info_setvcpus[] = {
|
|
||||||
static const vshCmdOptDef opts_setvcpus[] = {
|
|
||||||
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
|
|
||||||
{"count", VSH_OT_DATA, VSH_OFLAG_REQ, N_("number of virtual CPUs")},
|
|
||||||
+ {"maximum", VSH_OT_BOOL, 0, N_("set maximum limit on next boot")},
|
|
||||||
+ {"config", VSH_OT_BOOL, 0, N_("affect next boot")},
|
|
||||||
+ {"live", VSH_OT_BOOL, 0, N_("affect running domain")},
|
|
||||||
{NULL, 0, 0, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -2522,8 +2731,13 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd)
|
|
||||||
{
|
|
||||||
virDomainPtr dom;
|
|
||||||
int count;
|
|
||||||
- int maxcpu;
|
|
||||||
int ret = TRUE;
|
|
||||||
+ int maximum = vshCommandOptBool(cmd, "maximum");
|
|
||||||
+ int config = vshCommandOptBool(cmd, "config");
|
|
||||||
+ int live = vshCommandOptBool(cmd, "live");
|
|
||||||
+ int flags = ((maximum ? VIR_DOMAIN_VCPU_MAXIMUM : 0) |
|
|
||||||
+ (config ? VIR_DOMAIN_VCPU_CONFIG : 0) |
|
|
||||||
+ (live ? VIR_DOMAIN_VCPU_LIVE : 0));
|
|
||||||
|
|
||||||
if (!vshConnectionUsability(ctl, ctl->conn))
|
|
||||||
return FALSE;
|
|
||||||
@@ -2532,26 +2746,15 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
count = vshCommandOptInt(cmd, "count", &count);
|
|
||||||
- if (count <= 0) {
|
|
||||||
- vshError(ctl, "%s", _("Invalid number of virtual CPUs."));
|
|
||||||
- virDomainFree(dom);
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- maxcpu = virDomainGetMaxVcpus(dom);
|
|
||||||
- if (maxcpu <= 0) {
|
|
||||||
- virDomainFree(dom);
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (count > maxcpu) {
|
|
||||||
- vshError(ctl, "%s", _("Too many virtual CPUs."));
|
|
||||||
- virDomainFree(dom);
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
|
|
||||||
- if (virDomainSetVcpus(dom, count) != 0) {
|
|
||||||
- ret = FALSE;
|
|
||||||
+ if (!flags) {
|
|
||||||
+ if (virDomainSetVcpus(dom, count) != 0) {
|
|
||||||
+ ret = FALSE;
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ if (virDomainSetVcpusFlags(dom, count, flags) < 0) {
|
|
||||||
+ ret = FALSE;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
virDomainFree(dom);
|
|
||||||
@@ -9642,6 +9845,7 @@ static const vshCmdDef commands[] = {
|
|
||||||
{"freecell", cmdFreecell, opts_freecell, info_freecell},
|
|
||||||
{"hostname", cmdHostname, NULL, info_hostname},
|
|
||||||
{"list", cmdList, opts_list, info_list},
|
|
||||||
+ {"maxvcpus", cmdMaxvcpus, opts_maxvcpus, info_maxvcpus},
|
|
||||||
{"migrate", cmdMigrate, opts_migrate, info_migrate},
|
|
||||||
{"migrate-setmaxdowntime", cmdMigrateSetMaxDowntime, opts_migrate_setmaxdowntime, info_migrate_setmaxdowntime},
|
|
||||||
|
|
||||||
@@ -9748,6 +9952,7 @@ static const vshCmdDef commands[] = {
|
|
||||||
{"vol-name", cmdVolName, opts_vol_name, info_vol_name},
|
|
||||||
{"vol-key", cmdVolKey, opts_vol_key, info_vol_key},
|
|
||||||
|
|
||||||
+ {"vcpucount", cmdVcpucount, opts_vcpucount, info_vcpucount},
|
|
||||||
{"vcpuinfo", cmdVcpuinfo, opts_vcpuinfo, info_vcpuinfo},
|
|
||||||
{"vcpupin", cmdVcpupin, opts_vcpupin, info_vcpupin},
|
|
||||||
{"version", cmdVersion, NULL, info_version},
|
|
||||||
diff --git a/tools/virsh.pod b/tools/virsh.pod
|
|
||||||
index 943a563..dbcc680 100644
|
|
||||||
--- a/tools/virsh.pod
|
|
||||||
+++ b/tools/virsh.pod
|
|
||||||
@@ -443,7 +443,14 @@ Remove the managed save file for a domain if it exists. The next time the
|
|
||||||
domain is started it will not restore to its previous state but instead will
|
|
||||||
do a full boot.
|
|
||||||
|
|
||||||
-=item B<migrate> optional I<--live> I<--suspend> I<domain-id> I<desturi> I<migrateuri>
|
|
||||||
+=item B<maxvcpus> optional I<type>
|
|
||||||
+
|
|
||||||
+Provide the maximum number of virtual CPUs supported for a guest VM on
|
|
||||||
+this connection. If provided, the I<type> parameter must be a valid
|
|
||||||
+type attribute for the <domain> element of XML.
|
|
||||||
+
|
|
||||||
+=item B<migrate> optional I<--live> I<--suspend> I<domain-id> I<desturi>
|
|
||||||
+I<migrateuri>
|
|
||||||
|
|
||||||
Migrate domain to another host. Add --live for live migration; --suspend
|
|
||||||
leaves the domain paused on the destination host. The I<desturi> is the
|
|
||||||
@@ -521,7 +528,8 @@ Displays the domain memory parameters.
|
|
||||||
|
|
||||||
Allows you to set the domain memory parameters. LXC and QEMU/KVM supports these parameters.
|
|
||||||
|
|
||||||
-=item B<setvcpus> I<domain-id> I<count>
|
|
||||||
+=item B<setvcpus> I<domain-id> I<count> optional I<--maximum> I<--config>
|
|
||||||
+I<--live>
|
|
||||||
|
|
||||||
Change the number of virtual CPUs active in the guest domain. Note that
|
|
||||||
I<count> may be limited by host, hypervisor or limit coming from the
|
|
||||||
@@ -530,6 +538,17 @@ original description of domain.
|
|
||||||
For Xen, you can only adjust the virtual CPUs of a running domain if
|
|
||||||
the domain is paravirtualized.
|
|
||||||
|
|
||||||
+If I<--config> is specified, the change will only affect the next
|
|
||||||
+boot of a domain. If I<--live> is specified, the domain must be
|
|
||||||
+running, and the change takes place immediately. Both flags may be
|
|
||||||
+specified, if supported by the hypervisor. If neither flag is given,
|
|
||||||
+then I<--live> is implied and it is up to the hypervisor whether
|
|
||||||
+I<--config> is also implied.
|
|
||||||
+
|
|
||||||
+If I<--maximum> is specified, then you must use I<--config> and
|
|
||||||
+avoid I<--live>; this flag controls the maximum limit of vcpus that
|
|
||||||
+can be hot-plugged the next time the domain is booted.
|
|
||||||
+
|
|
||||||
=item B<shutdown> I<domain-id>
|
|
||||||
|
|
||||||
Gracefully shuts down a domain. This coordinates with the domain OS
|
|
||||||
@@ -568,6 +587,21 @@ is not available the processes will provide an exit code of 1.
|
|
||||||
Undefine the configuration for an inactive domain. Since it's not running
|
|
||||||
the domain name or UUID must be used as the I<domain-id>.
|
|
||||||
|
|
||||||
+=item B<vcpucount> I<domain-id> optional I<--maximum> I<--current>
|
|
||||||
+I<--config> I<--live>
|
|
||||||
+
|
|
||||||
+Print information about the virtual cpu counts of the given
|
|
||||||
+I<domain-id>. If no flags are specified, all possible counts are
|
|
||||||
+listed in a table; otherwise, the output is limited to just the
|
|
||||||
+numeric value requested.
|
|
||||||
+
|
|
||||||
+I<--maximum> requests information on the maximum cap of vcpus that a
|
|
||||||
+domain can add via B<setvcpus>, while I<--current> shows the current
|
|
||||||
+usage; these two flags cannot both be specified. I<--config>
|
|
||||||
+requests information regarding the next time the domain will be
|
|
||||||
+booted, while I<--live> requires a running domain and lists current
|
|
||||||
+values; these two flags cannot both be specified.
|
|
||||||
+
|
|
||||||
=item B<vcpuinfo> I<domain-id>
|
|
||||||
|
|
||||||
Returns basic information about the domain virtual CPUs, like the number of
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,519 +0,0 @@
|
|||||||
From 4617eedfaeee2b187a1f14691d25746ba3ff31b6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Wed, 29 Sep 2010 10:20:07 -0600
|
|
||||||
Subject: [PATCH 07/15] vcpu: support maxvcpu in domain_conf
|
|
||||||
|
|
||||||
Although this patch adds a distinction between maximum vcpus and
|
|
||||||
current vcpus in the XML, the values should be identical for all
|
|
||||||
drivers at this point. Only in subsequent per-driver patches will
|
|
||||||
a distinction be made.
|
|
||||||
|
|
||||||
In general, virDomainGetInfo should prefer the current vcpus.
|
|
||||||
|
|
||||||
* src/conf/domain_conf.h (_virDomainDef): Adjust vcpus to unsigned
|
|
||||||
short, to match virDomainGetInfo limit. Add maxvcpus member.
|
|
||||||
* src/conf/domain_conf.c (virDomainDefParseXML)
|
|
||||||
(virDomainDefFormat): parse and print out vcpu details.
|
|
||||||
* src/xen/xend_internal.c (xenDaemonParseSxpr)
|
|
||||||
(xenDaemonFormatSxpr): Manage both vcpu numbers, and require them
|
|
||||||
to be equal for now.
|
|
||||||
* src/xen/xm_internal.c (xenXMDomainConfigParse)
|
|
||||||
(xenXMDomainConfigFormat): Likewise.
|
|
||||||
* src/phyp/phyp_driver.c (phypDomainDumpXML): Likewise.
|
|
||||||
* src/openvz/openvz_conf.c (openvzLoadDomains): Likewise.
|
|
||||||
* src/openvz/openvz_driver.c (openvzDomainDefineXML)
|
|
||||||
(openvzDomainCreateXML, openvzDomainSetVcpusInternal): Likewise.
|
|
||||||
* src/vbox/vbox_tmpl.c (vboxDomainDumpXML, vboxDomainDefineXML):
|
|
||||||
Likewise.
|
|
||||||
* src/xenapi/xenapi_driver.c (xenapiDomainDumpXML): Likewise.
|
|
||||||
* src/xenapi/xenapi_utils.c (createVMRecordFromXml): Likewise.
|
|
||||||
* src/esx/esx_vmx.c (esxVMX_ParseConfig, esxVMX_FormatConfig):
|
|
||||||
Likewise.
|
|
||||||
* src/qemu/qemu_conf.c (qemuBuildSmpArgStr)
|
|
||||||
(qemuParseCommandLineSmp, qemuParseCommandLine): Likewise.
|
|
||||||
* src/qemu/qemu_driver.c (qemudDomainHotplugVcpus): Likewise.
|
|
||||||
* src/opennebula/one_conf.c (xmlOneTemplate): Likewise.
|
|
||||||
---
|
|
||||||
src/conf/domain_conf.c | 45 +++++++++++++++++++++++++++++++++++++------
|
|
||||||
src/conf/domain_conf.h | 3 +-
|
|
||||||
src/esx/esx_vmx.c | 24 ++++++++++++++--------
|
|
||||||
src/opennebula/one_conf.c | 9 +++++--
|
|
||||||
src/openvz/openvz_conf.c | 7 +++--
|
|
||||||
src/openvz/openvz_driver.c | 15 +++++++++----
|
|
||||||
src/phyp/phyp_driver.c | 2 +-
|
|
||||||
src/qemu/qemu_conf.c | 14 +++++++++++-
|
|
||||||
src/qemu/qemu_driver.c | 5 ++-
|
|
||||||
src/vbox/vbox_tmpl.c | 12 +++++++---
|
|
||||||
src/xen/xend_internal.c | 9 ++++---
|
|
||||||
src/xen/xm_internal.c | 11 ++++++---
|
|
||||||
src/xenapi/xenapi_driver.c | 2 +-
|
|
||||||
src/xenapi/xenapi_utils.c | 4 +-
|
|
||||||
14 files changed, 114 insertions(+), 48 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
|
||||||
index 78d7a6a..a997e06 100644
|
|
||||||
--- a/src/conf/domain_conf.c
|
|
||||||
+++ b/src/conf/domain_conf.c
|
|
||||||
@@ -4203,6 +4203,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
|
|
||||||
int i, n;
|
|
||||||
long id = -1;
|
|
||||||
virDomainDefPtr def;
|
|
||||||
+ unsigned long count;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(def) < 0) {
|
|
||||||
virReportOOMError();
|
|
||||||
@@ -4287,8 +4288,37 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
|
|
||||||
&def->mem.swap_hard_limit) < 0)
|
|
||||||
def->mem.swap_hard_limit = 0;
|
|
||||||
|
|
||||||
- if (virXPathULong("string(./vcpu[1])", ctxt, &def->vcpus) < 0)
|
|
||||||
- def->vcpus = 1;
|
|
||||||
+ n = virXPathULong("string(./vcpu[1])", ctxt, &count);
|
|
||||||
+ if (n == -2) {
|
|
||||||
+ virDomainReportError(VIR_ERR_XML_ERROR, "%s",
|
|
||||||
+ _("maximum vcpus must be an integer"));
|
|
||||||
+ goto error;
|
|
||||||
+ } else if (n < 0) {
|
|
||||||
+ def->maxvcpus = 1;
|
|
||||||
+ } else {
|
|
||||||
+ def->maxvcpus = count;
|
|
||||||
+ if (def->maxvcpus != count || count == 0) {
|
|
||||||
+ virDomainReportError(VIR_ERR_XML_ERROR,
|
|
||||||
+ _("invalid maxvcpus %lu"), count);
|
|
||||||
+ goto error;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ n = virXPathULong("string(./vcpu[1]/@current)", ctxt, &count);
|
|
||||||
+ if (n == -2) {
|
|
||||||
+ virDomainReportError(VIR_ERR_XML_ERROR, "%s",
|
|
||||||
+ _("current vcpus must be an integer"));
|
|
||||||
+ goto error;
|
|
||||||
+ } else if (n < 0) {
|
|
||||||
+ def->vcpus = def->maxvcpus;
|
|
||||||
+ } else {
|
|
||||||
+ def->vcpus = count;
|
|
||||||
+ if (def->vcpus != count || count == 0 || def->maxvcpus < count) {
|
|
||||||
+ virDomainReportError(VIR_ERR_XML_ERROR,
|
|
||||||
+ _("invalid current vcpus %lu"), count);
|
|
||||||
+ goto error;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
|
|
||||||
tmp = virXPathString("string(./vcpu[1]/@cpuset)", ctxt);
|
|
||||||
if (tmp) {
|
|
||||||
@@ -6462,17 +6492,18 @@ char *virDomainDefFormat(virDomainDefPtr def,
|
|
||||||
if (def->cpumask[n] != 1)
|
|
||||||
allones = 0;
|
|
||||||
|
|
||||||
- if (allones) {
|
|
||||||
- virBufferAsprintf(&buf, " <vcpu>%lu</vcpu>\n", def->vcpus);
|
|
||||||
- } else {
|
|
||||||
+ virBufferAddLit(&buf, " <vcpu");
|
|
||||||
+ if (!allones) {
|
|
||||||
char *cpumask = NULL;
|
|
||||||
if ((cpumask =
|
|
||||||
virDomainCpuSetFormat(def->cpumask, def->cpumasklen)) == NULL)
|
|
||||||
goto cleanup;
|
|
||||||
- virBufferAsprintf(&buf, " <vcpu cpuset='%s'>%lu</vcpu>\n",
|
|
||||||
- cpumask, def->vcpus);
|
|
||||||
+ virBufferAsprintf(&buf, " cpuset='%s'", cpumask);
|
|
||||||
VIR_FREE(cpumask);
|
|
||||||
}
|
|
||||||
+ if (def->vcpus != def->maxvcpus)
|
|
||||||
+ virBufferAsprintf(&buf, " current='%u'", def->vcpus);
|
|
||||||
+ virBufferAsprintf(&buf, ">%u</vcpu>\n", def->maxvcpus);
|
|
||||||
|
|
||||||
if (def->os.bootloader) {
|
|
||||||
virBufferEscapeString(&buf, " <bootloader>%s</bootloader>\n",
|
|
||||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
|
||||||
index db09c23..5499f28 100644
|
|
||||||
--- a/src/conf/domain_conf.h
|
|
||||||
+++ b/src/conf/domain_conf.h
|
|
||||||
@@ -885,7 +885,8 @@ struct _virDomainDef {
|
|
||||||
unsigned long min_guarantee;
|
|
||||||
unsigned long swap_hard_limit;
|
|
||||||
} mem;
|
|
||||||
- unsigned long vcpus;
|
|
||||||
+ unsigned short vcpus;
|
|
||||||
+ unsigned short maxvcpus;
|
|
||||||
int cpumasklen;
|
|
||||||
char *cpumask;
|
|
||||||
|
|
||||||
diff --git a/src/esx/esx_vmx.c b/src/esx/esx_vmx.c
|
|
||||||
index 7ec8c0e..0a26614 100644
|
|
||||||
--- a/src/esx/esx_vmx.c
|
|
||||||
+++ b/src/esx/esx_vmx.c
|
|
||||||
@@ -50,7 +50,7 @@ def->uuid = <value> <=> uuid.bios = "<value>"
|
|
||||||
def->name = <value> <=> displayName = "<value>"
|
|
||||||
def->mem.max_balloon = <value kilobyte> <=> memsize = "<value megabyte>" # must be a multiple of 4, defaults to 32
|
|
||||||
def->mem.cur_balloon = <value kilobyte> <=> sched.mem.max = "<value megabyte>" # defaults to "unlimited" -> def->mem.cur_balloon = def->mem.max_balloon
|
|
||||||
-def->vcpus = <value> <=> numvcpus = "<value>" # must be 1 or a multiple of 2, defaults to 1
|
|
||||||
+def->maxvcpus = <value> <=> numvcpus = "<value>" # must be 1 or a multiple of 2, defaults to 1
|
|
||||||
def->cpumask = <uint list> <=> sched.cpu.affinity = "<uint list>"
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1075,7 +1075,7 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char *vmx,
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
- def->vcpus = numvcpus;
|
|
||||||
+ def->maxvcpus = def->vcpus = numvcpus;
|
|
||||||
|
|
||||||
/* vmx:sched.cpu.affinity -> def:cpumask */
|
|
||||||
// VirtualMachine:config.cpuAffinity.affinitySet
|
|
||||||
@@ -2609,16 +2609,22 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|
||||||
(int)(def->mem.cur_balloon / 1024));
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* def:vcpus -> vmx:numvcpus */
|
|
||||||
- if (def->vcpus <= 0 || (def->vcpus % 2 != 0 && def->vcpus != 1)) {
|
|
||||||
+ /* def:maxvcpus -> vmx:numvcpus */
|
|
||||||
+ if (def->vcpus != def->maxvcpus) {
|
|
||||||
+ ESX_ERROR(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
+ _("No support for domain XML entry 'vcpu' attribute "
|
|
||||||
+ "'current'"));
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+ if (def->maxvcpus <= 0 || (def->maxvcpus % 2 != 0 && def->maxvcpus != 1)) {
|
|
||||||
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Expecting domain XML entry 'vcpu' to be an unsigned "
|
|
||||||
"integer (1 or a multiple of 2) but found %d"),
|
|
||||||
- (int)def->vcpus);
|
|
||||||
+ def->maxvcpus);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
- virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n", (int)def->vcpus);
|
|
||||||
+ virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n", def->maxvcpus);
|
|
||||||
|
|
||||||
/* def:cpumask -> vmx:sched.cpu.affinity */
|
|
||||||
if (def->cpumasklen > 0) {
|
|
||||||
@@ -2632,11 +2638,11 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (sched_cpu_affinity_length < def->vcpus) {
|
|
||||||
+ if (sched_cpu_affinity_length < def->maxvcpus) {
|
|
||||||
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Expecting domain XML attribute 'cpuset' of entry "
|
|
||||||
- "'vcpu' to contains at least %d CPU(s)"),
|
|
||||||
- (int)def->vcpus);
|
|
||||||
+ "'vcpu' to contain at least %d CPU(s)"),
|
|
||||||
+ def->maxvcpus);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/opennebula/one_conf.c b/src/opennebula/one_conf.c
|
|
||||||
index 44e28dc..2079c51 100644
|
|
||||||
--- a/src/opennebula/one_conf.c
|
|
||||||
+++ b/src/opennebula/one_conf.c
|
|
||||||
@@ -1,5 +1,7 @@
|
|
||||||
/*----------------------------------------------------------------------------------*/
|
|
||||||
-/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad
|
|
||||||
+/*
|
|
||||||
+ * Copyright (C) 2010 Red Hat, Inc.
|
|
||||||
+ * Copyright 2002-2009, Distributed Systems Architecture Group, Universidad
|
|
||||||
* Complutense de Madrid (dsa-research.org)
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
@@ -169,9 +171,10 @@ char* xmlOneTemplate(virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
virBuffer buf= VIR_BUFFER_INITIALIZER;
|
|
||||||
- virBufferAsprintf(&buf,"#OpenNebula Template automatically generated by libvirt\nNAME = %s\nCPU = %ld\nMEMORY = %ld\n",
|
|
||||||
+ virBufferAsprintf(&buf,"#OpenNebula Template automatically generated "
|
|
||||||
+ "by libvirt\nNAME = %s\nCPU = %d\nMEMORY = %ld\n",
|
|
||||||
def->name,
|
|
||||||
- def->vcpus,
|
|
||||||
+ def->maxvcpus,
|
|
||||||
(def->mem.max_balloon)/1024);
|
|
||||||
|
|
||||||
/*Optional Booting OpenNebula Information:*/
|
|
||||||
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
|
|
||||||
index ec11bbc..c84a6f3 100644
|
|
||||||
--- a/src/openvz/openvz_conf.c
|
|
||||||
+++ b/src/openvz/openvz_conf.c
|
|
||||||
@@ -507,11 +507,12 @@ int openvzLoadDomains(struct openvz_driver *driver) {
|
|
||||||
veid);
|
|
||||||
goto cleanup;
|
|
||||||
} else if (ret > 0) {
|
|
||||||
- dom->def->vcpus = strtoI(temp);
|
|
||||||
+ dom->def->maxvcpus = strtoI(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (ret == 0 || dom->def->vcpus == 0)
|
|
||||||
- dom->def->vcpus = openvzGetNodeCPUs();
|
|
||||||
+ if (ret == 0 || dom->def->maxvcpus == 0)
|
|
||||||
+ dom->def->maxvcpus = openvzGetNodeCPUs();
|
|
||||||
+ dom->def->vcpus = dom->def->maxvcpus;
|
|
||||||
|
|
||||||
/* XXX load rest of VM config data .... */
|
|
||||||
|
|
||||||
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
|
|
||||||
index 0f3cfdf..b7c2754 100644
|
|
||||||
--- a/src/openvz/openvz_driver.c
|
|
||||||
+++ b/src/openvz/openvz_driver.c
|
|
||||||
@@ -925,8 +925,13 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
|
|
||||||
if (openvzDomainSetNetworkConfig(conn, vm->def) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
- if (vm->def->vcpus > 0) {
|
|
||||||
- if (openvzDomainSetVcpusInternal(vm, vm->def->vcpus) < 0) {
|
|
||||||
+ if (vm->def->vcpus != vm->def->maxvcpus) {
|
|
||||||
+ openvzError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
+ _("current vcpu count must equal maximum"));
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+ if (vm->def->maxvcpus > 0) {
|
|
||||||
+ if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
|
|
||||||
openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Could not set number of virtual cpu"));
|
|
||||||
goto cleanup;
|
|
||||||
@@ -1019,8 +1024,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
|
|
||||||
vm->def->id = vm->pid;
|
|
||||||
vm->state = VIR_DOMAIN_RUNNING;
|
|
||||||
|
|
||||||
- if (vm->def->vcpus > 0) {
|
|
||||||
- if (openvzDomainSetVcpusInternal(vm, vm->def->vcpus) < 0) {
|
|
||||||
+ if (vm->def->maxvcpus > 0) {
|
|
||||||
+ if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
|
|
||||||
openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Could not set number of virtual cpu"));
|
|
||||||
goto cleanup;
|
|
||||||
@@ -1249,7 +1254,7 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- vm->def->vcpus = nvcpus;
|
|
||||||
+ vm->def->maxvcpus = vm->def->vcpus = nvcpus;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
|
|
||||||
index e284ae0..3d0ed11 100644
|
|
||||||
--- a/src/phyp/phyp_driver.c
|
|
||||||
+++ b/src/phyp/phyp_driver.c
|
|
||||||
@@ -3540,7 +3540,7 @@ phypDomainDumpXML(virDomainPtr dom, int flags)
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if ((def.vcpus =
|
|
||||||
+ if ((def.maxvcpus = def.vcpus =
|
|
||||||
phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0) {
|
|
||||||
VIR_ERROR0(_("Unable to determine domain's CPU."));
|
|
||||||
goto err;
|
|
||||||
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
|
|
||||||
index 83c0f83..38c8351 100644
|
|
||||||
--- a/src/qemu/qemu_conf.c
|
|
||||||
+++ b/src/qemu/qemu_conf.c
|
|
||||||
@@ -3711,7 +3711,7 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
|
|
||||||
{
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
|
|
||||||
- virBufferAsprintf(&buf, "%lu", def->vcpus);
|
|
||||||
+ virBufferAsprintf(&buf, "%u", def->vcpus);
|
|
||||||
|
|
||||||
if ((qemuCmdFlags & QEMUD_CMD_FLAG_SMP_TOPOLOGY)) {
|
|
||||||
/* sockets, cores, and threads are either all zero
|
|
||||||
@@ -3722,11 +3722,18 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
|
|
||||||
virBufferAsprintf(&buf, ",threads=%u", def->cpu->threads);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
- virBufferAsprintf(&buf, ",sockets=%lu", def->vcpus);
|
|
||||||
+ virBufferAsprintf(&buf, ",sockets=%u", def->maxvcpus);
|
|
||||||
virBufferAsprintf(&buf, ",cores=%u", 1);
|
|
||||||
virBufferAsprintf(&buf, ",threads=%u", 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ if (def->vcpus != def->maxvcpus) {
|
|
||||||
+ virBufferFreeAndReset(&buf);
|
|
||||||
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
+ _("setting current vcpu count less than maximum is "
|
|
||||||
+ "not supported yet"));
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (virBufferError(&buf)) {
|
|
||||||
virBufferFreeAndReset(&buf);
|
|
||||||
@@ -6178,6 +6185,8 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ dom->maxvcpus = dom->vcpus;
|
|
||||||
+
|
|
||||||
if (sockets && cores && threads) {
|
|
||||||
virCPUDefPtr cpu;
|
|
||||||
|
|
||||||
@@ -6247,6 +6256,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
|
|
||||||
|
|
||||||
def->id = -1;
|
|
||||||
def->mem.cur_balloon = def->mem.max_balloon = 64 * 1024;
|
|
||||||
+ def->maxvcpus = 1;
|
|
||||||
def->vcpus = 1;
|
|
||||||
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
|
|
||||||
def->features = (1 << VIR_DOMAIN_FEATURE_ACPI)
|
|
||||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
||||||
index 7a2ea8f..c66dc04 100644
|
|
||||||
--- a/src/qemu/qemu_driver.c
|
|
||||||
+++ b/src/qemu/qemu_driver.c
|
|
||||||
@@ -2425,8 +2425,9 @@ qemuDetectVcpuPIDs(struct qemud_driver *driver,
|
|
||||||
|
|
||||||
if (ncpupids != vm->def->vcpus) {
|
|
||||||
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
- _("got wrong number of vCPU pids from QEMU monitor. got %d, wanted %d"),
|
|
||||||
- ncpupids, (int)vm->def->vcpus);
|
|
||||||
+ _("got wrong number of vCPU pids from QEMU monitor. "
|
|
||||||
+ "got %d, wanted %d"),
|
|
||||||
+ ncpupids, vm->def->vcpus);
|
|
||||||
VIR_FREE(cpupids);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
|
|
||||||
index 0cbe8b3..5a859a4 100644
|
|
||||||
--- a/src/vbox/vbox_tmpl.c
|
|
||||||
+++ b/src/vbox/vbox_tmpl.c
|
|
||||||
@@ -2028,7 +2028,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
|
|
||||||
def->mem.max_balloon = memorySize * 1024;
|
|
||||||
|
|
||||||
machine->vtbl->GetCPUCount(machine, &CPUCount);
|
|
||||||
- def->vcpus = CPUCount;
|
|
||||||
+ def->maxvcpus = def->vcpus = CPUCount;
|
|
||||||
|
|
||||||
/* Skip cpumasklen, cpumask, onReboot, onPoweroff, onCrash */
|
|
||||||
|
|
||||||
@@ -4598,11 +4598,15 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) {
|
|
||||||
def->mem.cur_balloon, (unsigned)rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
- rc = machine->vtbl->SetCPUCount(machine, def->vcpus);
|
|
||||||
+ if (def->vcpus != def->maxvcpus) {
|
|
||||||
+ vboxError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
+ _("current vcpu count must equal maximum"));
|
|
||||||
+ }
|
|
||||||
+ rc = machine->vtbl->SetCPUCount(machine, def->maxvcpus);
|
|
||||||
if (NS_FAILED(rc)) {
|
|
||||||
vboxError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
- _("could not set the number of virtual CPUs to: %lu, rc=%08x"),
|
|
||||||
- def->vcpus, (unsigned)rc);
|
|
||||||
+ _("could not set the number of virtual CPUs to: %u, rc=%08x"),
|
|
||||||
+ def->maxvcpus, (unsigned)rc);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if VBOX_API_VERSION < 3001
|
|
||||||
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
|
|
||||||
index 5ffc3c8..456b477 100644
|
|
||||||
--- a/src/xen/xend_internal.c
|
|
||||||
+++ b/src/xen/xend_internal.c
|
|
||||||
@@ -2190,7 +2190,8 @@ xenDaemonParseSxpr(virConnectPtr conn,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- def->vcpus = sexpr_int(root, "domain/vcpus");
|
|
||||||
+ def->maxvcpus = sexpr_int(root, "domain/vcpus");
|
|
||||||
+ def->vcpus = def->maxvcpus;
|
|
||||||
|
|
||||||
tmp = sexpr_node(root, "domain/on_poweroff");
|
|
||||||
if (tmp != NULL) {
|
|
||||||
@@ -5649,7 +5650,7 @@ xenDaemonFormatSxprInput(virDomainInputDefPtr input,
|
|
||||||
*
|
|
||||||
* Generate an SEXPR representing the domain configuration.
|
|
||||||
*
|
|
||||||
- * Returns the 0 terminatedi S-Expr string or NULL in case of error.
|
|
||||||
+ * Returns the 0 terminated S-Expr string or NULL in case of error.
|
|
||||||
* the caller must free() the returned value.
|
|
||||||
*/
|
|
||||||
char *
|
|
||||||
@@ -5666,7 +5667,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
|
||||||
virBufferAsprintf(&buf, "(name '%s')", def->name);
|
|
||||||
virBufferAsprintf(&buf, "(memory %lu)(maxmem %lu)",
|
|
||||||
def->mem.cur_balloon/1024, def->mem.max_balloon/1024);
|
|
||||||
- virBufferAsprintf(&buf, "(vcpus %lu)", def->vcpus);
|
|
||||||
+ virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
|
|
||||||
|
|
||||||
if (def->cpumask) {
|
|
||||||
char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
|
|
||||||
@@ -5761,7 +5762,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
|
||||||
else
|
|
||||||
virBufferAsprintf(&buf, "(kernel '%s')", def->os.loader);
|
|
||||||
|
|
||||||
- virBufferAsprintf(&buf, "(vcpus %lu)", def->vcpus);
|
|
||||||
+ virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
|
|
||||||
|
|
||||||
for (i = 0 ; i < def->os.nBootDevs ; i++) {
|
|
||||||
switch (def->os.bootDevs[i]) {
|
|
||||||
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
||||||
index 8e42a1c..bf20a64 100644
|
|
||||||
--- a/src/xen/xm_internal.c
|
|
||||||
+++ b/src/xen/xm_internal.c
|
|
||||||
@@ -678,6 +678,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
|
||||||
int i;
|
|
||||||
const char *defaultArch, *defaultMachine;
|
|
||||||
int vmlocaltime = 0;
|
|
||||||
+ unsigned long count;
|
|
||||||
|
|
||||||
if (VIR_ALLOC(def) < 0) {
|
|
||||||
virReportOOMError();
|
|
||||||
@@ -770,9 +771,11 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
|
||||||
def->mem.cur_balloon *= 1024;
|
|
||||||
def->mem.max_balloon *= 1024;
|
|
||||||
|
|
||||||
-
|
|
||||||
- if (xenXMConfigGetULong(conf, "vcpus", &def->vcpus, 1) < 0)
|
|
||||||
+ if (xenXMConfigGetULong(conf, "vcpus", &count, 1) < 0 ||
|
|
||||||
+ (unsigned short) count != count)
|
|
||||||
goto cleanup;
|
|
||||||
+ def->maxvcpus = count;
|
|
||||||
+ def->vcpus = def->maxvcpus;
|
|
||||||
|
|
||||||
if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
@@ -1650,7 +1653,7 @@ int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) {
|
|
||||||
if (!(entry = virHashLookup(priv->configCache, filename)))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
- entry->def->vcpus = vcpus;
|
|
||||||
+ entry->def->maxvcpus = entry->def->vcpus = vcpus;
|
|
||||||
|
|
||||||
/* If this fails, should we try to undo our changes to the
|
|
||||||
* in-memory representation of the config file. I say not!
|
|
||||||
@@ -2241,7 +2244,7 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
|
|
||||||
if (xenXMConfigSetInt(conf, "memory", def->mem.cur_balloon / 1024) < 0)
|
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
- if (xenXMConfigSetInt(conf, "vcpus", def->vcpus) < 0)
|
|
||||||
+ if (xenXMConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)
|
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
if ((def->cpumask != NULL) &&
|
|
||||||
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
|
|
||||||
index 7d4ab8d..5ccdede 100644
|
|
||||||
--- a/src/xenapi/xenapi_driver.c
|
|
||||||
+++ b/src/xenapi/xenapi_driver.c
|
|
||||||
@@ -1335,7 +1335,7 @@ xenapiDomainDumpXML (virDomainPtr dom, int flags ATTRIBUTE_UNUSED)
|
|
||||||
} else {
|
|
||||||
defPtr->mem.cur_balloon = memory;
|
|
||||||
}
|
|
||||||
- defPtr->vcpus = xenapiDomainGetMaxVcpus(dom);
|
|
||||||
+ defPtr->maxvcpus = defPtr->vcpus = xenapiDomainGetMaxVcpus(dom);
|
|
||||||
enum xen_on_normal_exit action;
|
|
||||||
if (xen_vm_get_actions_after_shutdown(session, &action, vm)) {
|
|
||||||
defPtr->onPoweroff = xenapiNormalExitEnum2virDomainLifecycle(action);
|
|
||||||
diff --git a/src/xenapi/xenapi_utils.c b/src/xenapi/xenapi_utils.c
|
|
||||||
index be55491..a7e2a4b 100644
|
|
||||||
--- a/src/xenapi/xenapi_utils.c
|
|
||||||
+++ b/src/xenapi/xenapi_utils.c
|
|
||||||
@@ -510,8 +510,8 @@ createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def,
|
|
||||||
else
|
|
||||||
(*record)->memory_dynamic_max = (*record)->memory_static_max;
|
|
||||||
|
|
||||||
- if (def->vcpus) {
|
|
||||||
- (*record)->vcpus_max = (int64_t) def->vcpus;
|
|
||||||
+ if (def->maxvcpus) {
|
|
||||||
+ (*record)->vcpus_max = (int64_t) def->maxvcpus;
|
|
||||||
(*record)->vcpus_at_startup = (int64_t) def->vcpus;
|
|
||||||
}
|
|
||||||
if (def->onPoweroff)
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,197 +0,0 @@
|
|||||||
From 6c9e6b956453d0f0c4ff542ef8a184d663a39266 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Mon, 4 Oct 2010 17:01:12 -0600
|
|
||||||
Subject: [PATCH 09/15] vcpu: support all flags in test driver
|
|
||||||
|
|
||||||
* src/test/test_driver.c (testDomainGetVcpusFlags)
|
|
||||||
(testDomainSetVcpusFlags): Support all flags.
|
|
||||||
(testDomainUpdateVCPUs): Update cpu count here.
|
|
||||||
---
|
|
||||||
src/test/test_driver.c | 128 ++++++++++++++++++++++++++++++++++++++++-------
|
|
||||||
1 files changed, 109 insertions(+), 19 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
|
|
||||||
index b70c80d..a9d3d89 100644
|
|
||||||
--- a/src/test/test_driver.c
|
|
||||||
+++ b/src/test/test_driver.c
|
|
||||||
@@ -450,6 +450,7 @@ testDomainUpdateVCPUs(virConnectPtr conn,
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ dom->def->vcpus = nvcpus;
|
|
||||||
ret = 0;
|
|
||||||
cleanup:
|
|
||||||
return ret;
|
|
||||||
@@ -2032,12 +2033,51 @@ cleanup:
|
|
||||||
static int
|
|
||||||
testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
|
|
||||||
{
|
|
||||||
- if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
- testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ testConnPtr privconn = domain->conn->privateData;
|
|
||||||
+ virDomainObjPtr vm;
|
|
||||||
+ virDomainDefPtr def;
|
|
||||||
+ int ret = -1;
|
|
||||||
+
|
|
||||||
+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
||||||
+
|
|
||||||
+ /* Exactly one of LIVE or CONFIG must be set. */
|
|
||||||
+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
|
|
||||||
+ testError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("invalid flag combination: (0x%x)"), flags);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- return testGetMaxVCPUs(domain->conn, "test");
|
|
||||||
+ testDriverLock(privconn);
|
|
||||||
+ vm = virDomainFindByUUID(&privconn->domains, domain->uuid);
|
|
||||||
+ testDriverUnlock(privconn);
|
|
||||||
+
|
|
||||||
+ if (!vm) {
|
|
||||||
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
||||||
+ virUUIDFormat(domain->uuid, uuidstr);
|
|
||||||
+ testError(VIR_ERR_NO_DOMAIN,
|
|
||||||
+ _("no domain with matching uuid '%s'"), uuidstr);
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ if (!virDomainObjIsActive(vm)) {
|
|
||||||
+ testError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("domain not active"));
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+ def = vm->def;
|
|
||||||
+ } else {
|
|
||||||
+ def = vm->newDef ? vm->newDef : vm->def;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret = (flags & VIR_DOMAIN_VCPU_MAXIMUM) ? def->maxvcpus : def->vcpus;
|
|
||||||
+
|
|
||||||
+cleanup:
|
|
||||||
+ if (vm)
|
|
||||||
+ virDomainObjUnlock(vm);
|
|
||||||
+ return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
@@ -2053,21 +2093,30 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
|
|
||||||
{
|
|
||||||
testConnPtr privconn = domain->conn->privateData;
|
|
||||||
virDomainObjPtr privdom = NULL;
|
|
||||||
+ virDomainDefPtr def;
|
|
||||||
int ret = -1, maxvcpus;
|
|
||||||
|
|
||||||
- if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
- testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
|
|
||||||
+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
||||||
+
|
|
||||||
+ /* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
|
|
||||||
+ * mixed with LIVE. */
|
|
||||||
+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
|
|
||||||
+ (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
|
|
||||||
+ (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
|
|
||||||
+ testError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("invalid flag combination: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (!nrCpus || (maxvcpus = testGetMaxVCPUs(domain->conn, NULL)) < nrCpus) {
|
|
||||||
+ testError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("argument out of range: %d"), nrCpus);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- /* Do this first before locking */
|
|
||||||
- maxvcpus = testDomainGetMaxVcpus(domain);
|
|
||||||
- if (maxvcpus < 0)
|
|
||||||
- goto cleanup;
|
|
||||||
|
|
||||||
testDriverLock(privconn);
|
|
||||||
- privdom = virDomainFindByName(&privconn->domains,
|
|
||||||
- domain->name);
|
|
||||||
+ privdom = virDomainFindByUUID(&privconn->domains, domain->uuid);
|
|
||||||
testDriverUnlock(privconn);
|
|
||||||
|
|
||||||
if (privdom == NULL) {
|
|
||||||
@@ -2075,13 +2124,17 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!virDomainObjIsActive(privdom)) {
|
|
||||||
+ if (!virDomainObjIsActive(privdom) && (flags & VIR_DOMAIN_VCPU_LIVE)) {
|
|
||||||
testError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
"%s", _("cannot hotplug vcpus for an inactive domain"));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* We allow more cpus in guest than host */
|
|
||||||
+ /* We allow more cpus in guest than host, but not more than the
|
|
||||||
+ * domain's starting limit. */
|
|
||||||
+ if ((flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
|
|
||||||
+ VIR_DOMAIN_VCPU_LIVE && privdom->def->maxvcpus < maxvcpus)
|
|
||||||
+ maxvcpus = privdom->def->maxvcpus;
|
|
||||||
if (nrCpus > maxvcpus) {
|
|
||||||
testError(VIR_ERR_INVALID_ARG,
|
|
||||||
"requested cpu amount exceeds maximum (%d > %d)",
|
|
||||||
@@ -2089,12 +2142,49 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Update VCPU state for the running domain */
|
|
||||||
- if (testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0) < 0)
|
|
||||||
- goto cleanup;
|
|
||||||
+ switch (flags) {
|
|
||||||
+ case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
|
|
||||||
+ def = privdom->def;
|
|
||||||
+ if (virDomainObjIsActive(privdom)) {
|
|
||||||
+ if (privdom->newDef)
|
|
||||||
+ def = privdom->newDef;
|
|
||||||
+ else {
|
|
||||||
+ testError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("no persistent state"));
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ def->maxvcpus = nrCpus;
|
|
||||||
+ if (nrCpus < def->vcpus)
|
|
||||||
+ def->vcpus = nrCpus;
|
|
||||||
+ ret = 0;
|
|
||||||
+ break;
|
|
||||||
|
|
||||||
- privdom->def->vcpus = nrCpus;
|
|
||||||
- ret = 0;
|
|
||||||
+ case VIR_DOMAIN_VCPU_CONFIG:
|
|
||||||
+ def = privdom->def;
|
|
||||||
+ if (virDomainObjIsActive(privdom)) {
|
|
||||||
+ if (privdom->newDef)
|
|
||||||
+ def = privdom->newDef;
|
|
||||||
+ else {
|
|
||||||
+ testError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("no persistent state"));
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ def->vcpus = nrCpus;
|
|
||||||
+ ret = 0;
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case VIR_DOMAIN_VCPU_LIVE:
|
|
||||||
+ ret = testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
|
|
||||||
+ ret = testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0);
|
|
||||||
+ if (ret == 0 && privdom->newDef)
|
|
||||||
+ privdom->newDef->vcpus = nrCpus;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (privdom)
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
From d67c189e80e6aef7adf13e5763365555cfc1a02a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Wed, 29 Sep 2010 15:58:47 -0600
|
|
||||||
Subject: [PATCH 10/15] vcpu: improve vcpu support in qemu command line
|
|
||||||
|
|
||||||
* src/qemu/qemu_conf.c (qemuParseCommandLineSmp): Distinguish
|
|
||||||
between vcpus and maxvcpus, for new enough qemu.
|
|
||||||
* tests/qemuargv2xmltest.c (mymain): Add new test.
|
|
||||||
* tests/qemuxml2argvtest.c (mymain): Likewise.
|
|
||||||
* tests/qemuxml2xmltest.c (mymain): Likewise.
|
|
||||||
* tests/qemuxml2argvdata/qemuxml2argv-smp.args: New file.
|
|
||||||
---
|
|
||||||
src/qemu/qemu_conf.c | 13 +++++++++----
|
|
||||||
tests/qemuargv2xmltest.c | 2 ++
|
|
||||||
tests/qemuxml2argvdata/qemuxml2argv-smp.args | 1 +
|
|
||||||
tests/qemuxml2argvtest.c | 2 ++
|
|
||||||
tests/qemuxml2xmltest.c | 2 ++
|
|
||||||
5 files changed, 16 insertions(+), 4 deletions(-)
|
|
||||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-smp.args
|
|
||||||
|
|
||||||
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
|
|
||||||
index 38c8351..ffe184b 100644
|
|
||||||
--- a/src/qemu/qemu_conf.c
|
|
||||||
+++ b/src/qemu/qemu_conf.c
|
|
||||||
@@ -3714,6 +3714,8 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
|
|
||||||
virBufferAsprintf(&buf, "%u", def->vcpus);
|
|
||||||
|
|
||||||
if ((qemuCmdFlags & QEMUD_CMD_FLAG_SMP_TOPOLOGY)) {
|
|
||||||
+ if (def->vcpus != def->maxvcpus)
|
|
||||||
+ virBufferAsprintf(&buf, ",maxcpus=%u", def->maxvcpus);
|
|
||||||
/* sockets, cores, and threads are either all zero
|
|
||||||
* or all non-zero, thus checking one of them is enough */
|
|
||||||
if (def->cpu && def->cpu->sockets) {
|
|
||||||
@@ -3726,12 +3728,12 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
|
|
||||||
virBufferAsprintf(&buf, ",cores=%u", 1);
|
|
||||||
virBufferAsprintf(&buf, ",threads=%u", 1);
|
|
||||||
}
|
|
||||||
- }
|
|
||||||
- if (def->vcpus != def->maxvcpus) {
|
|
||||||
+ } else if (def->vcpus != def->maxvcpus) {
|
|
||||||
virBufferFreeAndReset(&buf);
|
|
||||||
+ /* FIXME - consider hot-unplugging cpus after boot for older qemu */
|
|
||||||
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
_("setting current vcpu count less than maximum is "
|
|
||||||
- "not supported yet"));
|
|
||||||
+ "not supported with this QEMU binary"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -6153,6 +6155,7 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
|
|
||||||
unsigned int sockets = 0;
|
|
||||||
unsigned int cores = 0;
|
|
||||||
unsigned int threads = 0;
|
|
||||||
+ unsigned int maxcpus = 0;
|
|
||||||
int i;
|
|
||||||
int nkws;
|
|
||||||
char **kws;
|
|
||||||
@@ -6180,12 +6183,14 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
|
|
||||||
cores = n;
|
|
||||||
else if (STREQ(kws[i], "threads"))
|
|
||||||
threads = n;
|
|
||||||
+ else if (STREQ(kws[i], "maxcpus"))
|
|
||||||
+ maxcpus = n;
|
|
||||||
else
|
|
||||||
goto syntax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- dom->maxvcpus = dom->vcpus;
|
|
||||||
+ dom->maxvcpus = maxcpus ? maxcpus : dom->vcpus;
|
|
||||||
|
|
||||||
if (sockets && cores && threads) {
|
|
||||||
virCPUDefPtr cpu;
|
|
||||||
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
|
|
||||||
index 4f9ec84..d941b0b 100644
|
|
||||||
--- a/tests/qemuargv2xmltest.c
|
|
||||||
+++ b/tests/qemuargv2xmltest.c
|
|
||||||
@@ -221,6 +221,8 @@ mymain(int argc, char **argv)
|
|
||||||
|
|
||||||
DO_TEST("hostdev-pci-address");
|
|
||||||
|
|
||||||
+ DO_TEST("smp");
|
|
||||||
+
|
|
||||||
DO_TEST_FULL("restore-v1", 0, "stdio");
|
|
||||||
DO_TEST_FULL("restore-v2", 0, "stdio");
|
|
||||||
DO_TEST_FULL("restore-v2", 0, "exec:cat");
|
|
||||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smp.args b/tests/qemuxml2argvdata/qemuxml2argv-smp.args
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..3ec8f15
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.args
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1,maxcpus=2,sockets=2,cores=1,threads=1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb
|
|
||||||
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
|
|
||||||
index 92d5b18..551d6c4 100644
|
|
||||||
--- a/tests/qemuxml2argvtest.c
|
|
||||||
+++ b/tests/qemuxml2argvtest.c
|
|
||||||
@@ -385,6 +385,8 @@ mymain(int argc, char **argv)
|
|
||||||
|
|
||||||
DO_TEST("qemu-ns", 0);
|
|
||||||
|
|
||||||
+ DO_TEST("smp", QEMUD_CMD_FLAG_SMP_TOPOLOGY);
|
|
||||||
+
|
|
||||||
free(driver.stateDir);
|
|
||||||
virCapabilitiesFree(driver.caps);
|
|
||||||
|
|
||||||
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
|
|
||||||
index a33d435..cdc4390 100644
|
|
||||||
--- a/tests/qemuxml2xmltest.c
|
|
||||||
+++ b/tests/qemuxml2xmltest.c
|
|
||||||
@@ -180,6 +180,8 @@ mymain(int argc, char **argv)
|
|
||||||
DO_TEST("encrypted-disk");
|
|
||||||
DO_TEST("memtune");
|
|
||||||
|
|
||||||
+ DO_TEST("smp");
|
|
||||||
+
|
|
||||||
/* These tests generate different XML */
|
|
||||||
DO_TEST_DIFFERENT("balloon-device-auto");
|
|
||||||
DO_TEST_DIFFERENT("channel-virtio-auto");
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
From 28a3605906385cba43df77051dc26e865f237b09 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Wed, 29 Sep 2010 17:40:45 -0600
|
|
||||||
Subject: [PATCH 11/15] vcpu: complete vcpu support in qemu driver
|
|
||||||
|
|
||||||
* src/qemu/qemu_driver.c (qemudDomainSetVcpusFlags)
|
|
||||||
(qemudDomainGetVcpusFlags): Support all feasible flag
|
|
||||||
combinations.
|
|
||||||
---
|
|
||||||
src/qemu/qemu_driver.c | 100 ++++++++++++++++++++++++++++++++++++++++-------
|
|
||||||
1 files changed, 85 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
||||||
index c66dc04..a9e057f 100644
|
|
||||||
--- a/src/qemu/qemu_driver.c
|
|
||||||
+++ b/src/qemu/qemu_driver.c
|
|
||||||
@@ -5941,13 +5941,27 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
{
|
|
||||||
struct qemud_driver *driver = dom->conn->privateData;
|
|
||||||
virDomainObjPtr vm;
|
|
||||||
+ virDomainDefPtr def;
|
|
||||||
const char * type;
|
|
||||||
int max;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
- if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
- qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
- flags);
|
|
||||||
+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
||||||
+
|
|
||||||
+ /* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
|
|
||||||
+ * mixed with LIVE. */
|
|
||||||
+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
|
|
||||||
+ (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
|
|
||||||
+ (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
|
|
||||||
+ qemuReportError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("invalid flag combination: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (!nvcpus || (unsigned short) nvcpus != nvcpus) {
|
|
||||||
+ qemuReportError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("argument out of range: %d"), nvcpus);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -5966,7 +5980,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
if (qemuDomainObjBeginJob(vm) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
- if (!virDomainObjIsActive(vm)) {
|
|
||||||
+ if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_VCPU_LIVE)) {
|
|
||||||
qemuReportError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
"%s", _("domain is not running"));
|
|
||||||
goto endjob;
|
|
||||||
@@ -5985,6 +5999,11 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if ((flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
|
|
||||||
+ VIR_DOMAIN_VCPU_LIVE && vm->def->maxvcpus < max) {
|
|
||||||
+ max = vm->def->maxvcpus;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (nvcpus > max) {
|
|
||||||
qemuReportError(VIR_ERR_INVALID_ARG,
|
|
||||||
_("requested vcpus is greater than max allowable"
|
|
||||||
@@ -5992,7 +6011,49 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = qemudDomainHotplugVcpus(vm, nvcpus);
|
|
||||||
+ switch (flags) {
|
|
||||||
+ case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
|
|
||||||
+ def = vm->def;
|
|
||||||
+ if (virDomainObjIsActive(vm)) {
|
|
||||||
+ if (vm->newDef)
|
|
||||||
+ def = vm->newDef;
|
|
||||||
+ else{
|
|
||||||
+ qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("no persistent state"));
|
|
||||||
+ goto endjob;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ def->maxvcpus = nvcpus;
|
|
||||||
+ if (nvcpus < vm->newDef->vcpus)
|
|
||||||
+ def->vcpus = nvcpus;
|
|
||||||
+ ret = 0;
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case VIR_DOMAIN_VCPU_CONFIG:
|
|
||||||
+ def = vm->def;
|
|
||||||
+ if (virDomainObjIsActive(vm)) {
|
|
||||||
+ if (vm->newDef)
|
|
||||||
+ def = vm->newDef;
|
|
||||||
+ else {
|
|
||||||
+ qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("no persistent state"));
|
|
||||||
+ goto endjob;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ def->vcpus = nvcpus;
|
|
||||||
+ ret = 0;
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case VIR_DOMAIN_VCPU_LIVE:
|
|
||||||
+ ret = qemudDomainHotplugVcpus(vm, nvcpus);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
|
|
||||||
+ ret = qemudDomainHotplugVcpus(vm, nvcpus);
|
|
||||||
+ if (ret == 0 && vm->newDef)
|
|
||||||
+ vm->newDef->vcpus = nvcpus;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
endjob:
|
|
||||||
if (qemuDomainObjEndJob(vm) == 0)
|
|
||||||
@@ -6171,12 +6232,17 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
|
|
||||||
{
|
|
||||||
struct qemud_driver *driver = dom->conn->privateData;
|
|
||||||
virDomainObjPtr vm;
|
|
||||||
- const char *type;
|
|
||||||
+ virDomainDefPtr def;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
- if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
- qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
- flags);
|
|
||||||
+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
||||||
+
|
|
||||||
+ /* Exactly one of LIVE or CONFIG must be set. */
|
|
||||||
+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
|
|
||||||
+ qemuReportError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("invalid flag combination: (0x%x)"), flags);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -6192,14 +6258,18 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!(type = virDomainVirtTypeToString(vm->def->virtType))) {
|
|
||||||
- qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
- _("unknown virt type in domain definition '%d'"),
|
|
||||||
- vm->def->virtType);
|
|
||||||
- goto cleanup;
|
|
||||||
+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ if (!virDomainObjIsActive(vm)) {
|
|
||||||
+ qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("domain not active"));
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+ def = vm->def;
|
|
||||||
+ } else {
|
|
||||||
+ def = vm->newDef ? vm->newDef : vm->def;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = qemudGetMaxVCPUs(NULL, type);
|
|
||||||
+ ret = (flags & VIR_DOMAIN_VCPU_MAXIMUM) ? def->maxvcpus : def->vcpus;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (vm)
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,294 +0,0 @@
|
|||||||
From 0fab10e5ed971ab4f960a53e9640b0672f4b8ac3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Tue, 5 Oct 2010 08:18:52 -0600
|
|
||||||
Subject: [PATCH 12/15] vcpu: improve vcpu support in xen command line
|
|
||||||
|
|
||||||
This patch series focuses on xendConfigVersion 2 (xm_internal) and 3
|
|
||||||
(xend_internal), but leaves out changes for xenapi drivers.
|
|
||||||
|
|
||||||
See this link for more details about vcpu_avail for xm usage.
|
|
||||||
http://lists.xensource.com/archives/html/xen-devel/2009-11/msg01061.html
|
|
||||||
|
|
||||||
This relies on the fact that def->maxvcpus can be at most 32 with xen.
|
|
||||||
|
|
||||||
* src/xen/xend_internal.c (xenDaemonParseSxpr)
|
|
||||||
(sexpr_to_xend_domain_info, xenDaemonFormatSxpr): Use vcpu_avail
|
|
||||||
when current vcpus is less than maximum.
|
|
||||||
* src/xen/xm_internal.c (xenXMDomainConfigParse)
|
|
||||||
(xenXMDomainConfigFormat): Likewise.
|
|
||||||
* tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr: New file.
|
|
||||||
* tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr: Likewise.
|
|
||||||
* tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml: Likewise.
|
|
||||||
* tests/xmconfigdata/test-paravirt-vcpu.cfg: Likewise.
|
|
||||||
* tests/xmconfigdata/test-paravirt-vcpu.xml: Likewise.
|
|
||||||
* tests/xml2sexprtest.c (mymain): New test.
|
|
||||||
* tests/sexpr2xmltest.c (mymain): Likewise.
|
|
||||||
* tests/xmconfigtest.c (mymain): Likewise.
|
|
||||||
---
|
|
||||||
src/xen/xend_internal.c | 19 +++++++++++++--
|
|
||||||
src/xen/xm_internal.c | 10 ++++++-
|
|
||||||
tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr | 1 +
|
|
||||||
tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml | 27 +++++++++++++++++++++
|
|
||||||
tests/sexpr2xmltest.c | 1 +
|
|
||||||
tests/xmconfigdata/test-paravirt-vcpu.cfg | 17 +++++++++++++
|
|
||||||
tests/xmconfigdata/test-paravirt-vcpu.xml | 32 ++++++++++++++++++++++++++
|
|
||||||
tests/xmconfigtest.c | 1 +
|
|
||||||
tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr | 1 +
|
|
||||||
tests/xml2sexprtest.c | 1 +
|
|
||||||
10 files changed, 105 insertions(+), 5 deletions(-)
|
|
||||||
create mode 100644 tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr
|
|
||||||
create mode 100644 tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml
|
|
||||||
create mode 100644 tests/xmconfigdata/test-paravirt-vcpu.cfg
|
|
||||||
create mode 100644 tests/xmconfigdata/test-paravirt-vcpu.xml
|
|
||||||
create mode 100644 tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr
|
|
||||||
|
|
||||||
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
|
|
||||||
index 456b477..dfc6415 100644
|
|
||||||
--- a/src/xen/xend_internal.c
|
|
||||||
+++ b/src/xen/xend_internal.c
|
|
||||||
@@ -44,6 +44,7 @@
|
|
||||||
#include "xen_hypervisor.h"
|
|
||||||
#include "xs_internal.h" /* To extract VNC port & Serial console TTY */
|
|
||||||
#include "memory.h"
|
|
||||||
+#include "count-one-bits.h"
|
|
||||||
|
|
||||||
/* required for cpumap_t */
|
|
||||||
#include <xen/dom0_ops.h>
|
|
||||||
@@ -2191,7 +2192,9 @@ xenDaemonParseSxpr(virConnectPtr conn,
|
|
||||||
}
|
|
||||||
|
|
||||||
def->maxvcpus = sexpr_int(root, "domain/vcpus");
|
|
||||||
- def->vcpus = def->maxvcpus;
|
|
||||||
+ def->vcpus = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
|
|
||||||
+ if (!def->vcpus || def->maxvcpus < def->vcpus)
|
|
||||||
+ def->vcpus = def->maxvcpus;
|
|
||||||
|
|
||||||
tmp = sexpr_node(root, "domain/on_poweroff");
|
|
||||||
if (tmp != NULL) {
|
|
||||||
@@ -2433,7 +2436,7 @@ sexpr_to_xend_domain_info(virDomainPtr domain, const struct sexpr *root,
|
|
||||||
virDomainInfoPtr info)
|
|
||||||
{
|
|
||||||
const char *flags;
|
|
||||||
-
|
|
||||||
+ int vcpus;
|
|
||||||
|
|
||||||
if ((root == NULL) || (info == NULL))
|
|
||||||
return (-1);
|
|
||||||
@@ -2464,7 +2467,11 @@ sexpr_to_xend_domain_info(virDomainPtr domain, const struct sexpr *root,
|
|
||||||
info->state = VIR_DOMAIN_NOSTATE;
|
|
||||||
}
|
|
||||||
info->cpuTime = sexpr_float(root, "domain/cpu_time") * 1000000000;
|
|
||||||
- info->nrVirtCpu = sexpr_int(root, "domain/vcpus");
|
|
||||||
+ vcpus = sexpr_int(root, "domain/vcpus");
|
|
||||||
+ info->nrVirtCpu = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
|
|
||||||
+ if (!info->nrVirtCpu || vcpus < info->nrVirtCpu)
|
|
||||||
+ info->nrVirtCpu = vcpus;
|
|
||||||
+
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -5668,6 +5675,9 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
|
||||||
virBufferAsprintf(&buf, "(memory %lu)(maxmem %lu)",
|
|
||||||
def->mem.cur_balloon/1024, def->mem.max_balloon/1024);
|
|
||||||
virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
|
|
||||||
+ /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is 32. */
|
|
||||||
+ if (def->vcpus < def->maxvcpus)
|
|
||||||
+ virBufferAsprintf(&buf, "(vcpu_avail %u)", (1U << def->vcpus) - 1);
|
|
||||||
|
|
||||||
if (def->cpumask) {
|
|
||||||
char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
|
|
||||||
@@ -5763,6 +5773,9 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
|
||||||
virBufferAsprintf(&buf, "(kernel '%s')", def->os.loader);
|
|
||||||
|
|
||||||
virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
|
|
||||||
+ if (def->vcpus < def->maxvcpus)
|
|
||||||
+ virBufferAsprintf(&buf, "(vcpu_avail %u)",
|
|
||||||
+ (1U << def->vcpus) - 1);
|
|
||||||
|
|
||||||
for (i = 0 ; i < def->os.nBootDevs ; i++) {
|
|
||||||
switch (def->os.bootDevs[i]) {
|
|
||||||
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
||||||
index bf20a64..f7121ab 100644
|
|
||||||
--- a/src/xen/xm_internal.c
|
|
||||||
+++ b/src/xen/xm_internal.c
|
|
||||||
@@ -46,6 +46,7 @@
|
|
||||||
#include "util.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "logging.h"
|
|
||||||
+#include "count-one-bits.h"
|
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_XENXM
|
|
||||||
|
|
||||||
@@ -772,10 +773,12 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
|
||||||
def->mem.max_balloon *= 1024;
|
|
||||||
|
|
||||||
if (xenXMConfigGetULong(conf, "vcpus", &count, 1) < 0 ||
|
|
||||||
- (unsigned short) count != count)
|
|
||||||
+ MAX_VIRT_CPUS < count)
|
|
||||||
goto cleanup;
|
|
||||||
def->maxvcpus = count;
|
|
||||||
- def->vcpus = def->maxvcpus;
|
|
||||||
+ if (xenXMConfigGetULong(conf, "vcpu_avail", &count, -1) < 0)
|
|
||||||
+ goto cleanup;
|
|
||||||
+ def->vcpus = MIN(count_one_bits(count), def->maxvcpus);
|
|
||||||
|
|
||||||
if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
@@ -2246,6 +2249,9 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
|
|
||||||
|
|
||||||
if (xenXMConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)
|
|
||||||
goto no_memory;
|
|
||||||
+ if (def->vcpus < def->maxvcpus &&
|
|
||||||
+ xenXMConfigSetInt(conf, "vcpu_avail", (1U << def->vcpus) - 1) < 0)
|
|
||||||
+ goto no_memory;
|
|
||||||
|
|
||||||
if ((def->cpumask != NULL) &&
|
|
||||||
((cpus = virDomainCpuSetFormat(def->cpumask,
|
|
||||||
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..2be6822
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+(domain (domid 6)(name 'pvtest')(memory 420)(maxmem 420)(vcpus 4)(vcpu_avail 3)(uuid '596a5d2171f48fb2e068e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os ')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w'))))
|
|
||||||
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..0d6bf11
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml
|
|
||||||
@@ -0,0 +1,27 @@
|
|
||||||
+<domain type='xen' id='6'>
|
|
||||||
+ <name>pvtest</name>
|
|
||||||
+ <uuid>596a5d21-71f4-8fb2-e068-e2386a5c413e</uuid>
|
|
||||||
+ <memory>430080</memory>
|
|
||||||
+ <currentMemory>430080</currentMemory>
|
|
||||||
+ <vcpu current='2'>4</vcpu>
|
|
||||||
+ <os>
|
|
||||||
+ <type>linux</type>
|
|
||||||
+ <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
|
|
||||||
+ <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
|
|
||||||
+ <cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os </cmdline>
|
|
||||||
+ </os>
|
|
||||||
+ <clock offset='utc'/>
|
|
||||||
+ <on_poweroff>destroy</on_poweroff>
|
|
||||||
+ <on_reboot>destroy</on_reboot>
|
|
||||||
+ <on_crash>destroy</on_crash>
|
|
||||||
+ <devices>
|
|
||||||
+ <disk type='file' device='disk'>
|
|
||||||
+ <driver name='file'/>
|
|
||||||
+ <source file='/root/some.img'/>
|
|
||||||
+ <target dev='xvda' bus='xen'/>
|
|
||||||
+ </disk>
|
|
||||||
+ <console type='pty'>
|
|
||||||
+ <target type='xen' port='0'/>
|
|
||||||
+ </console>
|
|
||||||
+ </devices>
|
|
||||||
+</domain>
|
|
||||||
diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c
|
|
||||||
index d62b44f..f100dd8 100644
|
|
||||||
--- a/tests/sexpr2xmltest.c
|
|
||||||
+++ b/tests/sexpr2xmltest.c
|
|
||||||
@@ -132,6 +132,7 @@ mymain(int argc, char **argv)
|
|
||||||
DO_TEST("pv-vfb-type-crash", "pv-vfb-type-crash", 3);
|
|
||||||
DO_TEST("fv-autoport", "fv-autoport", 3);
|
|
||||||
DO_TEST("pv-bootloader", "pv-bootloader", 1);
|
|
||||||
+ DO_TEST("pv-vcpus", "pv-vcpus", 1);
|
|
||||||
|
|
||||||
DO_TEST("disk-file", "disk-file", 2);
|
|
||||||
DO_TEST("disk-block", "disk-block", 2);
|
|
||||||
diff --git a/tests/xmconfigdata/test-paravirt-vcpu.cfg b/tests/xmconfigdata/test-paravirt-vcpu.cfg
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..24c78f4
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/xmconfigdata/test-paravirt-vcpu.cfg
|
|
||||||
@@ -0,0 +1,17 @@
|
|
||||||
+name = "XenGuest1"
|
|
||||||
+uuid = "c7a5fdb0-cdaf-9455-926a-d65c16db1809"
|
|
||||||
+maxmem = 579
|
|
||||||
+memory = 394
|
|
||||||
+vcpus = 4
|
|
||||||
+vcpu_avail = 3
|
|
||||||
+bootloader = "/usr/bin/pygrub"
|
|
||||||
+on_poweroff = "destroy"
|
|
||||||
+on_reboot = "restart"
|
|
||||||
+on_crash = "restart"
|
|
||||||
+sdl = 0
|
|
||||||
+vnc = 1
|
|
||||||
+vncunused = 1
|
|
||||||
+vnclisten = "127.0.0.1"
|
|
||||||
+vncpasswd = "123poi"
|
|
||||||
+disk = [ "phy:/dev/HostVG/XenGuest1,xvda,w" ]
|
|
||||||
+vif = [ "mac=00:16:3e:66:94:9c,bridge=br0,script=vif-bridge" ]
|
|
||||||
diff --git a/tests/xmconfigdata/test-paravirt-vcpu.xml b/tests/xmconfigdata/test-paravirt-vcpu.xml
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..0be9456
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/xmconfigdata/test-paravirt-vcpu.xml
|
|
||||||
@@ -0,0 +1,32 @@
|
|
||||||
+<domain type='xen'>
|
|
||||||
+ <name>XenGuest1</name>
|
|
||||||
+ <uuid>c7a5fdb0-cdaf-9455-926a-d65c16db1809</uuid>
|
|
||||||
+ <memory>592896</memory>
|
|
||||||
+ <currentMemory>403456</currentMemory>
|
|
||||||
+ <vcpu current='2'>4</vcpu>
|
|
||||||
+ <bootloader>/usr/bin/pygrub</bootloader>
|
|
||||||
+ <os>
|
|
||||||
+ <type arch='i686' machine='xenpv'>linux</type>
|
|
||||||
+ </os>
|
|
||||||
+ <clock offset='utc'/>
|
|
||||||
+ <on_poweroff>destroy</on_poweroff>
|
|
||||||
+ <on_reboot>restart</on_reboot>
|
|
||||||
+ <on_crash>restart</on_crash>
|
|
||||||
+ <devices>
|
|
||||||
+ <disk type='block' device='disk'>
|
|
||||||
+ <driver name='phy'/>
|
|
||||||
+ <source dev='/dev/HostVG/XenGuest1'/>
|
|
||||||
+ <target dev='xvda' bus='xen'/>
|
|
||||||
+ </disk>
|
|
||||||
+ <interface type='bridge'>
|
|
||||||
+ <mac address='00:16:3e:66:94:9c'/>
|
|
||||||
+ <source bridge='br0'/>
|
|
||||||
+ <script path='vif-bridge'/>
|
|
||||||
+ </interface>
|
|
||||||
+ <console type='pty'>
|
|
||||||
+ <target type='xen' port='0'/>
|
|
||||||
+ </console>
|
|
||||||
+ <input type='mouse' bus='xen'/>
|
|
||||||
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123poi'/>
|
|
||||||
+ </devices>
|
|
||||||
+</domain>
|
|
||||||
diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c
|
|
||||||
index 221b322..ea00747 100644
|
|
||||||
--- a/tests/xmconfigtest.c
|
|
||||||
+++ b/tests/xmconfigtest.c
|
|
||||||
@@ -210,6 +210,7 @@ mymain(int argc, char **argv)
|
|
||||||
DO_TEST("paravirt-new-pvfb-vncdisplay", 3);
|
|
||||||
DO_TEST("paravirt-net-e1000", 3);
|
|
||||||
DO_TEST("paravirt-net-vifname", 3);
|
|
||||||
+ DO_TEST("paravirt-vcpu", 2);
|
|
||||||
DO_TEST("fullvirt-old-cdrom", 1);
|
|
||||||
DO_TEST("fullvirt-new-cdrom", 2);
|
|
||||||
DO_TEST("fullvirt-utc", 2);
|
|
||||||
diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..e886545
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+(vm (name 'pvtest')(memory 420)(maxmem 420)(vcpus 4)(vcpu_avail 3)(uuid '596a5d21-71f4-8fb2-e068-e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os ')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w'))))
|
|
||||||
\ No newline at end of file
|
|
||||||
diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c
|
|
||||||
index 77cf760..9cf8d39 100644
|
|
||||||
--- a/tests/xml2sexprtest.c
|
|
||||||
+++ b/tests/xml2sexprtest.c
|
|
||||||
@@ -118,6 +118,7 @@ mymain(int argc, char **argv)
|
|
||||||
DO_TEST("pv-vfb-new", "pv-vfb-new", "pvtest", 3);
|
|
||||||
DO_TEST("pv-vfb-new-auto", "pv-vfb-new-auto", "pvtest", 3);
|
|
||||||
DO_TEST("pv-bootloader", "pv-bootloader", "pvtest", 1);
|
|
||||||
+ DO_TEST("pv-vcpus", "pv-vcpus", "pvtest", 1);
|
|
||||||
|
|
||||||
DO_TEST("disk-file", "disk-file", "pvtest", 2);
|
|
||||||
DO_TEST("disk-block", "disk-block", "pvtest", 2);
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,216 +0,0 @@
|
|||||||
From 290ea33111be7bdf1f1381b90de33eb0e67c1a15 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Wed, 6 Oct 2010 17:54:41 -0600
|
|
||||||
Subject: [PATCH 13/15] vcpu: improve support for getting xen vcpu counts
|
|
||||||
|
|
||||||
* src/xen/xen_driver.c (xenUnifiedDomainGetVcpusFlags): Support
|
|
||||||
more flags.
|
|
||||||
* src/xen/xend_internal.h (xenDaemonDomainGetVcpusFlags): New
|
|
||||||
prototype.
|
|
||||||
* src/xen/xm_internal.h (xenXMDomainGetVcpusFlags): Likewise.
|
|
||||||
* src/xen/xend_internal.c (virDomainGetVcpusFlags): New function.
|
|
||||||
* src/xen/xm_internal.c (xenXMDomainGetVcpusFlags): Likewise.
|
|
||||||
---
|
|
||||||
src/xen/xen_driver.c | 31 +++++++++++++++++++--------
|
|
||||||
src/xen/xend_internal.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
src/xen/xend_internal.h | 2 +
|
|
||||||
src/xen/xm_internal.c | 47 ++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
src/xen/xm_internal.h | 1 +
|
|
||||||
5 files changed, 124 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
|
|
||||||
index d6c9c57..fe2ff86 100644
|
|
||||||
--- a/src/xen/xen_driver.c
|
|
||||||
+++ b/src/xen/xen_driver.c
|
|
||||||
@@ -1142,20 +1142,33 @@ static int
|
|
||||||
xenUnifiedDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
|
|
||||||
{
|
|
||||||
GET_PRIVATE(dom->conn);
|
|
||||||
- int i, ret;
|
|
||||||
+ int ret;
|
|
||||||
|
|
||||||
- if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
- xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
- flags);
|
|
||||||
+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
||||||
+
|
|
||||||
+ /* Exactly one of LIVE or CONFIG must be set. */
|
|
||||||
+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
|
|
||||||
+ xenUnifiedError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("invalid flag combination: (0x%x)"), flags);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
||||||
- if (priv->opened[i] && drivers[i]->domainGetMaxVcpus) {
|
|
||||||
- ret = drivers[i]->domainGetMaxVcpus (dom);
|
|
||||||
- if (ret != 0) return ret;
|
|
||||||
- }
|
|
||||||
+ if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
||||||
+ ret = xenDaemonDomainGetVcpusFlags(dom, flags);
|
|
||||||
+ if (ret != -2)
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+ if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
||||||
+ ret = xenXMDomainGetVcpusFlags(dom, flags);
|
|
||||||
+ if (ret != -2)
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+ if (flags == (VIR_DOMAIN_VCPU_CONFIG | VIR_DOMAIN_VCPU_MAXIMUM))
|
|
||||||
+ return xenHypervisorGetVcpuMax(dom);
|
|
||||||
|
|
||||||
+ xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
|
|
||||||
index dfc6415..3642296 100644
|
|
||||||
--- a/src/xen/xend_internal.c
|
|
||||||
+++ b/src/xen/xend_internal.c
|
|
||||||
@@ -3620,6 +3620,58 @@ xenDaemonDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
+ * xenDaemonDomainGetVcpusFlags:
|
|
||||||
+ * @domain: pointer to domain object
|
|
||||||
+ * @flags: bitwise-ORd from virDomainVcpuFlags
|
|
||||||
+ *
|
|
||||||
+ * Extract information about virtual CPUs of domain according to flags.
|
|
||||||
+ *
|
|
||||||
+ * Returns the number of vcpus on success, -1 if an error message was
|
|
||||||
+ * issued, and -2 if the unified driver should keep trying.
|
|
||||||
+
|
|
||||||
+ */
|
|
||||||
+int
|
|
||||||
+xenDaemonDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ struct sexpr *root;
|
|
||||||
+ int ret;
|
|
||||||
+ xenUnifiedPrivatePtr priv;
|
|
||||||
+
|
|
||||||
+ if (domain == NULL || domain->conn == NULL || domain->name == NULL) {
|
|
||||||
+ virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
||||||
+
|
|
||||||
+ /* If xendConfigVersion is 2, then we can only report _LIVE (and
|
|
||||||
+ * xm_internal reports _CONFIG). If it is 3, then _LIVE and
|
|
||||||
+ * _CONFIG are always in sync for a running system. */
|
|
||||||
+ if (domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
|
|
||||||
+ return -2;
|
|
||||||
+ if (domain->id < 0 && (flags & VIR_DOMAIN_VCPU_LIVE)) {
|
|
||||||
+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("domain not active"));
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
|
|
||||||
+ if (root == NULL)
|
|
||||||
+ return -1;
|
|
||||||
+
|
|
||||||
+ ret = sexpr_int(root, "domain/vcpus");
|
|
||||||
+ if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM)) {
|
|
||||||
+ int vcpus = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
|
|
||||||
+ if (vcpus)
|
|
||||||
+ ret = MIN(vcpus, ret);
|
|
||||||
+ }
|
|
||||||
+ if (!ret)
|
|
||||||
+ ret = -2;
|
|
||||||
+ sexpr_free(root);
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
* virDomainGetVcpus:
|
|
||||||
* @domain: pointer to domain object, or NULL for Domain0
|
|
||||||
* @info: pointer to an array of virVcpuInfo structures (OUT)
|
|
||||||
diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
|
|
||||||
index c757716..923cebd 100644
|
|
||||||
--- a/src/xen/xend_internal.h
|
|
||||||
+++ b/src/xen/xend_internal.h
|
|
||||||
@@ -155,6 +155,8 @@ int xenDaemonDomainPinVcpu (virDomainPtr domain,
|
|
||||||
unsigned int vcpu,
|
|
||||||
unsigned char *cpumap,
|
|
||||||
int maplen);
|
|
||||||
+int xenDaemonDomainGetVcpusFlags (virDomainPtr domain,
|
|
||||||
+ unsigned int flags);
|
|
||||||
int xenDaemonDomainGetVcpus (virDomainPtr domain,
|
|
||||||
virVcpuInfoPtr info,
|
|
||||||
int maxinfo,
|
|
||||||
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
||||||
index f7121ab..4ea4245 100644
|
|
||||||
--- a/src/xen/xm_internal.c
|
|
||||||
+++ b/src/xen/xm_internal.c
|
|
||||||
@@ -1671,6 +1671,53 @@ cleanup:
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
+ * xenXMDomainGetVcpusFlags:
|
|
||||||
+ * @domain: pointer to domain object
|
|
||||||
+ * @flags: bitwise-ORd from virDomainVcpuFlags
|
|
||||||
+ *
|
|
||||||
+ * Extract information about virtual CPUs of domain according to flags.
|
|
||||||
+ *
|
|
||||||
+ * Returns the number of vcpus on success, -1 if an error message was
|
|
||||||
+ * issued, and -2 if the unified driver should keep trying.
|
|
||||||
+ */
|
|
||||||
+int
|
|
||||||
+xenXMDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ xenUnifiedPrivatePtr priv;
|
|
||||||
+ const char *filename;
|
|
||||||
+ xenXMConfCachePtr entry;
|
|
||||||
+ int ret = -2;
|
|
||||||
+
|
|
||||||
+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
|
||||||
+ xenXMError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (domain->id != -1)
|
|
||||||
+ return -2;
|
|
||||||
+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ xenXMError(VIR_ERR_OPERATION_FAILED, "%s", _("domain not active"));
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ priv = domain->conn->privateData;
|
|
||||||
+ xenUnifiedLock(priv);
|
|
||||||
+
|
|
||||||
+ if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
|
|
||||||
+ goto cleanup;
|
|
||||||
+
|
|
||||||
+ if (!(entry = virHashLookup(priv->configCache, filename)))
|
|
||||||
+ goto cleanup;
|
|
||||||
+
|
|
||||||
+ ret = ((flags & VIR_DOMAIN_VCPU_MAXIMUM) ? entry->def->maxvcpus
|
|
||||||
+ : entry->def->vcpus);
|
|
||||||
+
|
|
||||||
+cleanup:
|
|
||||||
+ xenUnifiedUnlock(priv);
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
* xenXMDomainPinVcpu:
|
|
||||||
* @domain: pointer to domain object
|
|
||||||
* @vcpu: virtual CPU number (reserved)
|
|
||||||
diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
|
|
||||||
index 3ad3456..3295fbd 100644
|
|
||||||
--- a/src/xen/xm_internal.h
|
|
||||||
+++ b/src/xen/xm_internal.h
|
|
||||||
@@ -45,6 +45,7 @@ int xenXMDomainSetMemory(virDomainPtr domain, unsigned long memory);
|
|
||||||
int xenXMDomainSetMaxMemory(virDomainPtr domain, unsigned long memory);
|
|
||||||
unsigned long xenXMDomainGetMaxMemory(virDomainPtr domain);
|
|
||||||
int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus);
|
|
||||||
+int xenXMDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags);
|
|
||||||
int xenXMDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
|
|
||||||
unsigned char *cpumap, int maplen);
|
|
||||||
virDomainPtr xenXMDomainLookupByName(virConnectPtr conn, const char *domname);
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,342 +0,0 @@
|
|||||||
From e443a003129a172a7332f3cb6e40b3c39363ed5e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Thu, 14 Oct 2010 16:17:18 -0600
|
|
||||||
Subject: [PATCH 14/15] vcpu: improve support for setting xen vcpu counts
|
|
||||||
|
|
||||||
Tested with RHEL 5.6 (xendConfigVersion 2, where xend_internal
|
|
||||||
controls live domains and xm_internal controls inactive domains).
|
|
||||||
Hopefully this works with xendConfigVersion 3 (where xend_internal
|
|
||||||
controls everything).
|
|
||||||
|
|
||||||
* src/xen/xen_driver.c (xenUnifiedDomainSetVcpusFlags): Support
|
|
||||||
more flags.
|
|
||||||
(xenUnifiedGetMaxVcpus): Export.
|
|
||||||
* src/xen/xm_internal.h (xenXMDomainSetVcpusFlags): New prototype.
|
|
||||||
* src/xen/xend_internal.h (xenDaemonDomainSetVcpusFlags): Likewise.
|
|
||||||
* src/xen/xen_driver.h (xenUnifiedGetMaxVcpus): Likewise.
|
|
||||||
* src/xen/xm_internal.c (xenXMDomainSetVcpusFlags): New function.
|
|
||||||
* src/xen/xend_internal.c (xenDaemonDomainSetVcpusFlags): Likewise.
|
|
||||||
---
|
|
||||||
src/xen/xen_driver.c | 60 ++++++++++++++++++++++++---------
|
|
||||||
src/xen/xen_driver.h | 1 +
|
|
||||||
src/xen/xend_internal.c | 76 +++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
src/xen/xend_internal.h | 3 ++
|
|
||||||
src/xen/xm_internal.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
src/xen/xm_internal.h | 2 +
|
|
||||||
6 files changed, 208 insertions(+), 17 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
|
|
||||||
index fe2ff86..66e8518 100644
|
|
||||||
--- a/src/xen/xen_driver.c
|
|
||||||
+++ b/src/xen/xen_driver.c
|
|
||||||
@@ -508,7 +508,7 @@ xenUnifiedIsSecure(virConnectPtr conn)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static int
|
|
||||||
+int
|
|
||||||
xenUnifiedGetMaxVcpus (virConnectPtr conn, const char *type)
|
|
||||||
{
|
|
||||||
GET_PRIVATE(conn);
|
|
||||||
@@ -1073,36 +1073,62 @@ xenUnifiedDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
GET_PRIVATE(dom->conn);
|
|
||||||
- int i;
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
|
|
||||||
+ VIR_DOMAIN_VCPU_CONFIG |
|
|
||||||
+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
|
|
||||||
|
|
||||||
- if (flags != VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
- xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
|
|
||||||
- flags);
|
|
||||||
+ /* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
|
|
||||||
+ * mixed with LIVE. */
|
|
||||||
+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
|
|
||||||
+ (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
|
|
||||||
+ (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
|
|
||||||
+ xenUnifiedError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("invalid flag combination: (0x%x)"), flags);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (!nvcpus || (unsigned short) nvcpus != nvcpus) {
|
|
||||||
+ xenUnifiedError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("argument out of range: %d"), nvcpus);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try non-hypervisor methods first, then hypervisor direct method
|
|
||||||
* as a last resort.
|
|
||||||
*/
|
|
||||||
- for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
|
|
||||||
- if (i != XEN_UNIFIED_HYPERVISOR_OFFSET &&
|
|
||||||
- priv->opened[i] &&
|
|
||||||
- drivers[i]->domainSetVcpus &&
|
|
||||||
- drivers[i]->domainSetVcpus (dom, nvcpus) == 0)
|
|
||||||
- return 0;
|
|
||||||
-
|
|
||||||
- if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] &&
|
|
||||||
- drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSetVcpus &&
|
|
||||||
- drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSetVcpus (dom, nvcpus) == 0)
|
|
||||||
- return 0;
|
|
||||||
+ if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
|
|
||||||
+ ret = xenDaemonDomainSetVcpusFlags(dom, nvcpus, flags);
|
|
||||||
+ if (ret != -2)
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+ if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
|
|
||||||
+ ret = xenXMDomainSetVcpusFlags(dom, nvcpus, flags);
|
|
||||||
+ if (ret != -2)
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+ if (flags == VIR_DOMAIN_VCPU_LIVE)
|
|
||||||
+ return xenHypervisorSetVcpus(dom, nvcpus);
|
|
||||||
|
|
||||||
+ xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
|
|
||||||
{
|
|
||||||
- return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
|
|
||||||
+ unsigned int flags = VIR_DOMAIN_VCPU_LIVE;
|
|
||||||
+ xenUnifiedPrivatePtr priv;
|
|
||||||
+
|
|
||||||
+ /* Per the documented API, it is hypervisor-dependent whether this
|
|
||||||
+ * affects just _LIVE or _LIVE|_CONFIG; in xen's case, that
|
|
||||||
+ * depends on xendConfigVersion. */
|
|
||||||
+ if (dom) {
|
|
||||||
+ priv = dom->conn->privateData;
|
|
||||||
+ if (priv->xendConfigVersion >= XEND_CONFIG_VERSION_3_0_4)
|
|
||||||
+ flags |= VIR_DOMAIN_VCPU_CONFIG;
|
|
||||||
+ }
|
|
||||||
+ return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
|
|
||||||
index 3e7c1d0..115a26a 100644
|
|
||||||
--- a/src/xen/xen_driver.h
|
|
||||||
+++ b/src/xen/xen_driver.h
|
|
||||||
@@ -220,6 +220,7 @@ int xenUnifiedRemoveDomainInfo(xenUnifiedDomainInfoListPtr info,
|
|
||||||
void xenUnifiedDomainEventDispatch (xenUnifiedPrivatePtr priv,
|
|
||||||
virDomainEventPtr event);
|
|
||||||
unsigned long xenUnifiedVersion(void);
|
|
||||||
+int xenUnifiedGetMaxVcpus(virConnectPtr conn, const char *type);
|
|
||||||
|
|
||||||
# ifndef PROXY
|
|
||||||
void xenUnifiedLock(xenUnifiedPrivatePtr priv);
|
|
||||||
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
|
|
||||||
index 3642296..55c2cc4 100644
|
|
||||||
--- a/src/xen/xend_internal.c
|
|
||||||
+++ b/src/xen/xend_internal.c
|
|
||||||
@@ -3535,6 +3535,82 @@ xenDaemonLookupByID(virConnectPtr conn, int id) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
+ * xenDaemonDomainSetVcpusFlags:
|
|
||||||
+ * @domain: pointer to domain object
|
|
||||||
+ * @nvcpus: the new number of virtual CPUs for this domain
|
|
||||||
+ * @flags: bitwise-ORd from virDomainVcpuFlags
|
|
||||||
+ *
|
|
||||||
+ * Change virtual CPUs allocation of domain according to flags.
|
|
||||||
+ *
|
|
||||||
+ * Returns 0 on success, -1 if an error message was issued, and -2 if
|
|
||||||
+ * the unified driver should keep trying.
|
|
||||||
+ */
|
|
||||||
+int
|
|
||||||
+xenDaemonDomainSetVcpusFlags(virDomainPtr domain, unsigned int vcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ char buf[VIR_UUID_BUFLEN];
|
|
||||||
+ xenUnifiedPrivatePtr priv;
|
|
||||||
+ int max;
|
|
||||||
+
|
|
||||||
+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
|
||||||
+ || (vcpus < 1)) {
|
|
||||||
+ virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
+ return (-1);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
||||||
+
|
|
||||||
+ if ((domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) ||
|
|
||||||
+ (flags & VIR_DOMAIN_VCPU_MAXIMUM))
|
|
||||||
+ return -2;
|
|
||||||
+
|
|
||||||
+ /* With xendConfigVersion 2, only _LIVE is supported. With
|
|
||||||
+ * xendConfigVersion 3, only _LIVE|_CONFIG is supported for
|
|
||||||
+ * running domains, or _CONFIG for inactive domains. */
|
|
||||||
+ if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
|
|
||||||
+ if (flags & VIR_DOMAIN_VCPU_CONFIG) {
|
|
||||||
+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("Xend version does not support modifying "
|
|
||||||
+ "persistent config"));
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ } else if (domain->id < 0) {
|
|
||||||
+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("domain not running"));
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) !=
|
|
||||||
+ (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) {
|
|
||||||
+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("Xend only supports modifying both live and "
|
|
||||||
+ "persistent config"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Unfortunately, xend_op does not validate whether this exceeds
|
|
||||||
+ * the maximum. */
|
|
||||||
+ flags |= VIR_DOMAIN_VCPU_MAXIMUM;
|
|
||||||
+ if ((max = xenDaemonDomainGetVcpusFlags(domain, flags)) < 0) {
|
|
||||||
+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("could not determin max vcpus for the domain"));
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (vcpus > max) {
|
|
||||||
+ virXendError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("requested vcpus is greater than max allowable"
|
|
||||||
+ " vcpus for the domain: %d > %d"), vcpus, max);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ snprintf(buf, sizeof(buf), "%d", vcpus);
|
|
||||||
+ return xend_op(domain->conn, domain->name, "op", "set_vcpus", "vcpus",
|
|
||||||
+ buf, NULL);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
* xenDaemonDomainSetVcpus:
|
|
||||||
* @domain: pointer to domain object
|
|
||||||
* @nvcpus: the new number of virtual CPUs for this domain
|
|
||||||
diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
|
|
||||||
index 923cebd..53f5d2c 100644
|
|
||||||
--- a/src/xen/xend_internal.h
|
|
||||||
+++ b/src/xen/xend_internal.h
|
|
||||||
@@ -151,6 +151,9 @@ int xenDaemonDomainUndefine(virDomainPtr domain);
|
|
||||||
|
|
||||||
int xenDaemonDomainSetVcpus (virDomainPtr domain,
|
|
||||||
unsigned int vcpus);
|
|
||||||
+int xenDaemonDomainSetVcpusFlags (virDomainPtr domain,
|
|
||||||
+ unsigned int vcpus,
|
|
||||||
+ unsigned int flags);
|
|
||||||
int xenDaemonDomainPinVcpu (virDomainPtr domain,
|
|
||||||
unsigned int vcpu,
|
|
||||||
unsigned char *cpumap,
|
|
||||||
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
||||||
index 4ea4245..2b8e51e 100644
|
|
||||||
--- a/src/xen/xm_internal.c
|
|
||||||
+++ b/src/xen/xm_internal.c
|
|
||||||
@@ -1670,6 +1670,89 @@ cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ * xenXMDomainSetVcpusFlags:
|
|
||||||
+ * @domain: pointer to domain object
|
|
||||||
+ * @nvcpus: number of vcpus
|
|
||||||
+ * @flags: bitwise-ORd from virDomainVcpuFlags
|
|
||||||
+ *
|
|
||||||
+ * Change virtual CPUs allocation of domain according to flags.
|
|
||||||
+ *
|
|
||||||
+ * Returns 0 on success, -1 if an error message was issued, and -2 if
|
|
||||||
+ * the unified driver should keep trying.
|
|
||||||
+ */
|
|
||||||
+int
|
|
||||||
+xenXMDomainSetVcpusFlags(virDomainPtr domain, unsigned int vcpus,
|
|
||||||
+ unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ xenUnifiedPrivatePtr priv;
|
|
||||||
+ const char *filename;
|
|
||||||
+ xenXMConfCachePtr entry;
|
|
||||||
+ int ret = -1;
|
|
||||||
+ int max;
|
|
||||||
+
|
|
||||||
+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
|
||||||
+ xenXMError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (domain->conn->flags & VIR_CONNECT_RO) {
|
|
||||||
+ xenXMError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (domain->id != -1)
|
|
||||||
+ return -2;
|
|
||||||
+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
|
|
||||||
+ xenXMError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
+ _("domain is not running"));
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ priv = domain->conn->privateData;
|
|
||||||
+ xenUnifiedLock(priv);
|
|
||||||
+
|
|
||||||
+ if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
|
|
||||||
+ goto cleanup;
|
|
||||||
+
|
|
||||||
+ if (!(entry = virHashLookup(priv->configCache, filename)))
|
|
||||||
+ goto cleanup;
|
|
||||||
+
|
|
||||||
+ /* Hypervisor maximum. */
|
|
||||||
+ if ((max = xenUnifiedGetMaxVcpus(domain->conn, NULL)) < 0) {
|
|
||||||
+ xenXMError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
+ _("could not determin max vcpus for the domain"));
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+ /* Can't specify a current larger than stored maximum; but
|
|
||||||
+ * reducing maximum can silently reduce current. */
|
|
||||||
+ if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM))
|
|
||||||
+ max = entry->def->maxvcpus;
|
|
||||||
+ if (vcpus > max) {
|
|
||||||
+ xenXMError(VIR_ERR_INVALID_ARG,
|
|
||||||
+ _("requested vcpus is greater than max allowable"
|
|
||||||
+ " vcpus for the domain: %d > %d"), vcpus, max);
|
|
||||||
+ goto cleanup;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (flags & VIR_DOMAIN_VCPU_MAXIMUM) {
|
|
||||||
+ entry->def->maxvcpus = vcpus;
|
|
||||||
+ if (entry->def->vcpus > vcpus)
|
|
||||||
+ entry->def->vcpus = vcpus;
|
|
||||||
+ } else {
|
|
||||||
+ entry->def->vcpus = vcpus;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* If this fails, should we try to undo our changes to the
|
|
||||||
+ * in-memory representation of the config file. I say not!
|
|
||||||
+ */
|
|
||||||
+ if (xenXMConfigSaveFile(domain->conn, entry->filename, entry->def) < 0)
|
|
||||||
+ goto cleanup;
|
|
||||||
+ ret = 0;
|
|
||||||
+
|
|
||||||
+cleanup:
|
|
||||||
+ xenUnifiedUnlock(priv);
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* xenXMDomainGetVcpusFlags:
|
|
||||||
* @domain: pointer to domain object
|
|
||||||
diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
|
|
||||||
index 3295fbd..a46e1a2 100644
|
|
||||||
--- a/src/xen/xm_internal.h
|
|
||||||
+++ b/src/xen/xm_internal.h
|
|
||||||
@@ -45,6 +45,8 @@ int xenXMDomainSetMemory(virDomainPtr domain, unsigned long memory);
|
|
||||||
int xenXMDomainSetMaxMemory(virDomainPtr domain, unsigned long memory);
|
|
||||||
unsigned long xenXMDomainGetMaxMemory(virDomainPtr domain);
|
|
||||||
int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus);
|
|
||||||
+int xenXMDomainSetVcpusFlags(virDomainPtr domain, unsigned int vcpus,
|
|
||||||
+ unsigned int flags);
|
|
||||||
int xenXMDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags);
|
|
||||||
int xenXMDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
|
|
||||||
unsigned char *cpumap, int maplen);
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
@@ -1,228 +0,0 @@
|
|||||||
From b013788742183afec9aa5068d3cfd185a3b5c62e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eric Blake <eblake@redhat.com>
|
|
||||||
Date: Thu, 7 Oct 2010 08:59:27 -0600
|
|
||||||
Subject: [PATCH 15/15] vcpu: remove dead xen code
|
|
||||||
|
|
||||||
* src/xen/xen_driver.h (xenUnifiedDriver): Remove now-unused
|
|
||||||
domainGetMaxVcpus, domainSetVcpus.
|
|
||||||
* src/xen/proxy_internal.c (xenProxyDriver): Likewise.
|
|
||||||
* src/xen/xen_hypervisor.c (xenHypervisorDriver): Likewise.
|
|
||||||
* src/xen/xen_inotify.c (xenInotifyDriver): Likewise.
|
|
||||||
* src/xen/xend_internal.c (xenDaemonDriver)
|
|
||||||
(xenDaemonDomainSetVcpus): Likewise.
|
|
||||||
* src/xen/xm_internal.c (xenXMDriver, xenXMDomainSetVcpus):
|
|
||||||
Likewise.
|
|
||||||
* src/xen/xs_internal.c (xenStoreDriver): Likewise.
|
|
||||||
---
|
|
||||||
src/xen/proxy_internal.c | 2 --
|
|
||||||
src/xen/xen_driver.h | 4 +---
|
|
||||||
src/xen/xen_hypervisor.c | 2 --
|
|
||||||
src/xen/xen_inotify.c | 2 --
|
|
||||||
src/xen/xend_internal.c | 33 ---------------------------------
|
|
||||||
src/xen/xm_internal.c | 43 -------------------------------------------
|
|
||||||
src/xen/xs_internal.c | 2 --
|
|
||||||
7 files changed, 1 insertions(+), 87 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/xen/proxy_internal.c b/src/xen/proxy_internal.c
|
|
||||||
index 335dfc4..4033727 100644
|
|
||||||
--- a/src/xen/proxy_internal.c
|
|
||||||
+++ b/src/xen/proxy_internal.c
|
|
||||||
@@ -67,10 +67,8 @@ struct xenUnifiedDriver xenProxyDriver = {
|
|
||||||
NULL, /* domainSave */
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
- NULL, /* domainSetVcpus */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
- NULL, /* domainGetMaxVcpus */
|
|
||||||
NULL, /* listDefinedDomains */
|
|
||||||
NULL, /* numOfDefinedDomains */
|
|
||||||
NULL, /* domainCreate */
|
|
||||||
diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
|
|
||||||
index 115a26a..53f97d4 100644
|
|
||||||
--- a/src/xen/xen_driver.h
|
|
||||||
+++ b/src/xen/xen_driver.h
|
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
/*
|
|
||||||
* xen_unified.c: Unified Xen driver.
|
|
||||||
*
|
|
||||||
- * Copyright (C) 2007 Red Hat, Inc.
|
|
||||||
+ * Copyright (C) 2007, 2010 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* See COPYING.LIB for the License of this software
|
|
||||||
*
|
|
||||||
@@ -84,10 +84,8 @@ struct xenUnifiedDriver {
|
|
||||||
virDrvDomainSave domainSave;
|
|
||||||
virDrvDomainRestore domainRestore;
|
|
||||||
virDrvDomainCoreDump domainCoreDump;
|
|
||||||
- virDrvDomainSetVcpus domainSetVcpus;
|
|
||||||
virDrvDomainPinVcpu domainPinVcpu;
|
|
||||||
virDrvDomainGetVcpus domainGetVcpus;
|
|
||||||
- virDrvDomainGetMaxVcpus domainGetMaxVcpus;
|
|
||||||
virDrvListDefinedDomains listDefinedDomains;
|
|
||||||
virDrvNumOfDefinedDomains numOfDefinedDomains;
|
|
||||||
virDrvDomainCreate domainCreate;
|
|
||||||
diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
|
|
||||||
index 6246513..3797865 100644
|
|
||||||
--- a/src/xen/xen_hypervisor.c
|
|
||||||
+++ b/src/xen/xen_hypervisor.c
|
|
||||||
@@ -784,10 +784,8 @@ struct xenUnifiedDriver xenHypervisorDriver = {
|
|
||||||
NULL, /* domainSave */
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
- xenHypervisorSetVcpus, /* domainSetVcpus */
|
|
||||||
xenHypervisorPinVcpu, /* domainPinVcpu */
|
|
||||||
xenHypervisorGetVcpus, /* domainGetVcpus */
|
|
||||||
- xenHypervisorGetVcpuMax, /* domainGetMaxVcpus */
|
|
||||||
NULL, /* listDefinedDomains */
|
|
||||||
NULL, /* numOfDefinedDomains */
|
|
||||||
NULL, /* domainCreate */
|
|
||||||
diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c
|
|
||||||
index d24b20f..9507061 100644
|
|
||||||
--- a/src/xen/xen_inotify.c
|
|
||||||
+++ b/src/xen/xen_inotify.c
|
|
||||||
@@ -71,10 +71,8 @@ struct xenUnifiedDriver xenInotifyDriver = {
|
|
||||||
NULL, /* domainSave */
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
- NULL, /* domainSetVcpus */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
- NULL, /* domainGetMaxVcpus */
|
|
||||||
NULL, /* listDefinedDomains */
|
|
||||||
NULL, /* numOfDefinedDomains */
|
|
||||||
NULL, /* domainCreate */
|
|
||||||
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
|
|
||||||
index 55c2cc4..b90c331 100644
|
|
||||||
--- a/src/xen/xend_internal.c
|
|
||||||
+++ b/src/xen/xend_internal.c
|
|
||||||
@@ -3611,37 +3611,6 @@ xenDaemonDomainSetVcpusFlags(virDomainPtr domain, unsigned int vcpus,
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
- * xenDaemonDomainSetVcpus:
|
|
||||||
- * @domain: pointer to domain object
|
|
||||||
- * @nvcpus: the new number of virtual CPUs for this domain
|
|
||||||
- *
|
|
||||||
- * Dynamically change the number of virtual CPUs used by the domain.
|
|
||||||
- *
|
|
||||||
- * Returns 0 for success; -1 (with errno) on error
|
|
||||||
- */
|
|
||||||
-int
|
|
||||||
-xenDaemonDomainSetVcpus(virDomainPtr domain, unsigned int vcpus)
|
|
||||||
-{
|
|
||||||
- char buf[VIR_UUID_BUFLEN];
|
|
||||||
- xenUnifiedPrivatePtr priv;
|
|
||||||
-
|
|
||||||
- if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|
|
||||||
- || (vcpus < 1)) {
|
|
||||||
- virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
- return (-1);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
|
|
||||||
-
|
|
||||||
- if (domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
|
|
||||||
- return(-1);
|
|
||||||
-
|
|
||||||
- snprintf(buf, sizeof(buf), "%d", vcpus);
|
|
||||||
- return(xend_op(domain->conn, domain->name, "op", "set_vcpus", "vcpus",
|
|
||||||
- buf, NULL));
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/**
|
|
||||||
* xenDaemonDomainPinCpu:
|
|
||||||
* @domain: pointer to domain object
|
|
||||||
* @vcpu: virtual CPU number
|
|
||||||
@@ -5213,10 +5182,8 @@ struct xenUnifiedDriver xenDaemonDriver = {
|
|
||||||
xenDaemonDomainSave, /* domainSave */
|
|
||||||
xenDaemonDomainRestore, /* domainRestore */
|
|
||||||
xenDaemonDomainCoreDump, /* domainCoreDump */
|
|
||||||
- xenDaemonDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
xenDaemonDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
xenDaemonDomainGetVcpus, /* domainGetVcpus */
|
|
||||||
- NULL, /* domainGetMaxVcpus */
|
|
||||||
xenDaemonListDefinedDomains, /* listDefinedDomains */
|
|
||||||
xenDaemonNumOfDefinedDomains,/* numOfDefinedDomains */
|
|
||||||
xenDaemonDomainCreate, /* domainCreate */
|
|
||||||
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
||||||
index 2b8e51e..430d40b 100644
|
|
||||||
--- a/src/xen/xm_internal.c
|
|
||||||
+++ b/src/xen/xm_internal.c
|
|
||||||
@@ -103,10 +103,8 @@ struct xenUnifiedDriver xenXMDriver = {
|
|
||||||
NULL, /* domainSave */
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
- xenXMDomainSetVcpus, /* domainSetVcpus */
|
|
||||||
xenXMDomainPinVcpu, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
- NULL, /* domainGetMaxVcpus */
|
|
||||||
xenXMListDefinedDomains, /* listDefinedDomains */
|
|
||||||
xenXMNumOfDefinedDomains, /* numOfDefinedDomains */
|
|
||||||
xenXMDomainCreate, /* domainCreate */
|
|
||||||
@@ -1630,47 +1628,6 @@ cleanup:
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * Set the VCPU count in config
|
|
||||||
- */
|
|
||||||
-int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) {
|
|
||||||
- xenUnifiedPrivatePtr priv;
|
|
||||||
- const char *filename;
|
|
||||||
- xenXMConfCachePtr entry;
|
|
||||||
- int ret = -1;
|
|
||||||
-
|
|
||||||
- if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
|
|
||||||
- xenXMError(VIR_ERR_INVALID_ARG, __FUNCTION__);
|
|
||||||
- return (-1);
|
|
||||||
- }
|
|
||||||
- if (domain->conn->flags & VIR_CONNECT_RO)
|
|
||||||
- return (-1);
|
|
||||||
- if (domain->id != -1)
|
|
||||||
- return (-1);
|
|
||||||
-
|
|
||||||
- priv = domain->conn->privateData;
|
|
||||||
- xenUnifiedLock(priv);
|
|
||||||
-
|
|
||||||
- if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
|
|
||||||
- goto cleanup;
|
|
||||||
-
|
|
||||||
- if (!(entry = virHashLookup(priv->configCache, filename)))
|
|
||||||
- goto cleanup;
|
|
||||||
-
|
|
||||||
- entry->def->maxvcpus = entry->def->vcpus = vcpus;
|
|
||||||
-
|
|
||||||
- /* If this fails, should we try to undo our changes to the
|
|
||||||
- * in-memory representation of the config file. I say not!
|
|
||||||
- */
|
|
||||||
- if (xenXMConfigSaveFile(domain->conn, entry->filename, entry->def) < 0)
|
|
||||||
- goto cleanup;
|
|
||||||
- ret = 0;
|
|
||||||
-
|
|
||||||
-cleanup:
|
|
||||||
- xenUnifiedUnlock(priv);
|
|
||||||
- return ret;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/*
|
|
||||||
* xenXMDomainSetVcpusFlags:
|
|
||||||
* @domain: pointer to domain object
|
|
||||||
* @nvcpus: number of vcpus
|
|
||||||
diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c
|
|
||||||
index 9296f25..a9817b1 100644
|
|
||||||
--- a/src/xen/xs_internal.c
|
|
||||||
+++ b/src/xen/xs_internal.c
|
|
||||||
@@ -67,10 +67,8 @@ struct xenUnifiedDriver xenStoreDriver = {
|
|
||||||
NULL, /* domainSave */
|
|
||||||
NULL, /* domainRestore */
|
|
||||||
NULL, /* domainCoreDump */
|
|
||||||
- NULL, /* domainSetVcpus */
|
|
||||||
NULL, /* domainPinVcpu */
|
|
||||||
NULL, /* domainGetVcpus */
|
|
||||||
- NULL, /* domainGetMaxVcpus */
|
|
||||||
NULL, /* listDefinedDomains */
|
|
||||||
NULL, /* numOfDefinedDomains */
|
|
||||||
NULL, /* domainCreate */
|
|
||||||
--
|
|
||||||
1.7.2.3
|
|
||||||
|
|
||||||
2651
docs/apibuild.py
2651
docs/apibuild.py
File diff suppressed because it is too large
Load Diff
@@ -1,467 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Applications using libvirt</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This page provides an illustration of the wide variety of
|
|
||||||
applications using the libvirt management API.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="add">Add an application</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To add an application not listed on this page, send a message
|
|
||||||
to the <a href="contact.html">mailing list</a>, requesting it
|
|
||||||
be added here, or simply send a patch against the documentation
|
|
||||||
in the libvirt.git docs subdirectory.
|
|
||||||
If your application uses libvirt as its API,
|
|
||||||
the following graphic is available for your website to advertise
|
|
||||||
support for libvirt:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="image">
|
|
||||||
<img src="madeWith.png" alt="Made with libvirt"/>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="clientserver">Client/Server applications</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://archipelproject.org">Archipel</a></dt>
|
|
||||||
<dd>
|
|
||||||
Archipel is a libvirt-based solution to manage and supervise virtual
|
|
||||||
machines. It uses XMPP for all communication. There is no web
|
|
||||||
service or custom protocol. You just need at least one XMPP server,
|
|
||||||
like eJabberd, to start playing with it. This allows Archipel to
|
|
||||||
work completely real time. You never have to refresh the user
|
|
||||||
interface, you'll be notified as soon as something happens. You can
|
|
||||||
even use your favorite chat clients to command your infrastructure.
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
Isn't it great to be able to open a chat conversation with your
|
|
||||||
virtual machine and say things like "How are you today?" or "Hey,
|
|
||||||
please reboot"?
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="command">Command line tools</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://libguestfs.org">guestfish</a></dt>
|
|
||||||
<dd>
|
|
||||||
Guestfish is an interactive shell and command-line tool for examining
|
|
||||||
and modifying virtual machine filesystems. It uses libvirt to find
|
|
||||||
guests and their associated disks.
|
|
||||||
</dd>
|
|
||||||
<dt>virsh</dt>
|
|
||||||
<dd>
|
|
||||||
An interactive shell, and batch scriptable tool for performing
|
|
||||||
management tasks on all libvirt managed domains, networks and
|
|
||||||
storage. This is part of the libvirt core distribution.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://virt-manager.org/">virt-clone</a></dt>
|
|
||||||
<dd>
|
|
||||||
Allows the disk image(s) and configuration for an existing
|
|
||||||
virtual machine to be cloned to form a new virtual machine.
|
|
||||||
It automates copying of data across to new disk images, and
|
|
||||||
updates the UUID, MAC address, and name in the configuration.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://et.redhat.com/~rjones/virt-df/">virt-df</a></dt>
|
|
||||||
<dd>
|
|
||||||
Examine the utilization of each filesystem in a virtual machine
|
|
||||||
from the comfort of the host machine. This tool peeks into the
|
|
||||||
guest disks and determines how much space is used. It can cope
|
|
||||||
with common Linux filesystems and LVM volumes.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://virt-manager.org/">virt-image</a></dt>
|
|
||||||
<dd>
|
|
||||||
Provides a way to deploy virtual appliances. It defines a
|
|
||||||
simplified portable XML format describing the pre-requisites
|
|
||||||
of a virtual machine. At time of deployment this is translated
|
|
||||||
into the domain XML format for execution under any libvirt
|
|
||||||
hypervisor meeting the pre-requisites.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://virt-manager.org/">virt-install</a></dt>
|
|
||||||
<dd>
|
|
||||||
Provides a way to provision new virtual machines from a
|
|
||||||
OS distribution install tree. It supports provisioning from
|
|
||||||
local CD images, and the network over NFS, HTTP and FTP.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://et.redhat.com/~rjones/virt-top/">virt-top</a></dt>
|
|
||||||
<dd>
|
|
||||||
Watch the CPU, memory, network and disk utilization of all
|
|
||||||
virtual machines running on a host.
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
<a href="http://people.redhat.com/~rjones/virt-what/">virt-what</a>
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
virt-what is a shell script for detecting if the program is running
|
|
||||||
in a virtual machine. It prints out a list of facts about the
|
|
||||||
virtual machine, derived from heuristics.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://sourceware.org/systemtap/">stap</a></dt>
|
|
||||||
<dd>
|
|
||||||
SystemTap is a tool used to gather rich information about a running
|
|
||||||
system through the use of scripts. Starting from v2.4, the front-end
|
|
||||||
application stap can use libvirt to gather data within virtual
|
|
||||||
machines.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="https://github.com/pradels/vagrant-libvirt/">vagrant-libvirt</a></dt>
|
|
||||||
<dd>
|
|
||||||
Vagrant-Libvirt is a Vagrant plugin that uses libvirt to manage virtual
|
|
||||||
machines. It is a command line tool for developers that makes it very
|
|
||||||
fast and easy to deploy and re-deploy an environment of vm's.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="configmgmt">Configuration Management</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="https://wiki.lcfg.org/bin/view/LCFG/LcfgLibvirt">LCFG</a></dt>
|
|
||||||
<dd>
|
|
||||||
LCFG is a system for automatically installing and managing the
|
|
||||||
configuration of large numbers of Unix systems. It is particularly
|
|
||||||
suitable for sites with very diverse and rapidly changing
|
|
||||||
configurations.
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
The lcfg-libvirt package adds support for virtualized systems to
|
|
||||||
LCFG, with both Xen and KVM known to work. Cloning guests is
|
|
||||||
supported, as are the bridged, routed, and isolated modes for
|
|
||||||
Virtual Networking.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="continuousintegration">Continuous Integration</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://buildbot.net/buildbot/docs/current/Libvirt.html">BuildBot</a></dt>
|
|
||||||
<dd>
|
|
||||||
BuildBot is a system to automate the compile/test cycle required
|
|
||||||
by most software projects. CVS commits trigger new builds, run on
|
|
||||||
a variety of client machines. Build status (pass/fail/etc) are
|
|
||||||
displayed on a web page or through other protocols.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://wiki.jenkins-ci.org/display/JENKINS/Libvirt+Slaves+Plugin">Jenkins</a></dt>
|
|
||||||
<dd>
|
|
||||||
This plugin for Jenkins adds a way to control guest domains hosted
|
|
||||||
on Xen or QEMU/KVM. You configure a Jenkins Slave,
|
|
||||||
selecting the guest domain and hypervisor. When you need to build a
|
|
||||||
job on a specific Slave, its guest domain is started, then the job is
|
|
||||||
run. When the build process is finished, the guest domain is shut
|
|
||||||
down, ready to be used again as required.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="conversion">Conversion</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://libguestfs.org/virt-p2v.1.html">virt-p2v</a></dt>
|
|
||||||
<dd>
|
|
||||||
Convert a physical machine to run on KVM. It is a LiveCD
|
|
||||||
which is booted on the machine to be converted. It collects a
|
|
||||||
little information from the user, then copies the disks over
|
|
||||||
to a remote machine and defines the XML for a domain to run
|
|
||||||
the guest. (Note this tool is included with libguestfs)
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://libguestfs.org/virt-v2v.1.html">virt-v2v</a></dt>
|
|
||||||
<dd>
|
|
||||||
virt-v2v converts guests from a foreign hypervisor to run on
|
|
||||||
KVM, managed by libvirt. It can convert guests from VMware or
|
|
||||||
Xen to run on OpenStack, oVirt (RHEV-M), or local libvirt. It
|
|
||||||
will enable VirtIO drivers in the converted guest if possible.
|
|
||||||
(Note this tool is included with libguestfs)
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
For RHEL customers of Red Hat, conversion of Windows guests is also
|
|
||||||
possible. This conversion requires some Microsoft signed pieces,
|
|
||||||
that Red Hat can provide.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="https://launchpad.net/virt-goodies">vmware2libvirt</a></dt>
|
|
||||||
<dd>
|
|
||||||
Part of the <i>virt-goodies</i> package, vmware2libvirt is a python
|
|
||||||
script for migrating a vmware image to libvirt.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="desktop">Desktop applications</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://virt-manager.org/">virt-manager</a></dt>
|
|
||||||
<dd>
|
|
||||||
A general purpose desktop management tool, able to manage
|
|
||||||
virtual machines across both local and remotely accessed
|
|
||||||
hypervisors. It is targeted at home and small office usage
|
|
||||||
up to managing 10-20 hosts and their VMs.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://virt-manager.org/">virt-viewer</a></dt>
|
|
||||||
<dd>
|
|
||||||
A lightweight tool for accessing the graphical console
|
|
||||||
associated with a virtual machine. It can securely connect
|
|
||||||
to remote consoles supporting the VNC protocol. Also provides
|
|
||||||
an optional mozilla browser plugin.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="iaas">Infrastructure as a Service (IaaS)</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://cc1.ifj.edu.pl">Cracow Cloud One</a></dt>
|
|
||||||
<dd>The CC1 system provides a complete solution for Private
|
|
||||||
Cloud Computing. An intuitive web access interface with an
|
|
||||||
administration module and simple installation procedure make
|
|
||||||
it easy to benefit from private Cloud Computing technology.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="http://www.emotivecloud.net">EMOTIVE Cloud</a></dt>
|
|
||||||
<dd>The EMOTIVE (Elastic Management Of Tasks In Virtualized
|
|
||||||
Environments) middleware allows executing tasks and providing
|
|
||||||
virtualized environments to the users with Xen, KVM or
|
|
||||||
VirtualBox hypervisor. EMOTIVE's main feature is VM management
|
|
||||||
with different scheduling policies. It can be also used as a
|
|
||||||
cloud provider and is very easy to extend thanks to its
|
|
||||||
modular Web Services architecture.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="http://www.eucalyptus.com">Eucalyptus</a></dt>
|
|
||||||
<dd>
|
|
||||||
Eucalyptus is an on-premise Infrastructure as a Service cloud
|
|
||||||
software platform that is open source and
|
|
||||||
AWS-compatible. Eucalyptus uses libivrt virtualization API to
|
|
||||||
directly interact with Xen and KVM hypervisors.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="http://www.nimbusproject.org">Nimbus</a></dt>
|
|
||||||
<dd>
|
|
||||||
Nimbus is an open-source toolkit focused on providing
|
|
||||||
Infrastructure-as-a-Service (IaaS) capabilities to the scientific
|
|
||||||
community. It uses libvirt for communication with all KVM and Xen
|
|
||||||
virtual machines.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="http://snooze.inria.fr">Snooze</a></dt>
|
|
||||||
<dd>
|
|
||||||
Snooze is an open-source scalable, autonomic, and energy-efficient
|
|
||||||
virtual machine (VM) management framework for private clouds. It
|
|
||||||
integrates libvirt for VM monitoring, live migration, and life-cycle
|
|
||||||
management.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="http://www.openstack.org">OpenStack</a></dt>
|
|
||||||
<dd>
|
|
||||||
OpenStack is a "cloud operating system" usable for both public
|
|
||||||
and private clouds. Its various parts take care of compute,
|
|
||||||
storage and networking resources and interface with the user
|
|
||||||
using a dashboard. Compute part uses libvirt to manage VM
|
|
||||||
life-cycle, monitoring and so on.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="https://github.com/gustavfranssonnyvell/cherrypop">Cherrypop</a></dt>
|
|
||||||
<dd>
|
|
||||||
A cloud software with no masters or central points. Nodes
|
|
||||||
autodetect other nodes and autodistribute virtual
|
|
||||||
machines and autodivide up the workload. Also there is no
|
|
||||||
minimum limit for hosts, well, one might be nice. It's
|
|
||||||
perfect for setting up low-end servers in a cloud or a
|
|
||||||
cloud where you want the most bang for the bucks.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="libraries">Libraries</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://libguestfs.org">libguestfs</a></dt>
|
|
||||||
<dd>
|
|
||||||
A library and set of tools for accessing and modifying virtual
|
|
||||||
machine disk images. It can be linked with C and C++ management
|
|
||||||
programs, and has bindings for Perl, Python, Ruby, Java, OCaml,
|
|
||||||
PHP, Haskell, and C#.
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
Using its FUSE module, you can also mount guest filesystems on the
|
|
||||||
host, and there is a subproject to allow merging changes into the
|
|
||||||
Windows Registry in Windows guests.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="http://sandbox.libvirt.org">libvirt-sandbox</a></dt>
|
|
||||||
<dd>
|
|
||||||
A library and command line tools for simplifying the creation of
|
|
||||||
application sandboxes using virtualization technology. It currently
|
|
||||||
supports either KVM, QEMU or LXC as backends. Integration with
|
|
||||||
systemd facilitates sandboxing of system services like apache.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="https://github.com/ohadlevy/virt#readme">Ruby
|
|
||||||
Libvirt Object bindings</a></dt>
|
|
||||||
<dd>
|
|
||||||
Allows using simple ruby objects to manipulate
|
|
||||||
hypervisors, guests, storage, network etc. It is
|
|
||||||
based on top of
|
|
||||||
the <a href="http://libvirt.org/ruby">native ruby bindings</a>.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="livecd">LiveCD / Appliances</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://et.redhat.com/~rjones/virt-p2v/">virt-p2v</a></dt>
|
|
||||||
<dd>
|
|
||||||
An older tool for converting a physical machine into a virtual
|
|
||||||
machine. It is a LiveCD which is booted on the machine to be
|
|
||||||
converted. It collects a little information from the user, then
|
|
||||||
copies the disks over to a remote machine and defines the XML for a
|
|
||||||
domain to run the guest.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="monitoring">Monitoring</a></h2>
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://collectd.org/plugins/libvirt.shtml">collectd</a></dt>
|
|
||||||
<dd>
|
|
||||||
The libvirt-plugin is part of <a href="http://collectd.org/">collectd</a>
|
|
||||||
and gathers statistics about virtualized guests on a system. This
|
|
||||||
way, you can collect CPU, network interface and block device usage
|
|
||||||
for each guest without installing collectd on the guest systems.
|
|
||||||
For a full description, please refer to the libvirt section in the
|
|
||||||
collectd.conf(5) manual page.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://host-sflow.sourceforge.net/">Host sFlow</a></dt>
|
|
||||||
<dd>
|
|
||||||
Host sFlow is a lightweight agent running on KVM hypervisors that
|
|
||||||
links to libvirt library and exports standardized cpu, memory, network
|
|
||||||
and disk metrics for all virtual machines.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://honk.sigxcpu.org/projects/libvirt/#munin">Munin</a></dt>
|
|
||||||
<dd>
|
|
||||||
The plugins provided by Guido Günther allow to monitor various things
|
|
||||||
like network and block I/O with
|
|
||||||
<a href="http://munin.projects.linpro.no/">Munin</a>.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://et.redhat.com/~rjones/nagios-virt/">Nagios-virt</a></dt>
|
|
||||||
<dd>
|
|
||||||
Nagios-virt is a configuration tool to add monitoring of your
|
|
||||||
virtualised domains to <a href="http://www.nagios.org/">Nagios</a>.
|
|
||||||
You can use this tool to either set up a new Nagios installation for
|
|
||||||
your Xen or QEMU/KVM guests, or to integrate with your existing Nagios
|
|
||||||
installation.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://community.zenoss.org/docs/DOC-4687">Zenoss</a></dt>
|
|
||||||
<dd>
|
|
||||||
The Zenoss libvirt Zenpack adds support for monitoring virtualization
|
|
||||||
servers. It has been tested with KVM, QEMU, VMware ESX, and VMware
|
|
||||||
GSX.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="provisioning">Provisioning</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://www.ibm.com/software/tivoli/products/prov-mgr/">Tivoli Provisioning Manager</a></dt>
|
|
||||||
<dd>
|
|
||||||
Part of the IBM Tivoli family, Tivoli Provisioning Manager (TPM) is
|
|
||||||
an IT lifecycle automation product. It
|
|
||||||
<a href="http://publib.boulder.ibm.com/infocenter/tivihelp/v38r1/index.jsp?topic=/com.ibm.tivoli.tpm.apk.doc/libvirt_package.html">uses libvirt</a>
|
|
||||||
for communication with virtualization hosts and guest domains.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://theforeman.org">Foreman</a></dt>
|
|
||||||
<dd>
|
|
||||||
Foreman is an open source web based application aimed to be a
|
|
||||||
Single Address For All Machines Life Cycle Management. Foreman:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Creates everything you need when adding a new machine to
|
|
||||||
your network, its goal being automatically managing
|
|
||||||
everything you would normally manage manually (DNS, DHCP,
|
|
||||||
TFTP, Virtual Machines,CA, CMDB...)</li>
|
|
||||||
<li>Integrates with Puppet (and acts as web front end to it).</li>
|
|
||||||
<li>Takes care of provisioning until the point puppet is
|
|
||||||
running, allowing Puppet to do what it does best.</li>
|
|
||||||
<li>Shows you Systems Inventory (based on Facter) and
|
|
||||||
provides real time information about hosts status based on
|
|
||||||
Puppet reports.</li>
|
|
||||||
</ul>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
|
||||||
<h2><a name="web">Web applications</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://community.abiquo.com/display/AbiCloud">AbiCloud</a></dt>
|
|
||||||
<dd>
|
|
||||||
AbiCloud is an open source cloud platform manager which allows to
|
|
||||||
easily deploy a private cloud in your datacenter. One of the key
|
|
||||||
differences of AbiCloud is the web rich interface for managing the
|
|
||||||
infrastructure. You can deploy a new service just dragging and
|
|
||||||
dropping a VM.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="https://kimchi-project.github.io/kimchi/">Kimchi</a></dt>
|
|
||||||
<dd>
|
|
||||||
Kimchi is an HTML5 based management tool for KVM. It is designed to
|
|
||||||
make it as easy as possible to get started with KVM and create your first guest.
|
|
||||||
|
|
||||||
Kimchi manages KVM guests through libvirt. The management interface is accessed
|
|
||||||
over the web using a browser that supports HTML5.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://ovirt.org/">oVirt</a></dt>
|
|
||||||
<dd>
|
|
||||||
oVirt provides the ability to manage large numbers of virtual
|
|
||||||
machines across an entire data center of hosts. It integrates
|
|
||||||
with FreeIPA for Kerberos authentication, and in the future,
|
|
||||||
certificate management.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://ispsystem.com/en/software/vmmanager">VMmanager</a></dt>
|
|
||||||
<dd>
|
|
||||||
VMmanager is a software solution for virtualization management
|
|
||||||
that can be used both for hosting virtual machines and
|
|
||||||
building a cloud. VMmanager can manage not only one server,
|
|
||||||
but a large cluster of hypervisors. It delivers a number of
|
|
||||||
functions, such as live migration that allows for load
|
|
||||||
balancing between cluster nodes, monitoring CPU, memory.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="http://mist.io/">mist.io</a></dt>
|
|
||||||
<dd>
|
|
||||||
Mist.io is an open source project and a service that can assist you in
|
|
||||||
managing your virtual machines on a unified way, providing a simple
|
|
||||||
interface for all of your infrastructure (multiple public cloud
|
|
||||||
providers, OpenStack based public/private clouds, Docker servers, bare
|
|
||||||
metal servers and now KVM hypervisors).
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="mobile">Mobile applications</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="https://market.android.com/details?id=vm.manager">VM Manager</a></dt>
|
|
||||||
<dd>
|
|
||||||
VM Manager is VM (libvirt) manager (over SSH) application. VM Manager
|
|
||||||
is an application for libvirt VM / Domain management over SSH.
|
|
||||||
Please keep in mind that this software is under heavy development.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2><a name="other">Other</a></h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="http://cuckoosandbox.org/">Cuckoo Sandbox</a></dt>
|
|
||||||
<dd>
|
|
||||||
Cuckoo Sandbox is a malware analysis system. You can throw
|
|
||||||
any suspicious file at it and in a matter of seconds Cuckoo
|
|
||||||
will provide you back some detailed results outlining what
|
|
||||||
such file did when executed inside an isolated environment.
|
|
||||||
And libvirt is one of the backends that can be used for the
|
|
||||||
isolated environment.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Domain management architecture</h1>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
#FIG 3.2
|
|
||||||
Landscape
|
|
||||||
Center
|
|
||||||
Inches
|
|
||||||
Letter
|
|
||||||
100.00
|
|
||||||
Single
|
|
||||||
-2
|
|
||||||
1200 2
|
|
||||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
|
||||||
1050 7500 9375 7500 9375 8700 1050 8700 1050 7500
|
|
||||||
2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
|
|
||||||
3525 7275 3525 4125 1050 4125 1050 7275 3525 7275
|
|
||||||
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
|
|
||||||
1050 6540 3540 6525
|
|
||||||
2 4 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5
|
|
||||||
1590 6900 1590 6645 1140 6645 1140 6900 1590 6900
|
|
||||||
2 4 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5
|
|
||||||
1590 7185 1590 6930 1140 6930 1140 7185 1590 7185
|
|
||||||
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 1 1 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
1875 7725 8625 7725
|
|
||||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
|
||||||
1650 5625 3000 5625 3000 6375 1650 6375 1650 5625
|
|
||||||
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
2850 7725 2850 6375
|
|
||||||
2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
|
|
||||||
6450 7275 6450 4125 3975 4125 3975 7275 6450 7275
|
|
||||||
2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
|
|
||||||
9300 7275 9300 4125 6825 4125 6825 7275 9300 7275
|
|
||||||
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
|
|
||||||
3975 6540 6465 6525
|
|
||||||
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
|
|
||||||
6825 6540 9315 6525
|
|
||||||
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
5400 7725 5400 7050
|
|
||||||
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
8025 7725 8025 7050
|
|
||||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
|
||||||
1050 8925 9375 8925 9375 9900 1050 9900 1050 8925
|
|
||||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
|
||||||
2100 4575 3450 4575 3450 5325 2100 5325 2100 4575
|
|
||||||
2 1 1 3 0 7 50 -1 -1 2.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
3225 5325 3225 8325
|
|
||||||
2 1 1 3 0 7 50 -1 -1 2.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
6225 6900 6225 8250
|
|
||||||
2 1 1 3 0 7 50 -1 -1 2.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
8925 6900 8925 8250
|
|
||||||
2 1 1 3 0 7 50 -1 -1 2.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
1725 7125 1725 8325
|
|
||||||
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 1 1 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
2850 5850 2850 5025
|
|
||||||
2 1 1 3 0 7 50 -1 -1 2.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
5175 8475 5175 9375
|
|
||||||
2 1 1 3 0 7 50 -1 -1 2.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
1350 7125 1350 9450
|
|
||||||
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 2.00 120.00 240.00
|
|
||||||
2325 7725 2325 7200
|
|
||||||
2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 1
|
|
||||||
900 3975
|
|
||||||
2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 1
|
|
||||||
9525 9975
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 870 4350 7980 XenBus\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 780 1680 6870 drivers\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 1050 1800 6075 XenStore\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 900 1875 7125 Kernel0\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 960 4875 6975 KernelU\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 960 7650 6975 KernelU\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 255 1740 4050 8400 Xen Hypervisor\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 585 2325 4950 Xend\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 690 1200 4725 Dom0\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 750 4875 5325 DomU\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 750 7650 5325 DomU\001
|
|
||||||
4 0 0 50 -1 0 18 0.0000 4 195 1080 3750 9450 Hardware\001
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -1,98 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1 >libvirt architecture</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Currently libvirt supports 2 kind of virtualization, and its
|
|
||||||
internal structure is based on a driver model which simplifies
|
|
||||||
adding new
|
|
||||||
engines:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="Xen">Xen support</a></h2>
|
|
||||||
|
|
||||||
<p>When running in a Xen environment, programs using libvirt have to execute
|
|
||||||
in "Domain 0", which is the primary Linux OS loaded on the machine. That OS
|
|
||||||
kernel provides most if not all of the actual drivers used by the set of
|
|
||||||
domains. It also runs the Xen Store, a database of information shared by the
|
|
||||||
hypervisor, the kernels, the drivers and the xen daemon. Xend. The xen daemon
|
|
||||||
supervise the control and execution of the sets of domains. The hypervisor,
|
|
||||||
drivers, kernels and daemons communicate though a shared system bus
|
|
||||||
implemented in the hypervisor. The figure below tries to provide a view of
|
|
||||||
this environment:</p>
|
|
||||||
<img src="architecture.gif" alt="The Xen architecture" />
|
|
||||||
<p>The library can be initialized in 2 ways depending on the level of
|
|
||||||
privilege of the embedding program. If it runs with root access,
|
|
||||||
virConnectOpen() can be used, it will use three different ways to connect to
|
|
||||||
the Xen infrastructure:</p>
|
|
||||||
<ul>
|
|
||||||
<li>a connection to the Xen Daemon though an HTTP RPC layer</li>
|
|
||||||
<li>a read/write connection to the Xen Store</li>
|
|
||||||
<li>use Xen Hypervisor calls</li>
|
|
||||||
<li>when used as non-root libvirt connect to a proxy daemon running
|
|
||||||
as root and providing read-only support</li>
|
|
||||||
</ul>
|
|
||||||
<p>The library will usually interact with the Xen daemon for any operation
|
|
||||||
changing the state of the system, but for performance and accuracy reasons
|
|
||||||
may talk directly to the hypervisor when gathering state information at
|
|
||||||
least when possible (i.e. when the running program using libvirt has root
|
|
||||||
privilege access).</p>
|
|
||||||
<p>If it runs without root access virConnectOpenReadOnly() should be used to
|
|
||||||
connect to initialize the library. It will then fork a libvirt_proxy
|
|
||||||
program running as root and providing read_only access to the API, this is
|
|
||||||
then only useful for reporting and monitoring.</p>
|
|
||||||
|
|
||||||
<h2><a name="QEmu">QEmu and KVM support</a></h2>
|
|
||||||
|
|
||||||
<p>The model for QEmu and KVM is completely similar, basically KVM is based
|
|
||||||
on QEmu for the process controlling a new domain, only small details differs
|
|
||||||
between the two. In both case the libvirt API is provided by a controlling
|
|
||||||
process forked by libvirt in the background and which launch and control the
|
|
||||||
QEmu or KVM process. That program called libvirt_qemud talks though a specific
|
|
||||||
protocol to the library, and connects to the console of the QEmu process in
|
|
||||||
order to control and report on its status. Libvirt tries to expose all the
|
|
||||||
emulations models of QEmu, the selection is done when creating the new
|
|
||||||
domain, by specifying the architecture and machine type targeted.</p>
|
|
||||||
<p>The code controlling the QEmu process is available in the
|
|
||||||
<code>qemud/</code> directory.</p>
|
|
||||||
|
|
||||||
<h2><a name="drivers">Driver based architecture</a></h2>
|
|
||||||
|
|
||||||
<p>As the previous section explains, libvirt can communicate using different
|
|
||||||
channels with the current hypervisor, and should also be able to use
|
|
||||||
different kind of hypervisor. To simplify the internal design, code, ease
|
|
||||||
maintenance and simplify the support of other virtualization engine the
|
|
||||||
internals have been structured as one core component, the libvirt.c module
|
|
||||||
acting as a front-end for the library API and a set of hypervisor drivers
|
|
||||||
defining a common set of routines. That way the Xen Daemon access, the Xen
|
|
||||||
Store one, the Hypervisor hypercall are all isolated in separate C modules
|
|
||||||
implementing at least a subset of the common operations defined by the
|
|
||||||
drivers present in driver.h:</p>
|
|
||||||
<ul>
|
|
||||||
<li>xend_internal: implements the driver functions though the Xen
|
|
||||||
Daemon</li>
|
|
||||||
<li>xs_internal: implements the subset of the driver available though the
|
|
||||||
Xen Store</li>
|
|
||||||
<li>xen_internal: provide the implementation of the functions possible via
|
|
||||||
direct hypervisor access</li>
|
|
||||||
<li>proxy_internal: provide read-only Xen access via a proxy, the proxy code
|
|
||||||
is in the <code>proxy/</code> directory.</li>
|
|
||||||
<li>xm_internal: provide support for Xen defined but not running
|
|
||||||
domains.</li>
|
|
||||||
<li>qemu_internal: implement the driver functions for QEmu and
|
|
||||||
KVM virtualization engines. It also uses a qemud/ specific daemon
|
|
||||||
which interacts with the QEmu process to implement libvirt API.</li>
|
|
||||||
<li>test: this is a test driver useful for regression tests of the
|
|
||||||
front-end part of libvirt.</li>
|
|
||||||
</ul>
|
|
||||||
<p>Note that a given driver may only implement a subset of those functions,
|
|
||||||
(for example saving a Xen domain state to disk and restoring it is only
|
|
||||||
possible though the Xen Daemon), in that case the driver entry points for
|
|
||||||
unsupported functions are initialized to NULL.</p>
|
|
||||||
<p></p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Network management architecture</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="architecture">Architecture illustration</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The diagrams below illustrate some of the network configurations
|
|
||||||
enabled by the libvirt networking APIs
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><strong>VLAN 1</strong>. This virtual network has connectivity
|
|
||||||
to <code>LAN 2</code> with traffic forwarded and NATed.
|
|
||||||
</li>
|
|
||||||
<li><strong>VLAN 2</strong>. This virtual network is completely
|
|
||||||
isolated from any physical LAN.
|
|
||||||
</li>
|
|
||||||
<li><strong>Guest A</strong>. The first network interface is bridged
|
|
||||||
to the physical <code>LAN 1</code>. The second interface is connected
|
|
||||||
to a virtual network <code>VLAN 1</code>.
|
|
||||||
</li>
|
|
||||||
<li><strong>Guest B</strong>. The first network interface is connected
|
|
||||||
to a virtual network <code>VLAN 1</code>, giving it limited NAT
|
|
||||||
based connectivity to LAN2. It has a second network interface
|
|
||||||
connected to <code>VLAN 2</code>. It acts a router allowing limited
|
|
||||||
traffic between the two VLANs, thus giving <code>Guest C</code>
|
|
||||||
connectivity to the physical <code>LAN 2</code>.
|
|
||||||
</li>
|
|
||||||
<li><strong>Guest C</strong>. The only network interface is connected
|
|
||||||
to a virtual network <code>VLAN 2</code>. It has no direct connectivity
|
|
||||||
to a physical LAN, relying on <code>Guest B</code> to route traffic
|
|
||||||
on its behalf.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3><a name="logical">Logical diagram</a></h3>
|
|
||||||
|
|
||||||
<p class="image">
|
|
||||||
<img src="libvirt-net-logical.png" alt="Logical network architecture"/>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a name="physical">Physical diagram</a></h3>
|
|
||||||
|
|
||||||
<p class="image">
|
|
||||||
<img src="libvirt-net-physical.png" alt="Physical network architecture"/>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Node device management architecture</h1>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Storage management architecture</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The storage management APIs are based around 2 core concepts
|
|
||||||
</p>
|
|
||||||
<ol>
|
|
||||||
<li>
|
|
||||||
<strong>Volume</strong> - a single storage volume which can
|
|
||||||
be assigned to a guest, or used for creating further pools. A
|
|
||||||
volume is either a block device, a raw file, or a special format
|
|
||||||
file.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>Pool</strong> - provides a means for taking a chunk
|
|
||||||
of storage and carving it up into volumes. A pool can be used to
|
|
||||||
manage things such as a physical disk, a NFS server, a iSCSI target,
|
|
||||||
a host adapter, an LVM group.
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
These two concepts are mapped through to two libvirt objects, a
|
|
||||||
<code>virStorageVolPtr</code> and a <code>virStoragePoolPtr</code>,
|
|
||||||
each with a collection of APIs for their management.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,356 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Audit log</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="intro">Introduction</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
A number of the libvirt virtualization drivers (QEMU/KVM and LXC) include
|
|
||||||
support for logging details of important operations to the host's audit
|
|
||||||
subsystem. This provides administrators / auditors with a canonical historical
|
|
||||||
record of changes to virtual machines' / containers' lifecycle states and
|
|
||||||
their configuration. On hosts which are running the Linux audit daemon,
|
|
||||||
the logs will usually end up in <code>/var/log/audit/audit.log</code>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="config">Configuration</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The libvirt audit integration is enabled by default on any host which has
|
|
||||||
the Linux audit subsystem active, and disabled otherwise. It is possible
|
|
||||||
to alter this behaviour in the <code>/etc/libvirt/libvirtd.conf</code>
|
|
||||||
configuration file, via the <code>audit_level</code> parameter
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><code>audit_level=0</code> - libvirt auditing is disabled regardless
|
|
||||||
of host audit subsystem enablement.</li>
|
|
||||||
<li><code>audit_level=1</code> - libvirt auditing is enabled if the host
|
|
||||||
audit subsystem is enabled, otherwise it is disabled. This is the
|
|
||||||
default behaviour.</li>
|
|
||||||
<li><code>audit_level=2</code> - libvirt auditing is enabled regardless
|
|
||||||
of host audit subsystem enablement. If the host audit subsystem is
|
|
||||||
disabled, then libvirtd will refuse to complete startup and exit with
|
|
||||||
an error.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In addition to have formal messages sent to the audit subsystem it is
|
|
||||||
possible to tell libvirt to inject messages into its own logging
|
|
||||||
layer. This will result in messages ending up in the systemd journal
|
|
||||||
or <code>/var/log/libvirt/libivrtd.log</code> on non-systemd hosts.
|
|
||||||
This is disabled by default, but can be requested by setting the
|
|
||||||
<code>audit_logging=1</code> configuration parameter in the same file
|
|
||||||
mentioned above.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="types">Message types</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Libvirt defines three core audit message types each of which will
|
|
||||||
be described below. There are a number of common fields that will
|
|
||||||
be reported for all message types.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>pid</code></dt>
|
|
||||||
<dd>Process ID of the libvirtd daemon generating the audit record.</dd>
|
|
||||||
<dt><code>uid</code></dt>
|
|
||||||
<dd>User ID of the libvirtd daemon process generating the audit record.</dd>
|
|
||||||
<dt><code>subj</code></dt>
|
|
||||||
<dd>Security context of the libvirtd daemon process generating the audit record.</dd>
|
|
||||||
<dt><code>msg</code></dt>
|
|
||||||
<dd>String containing a list of key=value pairs specific to the type of audit record being reported.</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Some fields in the <code>msg</code> string are common to audit records
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>virt</code></dt>
|
|
||||||
<dd>Type of virtualization driver used. One of <code>qemu</code> or <code>lxc</code></dd>
|
|
||||||
<dt><code>vm</code></dt>
|
|
||||||
<dd>Host driver unique name of the guest</dd>
|
|
||||||
<dt><code>uuid</code></dt>
|
|
||||||
<dd>Globally unique identifier for the guest</dd>
|
|
||||||
<dt><code>exe</code></dt>
|
|
||||||
<dd>Path of the libvirtd daemon</dd>
|
|
||||||
<dt><code>hostname</code></dt>
|
|
||||||
<dd>Currently unused</dd>
|
|
||||||
<dt><code>addr</code></dt>
|
|
||||||
<dd>Currently unused</dd>
|
|
||||||
<dt><code>terminal</code></dt>
|
|
||||||
<dd>Currently unused</dd>
|
|
||||||
<dt><code>res</code></dt>
|
|
||||||
<dd>Result of the action, either <code>success</code> or <code>failed</code></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h3><a name="typecontrol">VIRT_CONTROL</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Reports change in the lifecycle state of a virtual machine. The <code>msg</code>
|
|
||||||
field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>op</code></dt>
|
|
||||||
<dd>Type of operation performed. One of <code>start</code>, <code>stop</code> or <code>init</code></dd>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the operation to happen</dd>
|
|
||||||
<dt><code>vm-pid</code></dt>
|
|
||||||
<dd>ID of the primary/leading process associated with the guest</dd>
|
|
||||||
<dt><code>init-pid</code></dt>
|
|
||||||
<dd>ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd>
|
|
||||||
<dt><code>pid-ns</code></dt>
|
|
||||||
<dd>Namespace ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h3><a name="typemachine">VIRT_MACHINE_ID</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Reports the association of a security context with a guest. The <code>msg</code>
|
|
||||||
field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>model</code></dt>
|
|
||||||
<dd>The security driver type. One of <code>selinux</code> or <code>apparmor</code></dd>
|
|
||||||
<dt><code>vm-ctx</code></dt>
|
|
||||||
<dd>Security context for the guest process</dd>
|
|
||||||
<dt><code>img-ctx</code></dt>
|
|
||||||
<dd>Security context for the guest disk images and other assigned host resources</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h3><a name="typeresource">VIRT_RESOURCE</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Reports the usage of a host resource by a guest. The fields include will
|
|
||||||
vary according to the type of device being reported. When the guest is
|
|
||||||
initially booted records will be generated for all assigned resources.
|
|
||||||
If any changes are made to the running guest configuration, for example
|
|
||||||
hotplug devices, or adjust resources allocation, further records will
|
|
||||||
be generated.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcevcpu">Virtual CPU</a></h4>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>vcpu</code></dd>
|
|
||||||
<dt><code>old-vcpu</code></dt>
|
|
||||||
<dd>Original vCPU count, or 0</dd>
|
|
||||||
<dt><code>new-vcpu</code></dt>
|
|
||||||
<dd>Updated vCPU count</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
|
||||||
<h4><a name="typeresourcemem">Memory</a></h4>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>mem</code></dd>
|
|
||||||
<dt><code>old-mem</code></dt>
|
|
||||||
<dd>Original memory size in bytes, or 0</dd>
|
|
||||||
<dt><code>new-mem</code></dt>
|
|
||||||
<dd>Updated memory size in bytes</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcedisk">Disk</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>disk</code></dd>
|
|
||||||
<dt><code>old-disk</code></dt>
|
|
||||||
<dd>Original host file or device path acting as the disk backing file</dd>
|
|
||||||
<dt><code>new-disk</code></dt>
|
|
||||||
<dd>Updated host file or device path acting as the disk backing file</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcenic">Network interface</a></h4>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>net</code></dd>
|
|
||||||
<dt><code>old-net</code></dt>
|
|
||||||
<dd>Original MAC address of the guest network interface</dd>
|
|
||||||
<dt><code>new-net</code></dt>
|
|
||||||
<dd>Updated MAC address of the guest network interface</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If there is a host network interface associated with the guest NIC then
|
|
||||||
further records may be generated
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>net</code></dd>
|
|
||||||
<dt><code>net</code></dt>
|
|
||||||
<dd>MAC address of the host network interface</dd>
|
|
||||||
<dt><code>rdev</code></dt>
|
|
||||||
<dd>Name of the host network interface</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcefs">Filesystem</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>fs</code></dd>
|
|
||||||
<dt><code>old-fs</code></dt>
|
|
||||||
<dd>Original host directory, file or device path backing the filesystem </dd>
|
|
||||||
<dt><code>new-fs</code></dt>
|
|
||||||
<dd>Updated host directory, file or device path backing the filesystem</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcehost">Host device</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>hostdev</code> or <code>dev</code></dd>
|
|
||||||
<dt><code>dev</code></dt>
|
|
||||||
<dd>The unique bus identifier of the USB, PCI or SCSI device, if <code>resrc=dev</code></dd>
|
|
||||||
<dt><code>disk</code></dt>
|
|
||||||
<dd>The path of the block device assigned to the guest, if <code>resrc=hostdev</code></dd>
|
|
||||||
<dt><code>chardev</code></dt>
|
|
||||||
<dd>The path of the character device assigned to the guest, if <code>resrc=hostdev</code></dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcetpm">TPM</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>tpm</code></dd>
|
|
||||||
<dt><code>device</code></dt>
|
|
||||||
<dd>The path of the host TPM device assigned to the guest</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcerng">RNG</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>rng</code></dd>
|
|
||||||
<dt><code>old-rng</code></dt>
|
|
||||||
<dd>Original path of the host entropy source for the RNG</dd>
|
|
||||||
<dt><code>new-rng</code></dt>
|
|
||||||
<dd>Updated path of the host entropy source for the RNG</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcechardev">console/serial/parallel/channel</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>chardev</code></dd>
|
|
||||||
<dt><code>old-chardev</code></dt>
|
|
||||||
<dd>Original path of the backing character device for given emulated device</dd>
|
|
||||||
<dt><code>new-chardev</code></dt>
|
|
||||||
<dd>Updated path of the backing character device for given emulated device</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcesmartcard">smartcard</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>smartcard</code></dd>
|
|
||||||
<dt><code>old-smartcard</code></dt>
|
|
||||||
<dd>Original path of the backing character device, certificate store or
|
|
||||||
"nss-smartcard-device" for host smartcard passthrough.
|
|
||||||
</dd>
|
|
||||||
<dt><code>new-smartcard</code></dt>
|
|
||||||
<dd>Updated path of the backing character device, certificate store or
|
|
||||||
"nss-smartcard-device" for host smartcard passthrough.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourceredir">Redirected device</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>redir</code></dd>
|
|
||||||
<dt><code>bus</code></dt>
|
|
||||||
<dd>The bus type, only <code>usb</code> allowed</dd>
|
|
||||||
<dt><code>device</code></dt>
|
|
||||||
<dd>The device type, only <code>USB redir</code> allowed</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h4><a name="typeresourcecgroup">Control group</a></h4>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>cgroup</code></dd>
|
|
||||||
<dt><code>cgroup</code></dt>
|
|
||||||
<dd>The name of the cgroup controller</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,306 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Connection authentication</h1>
|
|
||||||
<p>
|
|
||||||
When connecting to libvirt, some connections may require client
|
|
||||||
authentication before allowing use of the APIs. The set of possible
|
|
||||||
authentication mechanisms is administrator controlled, independent
|
|
||||||
of applications using libvirt. Once authenticated, libvirt can apply
|
|
||||||
fine grained <a href="acl.html">access control</a> to the operations
|
|
||||||
performed by a client.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="Auth_client_config">Client configuration</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
When connecting to a remote hypervisor which requires authentication,
|
|
||||||
most libvirt applications will prompt the user for the credentials. It is
|
|
||||||
also possible to provide a client configuration file containing all the
|
|
||||||
authentication credentials, avoiding any interaction. Libvirt will look
|
|
||||||
for the authentication file using the following sequence:
|
|
||||||
</p>
|
|
||||||
<ol>
|
|
||||||
<li>The file path specified by the $LIBVIRT_AUTH_FILE environment
|
|
||||||
variable.</li>
|
|
||||||
<li>The file path specified by the "authfile=/some/file" URI
|
|
||||||
query parameter</li>
|
|
||||||
<li>The file $XDG_CONFIG_HOME/libvirt/auth.conf</li>
|
|
||||||
<li>The file /etc/libvirt/auth.conf</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The auth configuration file uses the traditional <code>".ini"</code>
|
|
||||||
style syntax. There are two types of groups that can be present in
|
|
||||||
the config. First there are one or more <strong>credential</strong>
|
|
||||||
sets, which provide the actual authentication credentials. The keys
|
|
||||||
within the group may be:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><code>username</code>: the user login name to act as. This
|
|
||||||
is relevant for ESX, Xen, HyperV and SSH, but probably not
|
|
||||||
the one you want to libvirtd with SASL.</li>
|
|
||||||
<li><code>authname</code>: the name to authorize as. This is
|
|
||||||
what is commonly required for libvirtd with SASL.</li>
|
|
||||||
<li><code>password</code>: the secret password</li>
|
|
||||||
<li><code>realm</code>: the domain realm for SASL, mostly
|
|
||||||
unused</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Each set of credentials has a name, which is part of the group
|
|
||||||
entry name. Overall the syntax is
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
[credentials-$NAME]
|
|
||||||
credname1=value1
|
|
||||||
credname2=value2</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For example, to define two sets of credentials used for production
|
|
||||||
and test machines, using libvirtd, and a further ESX server for dev:
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
[credentials-test]
|
|
||||||
authname=fred
|
|
||||||
password=123456
|
|
||||||
|
|
||||||
[credentials-prod]
|
|
||||||
authname=bar
|
|
||||||
password=letmein
|
|
||||||
|
|
||||||
[credentials-dev]
|
|
||||||
username=joe
|
|
||||||
password=hello
|
|
||||||
|
|
||||||
[credentials-defgrp]
|
|
||||||
username=defuser
|
|
||||||
password=defpw</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The second set of groups provide mappings of credentials to
|
|
||||||
specific machine services. The config file group names compromise
|
|
||||||
the service type and host:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
[auth-$SERVICE-$HOSTNAME]
|
|
||||||
credentials=$CREDENTIALS</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For example, following the previous example, here is how to
|
|
||||||
map some machines. For convenience libvirt supports a default
|
|
||||||
mapping of credentials to machines:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
[auth-libvirt-test1.example.com]
|
|
||||||
credentials=test
|
|
||||||
|
|
||||||
[auth-libvirt-test2.example.com]
|
|
||||||
credentials=test
|
|
||||||
|
|
||||||
[auth-libvirt-demo3.example.com]
|
|
||||||
credentials=test
|
|
||||||
|
|
||||||
[auth-libvirt-prod1.example.com]
|
|
||||||
credentials=prod
|
|
||||||
|
|
||||||
[auth-libvirt-default]
|
|
||||||
credentials=defgrp
|
|
||||||
|
|
||||||
[auth-esx-dev1.example.com]
|
|
||||||
credentials=dev
|
|
||||||
|
|
||||||
[auth-esx-default]
|
|
||||||
credentials=defgrp</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The following service types are known to libvirt
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li><code>libvirt</code> - used for connections to a libvirtd
|
|
||||||
server, which is configured with SASL auth</li>
|
|
||||||
<li><code>ssh</code> - used for connections to a Phyp server
|
|
||||||
over SSH</li>
|
|
||||||
<li><code>esx</code> - used for connections to an ESX or
|
|
||||||
VirtualCenter server</li>
|
|
||||||
<li><code>xen</code> - used for connections to a Xen Enterprise
|
|
||||||
sever using XenAPI</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Applications using libvirt are free to use this same configuration
|
|
||||||
file for storing other credentials. For example, it can be used
|
|
||||||
to storage VNC or SPICE login credentials
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="ACL_server_config">Server configuration</a></h2>
|
|
||||||
<p>
|
|
||||||
The libvirt daemon allows the administrator to choose the authentication
|
|
||||||
mechanisms used for client connections on each network socket independently.
|
|
||||||
This is primarily controlled via the libvirt daemon master config file in
|
|
||||||
<code>/etc/libvirt/libvirtd.conf</code>. Each of the libvirt sockets can
|
|
||||||
have its authentication mechanism configured independently. There is
|
|
||||||
currently a choice of <code>none</code>, <code>polkit</code>, and <code>sasl</code>.
|
|
||||||
The SASL scheme can be further configured to choose between a large
|
|
||||||
number of different mechanisms.
|
|
||||||
</p>
|
|
||||||
<h2><a name="ACL_server_unix_perms">UNIX socket permissions/group</a></h2>
|
|
||||||
<p>
|
|
||||||
If libvirt does not contain support for PolicyKit, then access control for
|
|
||||||
the UNIX domain socket is done using traditional file user/group ownership
|
|
||||||
and permissions. There are 2 sockets, one for full read-write access, the
|
|
||||||
other for read-only access. The RW socket will be restricted (mode 0700) to
|
|
||||||
only allow the <code>root</code> user to connect. The read-only socket will
|
|
||||||
be open access (mode 0777) to allow any user to connect.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
To allow non-root users greater access, the <code>libvirtd.conf</code> file
|
|
||||||
can be edited to change the permissions via the <code>unix_sock_rw_perms</code>,
|
|
||||||
config parameter and to set a user group via the <code>unix_sock_group</code>
|
|
||||||
parameter. For example, setting the former to mode <code>0770</code> and the
|
|
||||||
latter <code>wheel</code> would let any user in the wheel group connect to
|
|
||||||
the libvirt daemon.
|
|
||||||
</p>
|
|
||||||
<h2><a name="ACL_server_polkit">UNIX socket PolicyKit auth</a></h2>
|
|
||||||
<p>
|
|
||||||
If libvirt contains support for PolicyKit, then access control options are
|
|
||||||
more advanced. The <code>unix_sock_auth</code> parameter will default to
|
|
||||||
<code>polkit</code>, and the file permissions will default to <code>0777</code>
|
|
||||||
even on the RW socket. Upon connecting to the socket, the client application
|
|
||||||
will be required to identify itself with PolicyKit. The default policy for the
|
|
||||||
RW daemon socket will require any application running in the current desktop
|
|
||||||
session to authenticate using the user's password. This is akin to <code>sudo</code>
|
|
||||||
auth, but does not require that the client application ultimately run as root.
|
|
||||||
Default policy will still allow any application to connect to the RO socket.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The default policy can be overridden by creating a new policy file in the
|
|
||||||
local override directory <code>/etc/polkit-1/localauthority/50-local.d/</code>.
|
|
||||||
Policy files should have a unique name ending with .pkla. Using reverse DNS
|
|
||||||
naming works well. Information on the options available can be found by
|
|
||||||
reading the pklocalauthority man page. The two libvirt daemon actions
|
|
||||||
available are named <code>org.libvirt.unix.manage</code> for full management
|
|
||||||
access, and <code>org.libvirt.unix.monitor</code> for read-only access.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
As an example, this gives the user <code>fred</code> full management access:
|
|
||||||
</p>
|
|
||||||
<pre>[Allow fred libvirt management permissions]
|
|
||||||
Identity=unix-user:fred
|
|
||||||
Action=org.libvirt.unix.manage
|
|
||||||
ResultAny=yes
|
|
||||||
ResultInactive=yes
|
|
||||||
ResultActive=yes</pre>
|
|
||||||
<p>
|
|
||||||
Further examples of PolicyKit setup can be found on the
|
|
||||||
<a href="http://wiki.libvirt.org/page/SSHPolicyKitSetup">wiki page</a>.
|
|
||||||
</p>
|
|
||||||
<h2><a name="ACL_server_username">Username/password auth</a></h2>
|
|
||||||
<p>
|
|
||||||
The plain TCP socket of the libvirt daemon defaults to using SASL for authentication.
|
|
||||||
The SASL mechanism configured by default is DIGEST-MD5, which provides a basic
|
|
||||||
username+password style authentication. It also provides for encryption of the data
|
|
||||||
stream, so the security of the plain TCP socket is on a par with that of the TLS
|
|
||||||
socket. If desired the UNIX socket and TLS socket can also have SASL enabled by
|
|
||||||
setting the <code>auth_unix_ro</code>, <code>auth_unix_rw</code>, <code>auth_tls</code>
|
|
||||||
config params in <code>libvirt.conf</code>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Out of the box, no user accounts are defined, so no clients will be able to authenticate
|
|
||||||
on the TCP socket. Adding users and setting their passwords is done with the <code>saslpasswd2</code>
|
|
||||||
command. When running this command it is important to tell it that the appname is <code>libvirt</code>.
|
|
||||||
As an example, to add a user <code>fred</code>, run
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
# saslpasswd2 -a libvirt fred
|
|
||||||
Password: xxxxxx
|
|
||||||
Again (for verification): xxxxxx
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
To see a list of all accounts the <code>sasldblistusers2</code> command can be used.
|
|
||||||
This command expects to be given the path to the libvirt user database, which is kept
|
|
||||||
in <code>/etc/libvirt/passwd.db</code>
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
# sasldblistusers2 -f /etc/libvirt/passwd.db
|
|
||||||
fred@t60wlan.home.berrange.com: userPassword
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
Finally, to disable a user's access, the <code>saslpasswd2</code> command can be used
|
|
||||||
again:
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
# saslpasswd2 -a libvirt -d fred
|
|
||||||
</pre>
|
|
||||||
<h2><a name="ACL_server_kerberos">Kerberos auth</a></h2>
|
|
||||||
<p>
|
|
||||||
The plain TCP socket of the libvirt daemon defaults to using SASL for authentication.
|
|
||||||
The SASL mechanism configured by default is DIGEST-MD5, which provides a basic
|
|
||||||
username+password style authentication. To enable Kerberos single-sign-on instead,
|
|
||||||
the libvirt SASL configuration file must be changed. This is <code>/etc/sasl2/libvirt.conf</code>.
|
|
||||||
The <code>mech_list</code> parameter must first be changed to <code>gssapi</code>
|
|
||||||
instead of the default <code>digest-md5</code>, and keytab should be set to
|
|
||||||
<code>/etc/libvirt/krb5.tab</code> . If SASL is enabled on the UNIX
|
|
||||||
and/or TLS sockets, Kerberos will also be used for them. Like DIGEST-MD5, the Kerberos
|
|
||||||
mechanism provides data encryption of the session.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Some operating systems do not install the SASL kerberos plugin by default. It
|
|
||||||
may be necessary to install a sub-package such as <code>cyrus-sasl-gssapi</code>.
|
|
||||||
To check whether the Kerberos plugin is installed run the <code>pluginviewer</code>
|
|
||||||
program and verify that <code>gssapi</code> is listed,eg:
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
# pluginviewer
|
|
||||||
...snip...
|
|
||||||
Plugin "gssapiv2" [loaded], API version: 4
|
|
||||||
SASL mechanism: GSSAPI, best SSF: 56
|
|
||||||
security flags: NO_ANONYMOUS|NO_PLAINTEXT|NO_ACTIVE|PASS_CREDENTIALS|MUTUAL_AUTH
|
|
||||||
features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION|NEED_SERVER_FQDN
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
Next it is necessary for the administrator of the Kerberos realm to
|
|
||||||
issue a principal for the libvirt server. There needs to be one
|
|
||||||
principal per host running the libvirt daemon. The principal should be
|
|
||||||
named <code>libvirt/full.hostname@KERBEROS.REALM</code>. This is
|
|
||||||
typically done by running the <code>kadmin.local</code> command on the
|
|
||||||
Kerberos server, though some Kerberos servers have alternate ways of
|
|
||||||
setting up service principals. Once created, the principal should be
|
|
||||||
exported to a keytab, copied to the host running the libvirt daemon
|
|
||||||
and placed in <code>/etc/libvirt/krb5.tab</code>
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
# kadmin.local
|
|
||||||
kadmin.local: add_principal libvirt/foo.example.com
|
|
||||||
Enter password for principal "libvirt/foo.example.com@EXAMPLE.COM":
|
|
||||||
Re-enter password for principal "libvirt/foo.example.com@EXAMPLE.COM":
|
|
||||||
Principal "libvirt/foo.example.com@EXAMPLE.COM" created.
|
|
||||||
|
|
||||||
kadmin.local: ktadd -k /root/libvirt-foo-example.tab libvirt/foo.example.com@EXAMPLE.COM
|
|
||||||
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/root/libvirt-foo-example.tab.
|
|
||||||
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/root/libvirt-foo-example.tab.
|
|
||||||
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type DES with HMAC/sha1 added to keytab WRFILE:/root/libvirt-foo-example.tab.
|
|
||||||
Entry for principal libvirt/foo.example.com@EXAMPLE.COM with kvno 4, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/root/libvirt-foo-example.tab.
|
|
||||||
|
|
||||||
kadmin.local: quit
|
|
||||||
|
|
||||||
# scp /root/libvirt-foo-example.tab root@foo.example.com:/etc/libvirt/krb5.tab
|
|
||||||
# rm /root/libvirt-foo-example.tab
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
Any client application wishing to connect to a Kerberos enabled libvirt server
|
|
||||||
merely needs to run <code>kinit</code> to gain a user principal. This may well
|
|
||||||
be done automatically when a user logs into a desktop session, if PAM is setup
|
|
||||||
to authenticate against Kerberos.
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1 >Bindings for other languages</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Libvirt supports C and C++ directly, and has bindings available
|
|
||||||
for other languages:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<strong>C#</strong>: Arnaud Champion develops
|
|
||||||
<a href="csharp.html">C# bindings</a>.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>Java</strong>: Daniel Veillard develops
|
|
||||||
<a href="java.html">Java bindings</a>.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>OCaml</strong>: Richard Jones develops
|
|
||||||
<a href="http://libvirt.org/ocaml/">OCaml bindings</a>.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>Perl</strong>: Daniel Berrange develops
|
|
||||||
<a href="http://search.cpan.org/dist/Sys-Virt/">Perl bindings</a>.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>
|
|
||||||
<strong>PHP</strong>: Radek Hladik started developing
|
|
||||||
<a href="http://libvirt.org/php">PHP bindings</a> in 2010.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
In February 2011 the binding development has been moved to the libvirt.org website as
|
|
||||||
libvirt-php project.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The project is now maintained by Michal Novotny and it's heavily based
|
|
||||||
on Radek's version. For more information, including
|
|
||||||
information on posting patches to libvirt-php, please refer
|
|
||||||
to the <a href="http://libvirt.org/php">PHP bindings</a> site.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>
|
|
||||||
<strong>Python</strong>: Libvirt's python bindings are split to a
|
|
||||||
separate <a href="http://libvirt.org/git/?p=libvirt-python.git">package</a>
|
|
||||||
since version 1.2.0, older versions came with direct support for the
|
|
||||||
Python language.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
If your libvirt is installed as packages, rather than compiled
|
|
||||||
by you from source code, ensure you have the appropriate
|
|
||||||
package installed.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
This is named <b>libvirt-python</b> on RHEL/Fedora,
|
|
||||||
<a href="http://packages.ubuntu.com/search?keywords=python-libvirt"><b>python-libvirt</b></a>
|
|
||||||
on Ubuntu, and may be named differently on others.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
For usage information, see the
|
|
||||||
<a href="python.html">Python API bindings</a> page.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>Ruby</strong>: Chris Lalancette develops
|
|
||||||
<a href="http://libvirt.org/ruby/">Ruby bindings</a>.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For information on using libvirt on <strong>Windows</strong>
|
|
||||||
<a href="windows.html">please see the Windows support page</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Support, requests or help for libvirt bindings are welcome on the
|
|
||||||
<a href="https://www.redhat.com/mailman/listinfo/libvir-list/">mailing list</a>,
|
|
||||||
as usual try to provide enough background information and make sure
|
|
||||||
you use recent version, see the <a href="bugs.html">help page</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1>Bug reporting</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="security">Security Issues</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If you think that an issue with libvirt may have security
|
|
||||||
implications, <strong>please do not</strong> publicly
|
|
||||||
report it in the bug tracker, mailing lists, or irc. Libvirt
|
|
||||||
has <a href="securityprocess.html">a dedicated process for handling (potential) security issues</a>
|
|
||||||
that should be used instead. So if your issue has security
|
|
||||||
implications, ignore the rest of this page and follow the
|
|
||||||
<a href="securityprocess.html">security process</a> instead.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="bugzilla">Bug Tracking</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If you are using libvirt binaries from a Linux distribution
|
|
||||||
check below for distribution specific bug reporting policies
|
|
||||||
first.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="general">General libvirt bug reports</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <a href="http://bugzilla.redhat.com">Red Hat Bugzilla Server</a>
|
|
||||||
should be used to report bugs and request features in libvirt.
|
|
||||||
Before submitting a ticket, check the existing tickets to see if
|
|
||||||
the bug/feature is already tracked.
|
|
||||||
|
|
||||||
For general libvirt bug reports, from self-built releases, GIT snapshots
|
|
||||||
and any other non-distribution supported builds, enter tickets under
|
|
||||||
the <code>Virtualization Tools</code> product and the <code>libvirt</code>
|
|
||||||
component.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
It's always a good idea to file bug reports, as the process of
|
|
||||||
filing the report always makes it easier to describe the
|
|
||||||
problem, and the bug number provides a quick way of referring to
|
|
||||||
the problem. However, not everybody in the community pays
|
|
||||||
attention to bugzilla, so after you file a bug, asking questions
|
|
||||||
and submitting patches on <a href="contact.html">the libvirt
|
|
||||||
mailing lists</a> will increase your bug's visibility and
|
|
||||||
encourage people to think about your problem. Don't hesitate to
|
|
||||||
ask questions on the list, as others may know of existing
|
|
||||||
solutions or be interested in collaborating with you on finding
|
|
||||||
a solution. Patches are always appreciated, and it's likely
|
|
||||||
that someone else has the same problem you do!
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
If you decide to write code, though, before you begin please
|
|
||||||
read the <a href="hacking.html">contributor guidelines</a>,
|
|
||||||
especially the first point: "Discuss any large changes on the
|
|
||||||
mailing list first. Post patches early and listen to feedback."
|
|
||||||
Few development experiences are more discouraging than spending
|
|
||||||
a bunch of time writing a patch only to have someone point out a
|
|
||||||
better approach on list.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="http://bugzilla.redhat.com/buglist.cgi?component=libvirt&product=Virtualization%20Tools">View libvirt tickets</a></li>
|
|
||||||
<li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Virtualization%20Tools&component=libvirt">New libvirt ticket</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2><a name="distribution">Linux Distribution specific bug reports</a></h2>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
If you are using binaries from <strong>Fedora</strong>, enter
|
|
||||||
tickets against the <code>Fedora</code> product and
|
|
||||||
the <code>libvirt</code> component.
|
|
||||||
<ul>
|
|
||||||
<li><a href="http://bugzilla.redhat.com/buglist.cgi?component=libvirt&product=Fedora">View Fedora libvirt tickets</a></li>
|
|
||||||
<li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Fedora&component=libvirt">New Fedora libvirt ticket</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>
|
|
||||||
If you are using binaries from <strong>Red Hat Enterprise
|
|
||||||
Linux</strong>, enter tickets against the Red Hat Enterprise
|
|
||||||
Linux product that you're using (e.g., Red Hat Enterprise
|
|
||||||
Linux 6) and the <code>libvirt</code> component. Red Hat
|
|
||||||
bugzilla has <a href="http://bugzilla.redhat.com">additional guidance</a> about getting support if
|
|
||||||
you are a Red Hat customer.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>
|
|
||||||
If you are using binaries from another Linux distribution
|
|
||||||
first follow their own bug reporting guidelines.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>
|
|
||||||
Finally, if you are a contributor to another Linux
|
|
||||||
distribution and would like to have your procedure for
|
|
||||||
filing bugs mentioned here, please mail the libvirt
|
|
||||||
development list.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
|
||||||
<h2><a name="quality">How to file high quality bug reports</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To increase the likelihood of your bug report being addressed it is
|
|
||||||
important to provide as much information as possible. When filing
|
|
||||||
libvirt bugs use this checklist to see if you are providing enough
|
|
||||||
information:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>The version number of the libvirt build, or SHA1 of the GIT
|
|
||||||
commit</li>
|
|
||||||
<li>The hardware architecture being used</li>
|
|
||||||
<li>The name of the hypervisor (Xen, QEMU, KVM)</li>
|
|
||||||
<li>The XML config of the guest domain if relevant</li>
|
|
||||||
<li>For Xen hypervisor, the XenD logfile from /var/log/xen</li>
|
|
||||||
<li>For QEMU/KVM, the domain logfile from /var/log/libvirt/qemu</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If the bug leads to a tool linked to libvirt crash, then the best
|
|
||||||
is to provide a backtrace along with the scenario used to get the
|
|
||||||
crash, the simplest is to run the program under gdb, reproduce the
|
|
||||||
steps leading to the crash and then issue a gdb "bt -a" command to
|
|
||||||
get the stack trace, attach it to the bug. Note that for the
|
|
||||||
data to be really useful libvirt debug information must be present
|
|
||||||
for example by installing libvirt debuginfo package on Fedora or
|
|
||||||
Red Hat Enterprise Linux (with debuginfo-install libvirt) prior
|
|
||||||
to running gdb.</p>
|
|
||||||
<p>
|
|
||||||
It may also happen that the libvirt daemon itself crashes or gets stuck,
|
|
||||||
in the first case run it (as root) under gdb, and reproduce the sequence
|
|
||||||
leading to the crash, similarly to a normal program provide the
|
|
||||||
"bt" backtrace information to where gdb will have stopped.<br/>
|
|
||||||
But if libvirtd gets stuck, for example seems to stop processing
|
|
||||||
commands, try to attach to the faulty daemon and issue a gdb command
|
|
||||||
"thread apply all bt" to show all the threads backtraces, as in:</p>
|
|
||||||
<pre> # ps -o etime,pid `pgrep libvirt`
|
|
||||||
... note the process id from the output
|
|
||||||
# gdb /usr/sbin/libvirtd
|
|
||||||
.... some information about gdb and loading debug data
|
|
||||||
(gdb) attach $the_daemon_process_id
|
|
||||||
....
|
|
||||||
(gdb) thread apply all bt
|
|
||||||
.... information to attach to the bug
|
|
||||||
(gdb)
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,417 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Control Groups Resource Management</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The QEMU and LXC drivers make use of the Linux "Control Groups" facility
|
|
||||||
for applying resource management to their virtual machines and containers.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="requiredControllers">Required controllers</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The control groups filesystem supports multiple "controllers". By default
|
|
||||||
the init system (such as systemd) should mount all controllers compiled
|
|
||||||
into the kernel at <code>/sys/fs/cgroup/$CONTROLLER-NAME</code>. Libvirt
|
|
||||||
will never attempt to mount any controllers itself, merely detect where
|
|
||||||
they are mounted.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The QEMU driver is capable of using the <code>cpuset</code>,
|
|
||||||
<code>cpu</code>, <code>memory</code>, <code>blkio</code> and
|
|
||||||
<code>devices</code> controllers. None of them are compulsory.
|
|
||||||
If any controller is not mounted, the resource management APIs
|
|
||||||
which use it will cease to operate. It is possible to explicitly
|
|
||||||
turn off use of a controller, even when mounted, via the
|
|
||||||
<code>/etc/libvirt/qemu.conf</code> configuration file.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The LXC driver is capable of using the <code>cpuset</code>,
|
|
||||||
<code>cpu</code>, <code>cpuacct</code>, <code>freezer</code>,
|
|
||||||
<code>memory</code>, <code>blkio</code> and <code>devices</code>
|
|
||||||
controllers. The <code>cpuacct</code>, <code>devices</code>
|
|
||||||
and <code>memory</code> controllers are compulsory. Without
|
|
||||||
them mounted, no containers can be started. If any of the
|
|
||||||
other controllers are not mounted, the resource management APIs
|
|
||||||
which use them will cease to operate.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="currentLayout">Current cgroups layout</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
As of libvirt 1.0.5 or later, the cgroups layout created by libvirt has been
|
|
||||||
simplified, in order to facilitate the setup of resource control policies by
|
|
||||||
administrators / management applications. The new layout is based on the concepts
|
|
||||||
of "partitions" and "consumers". A "consumer" is a cgroup which holds the
|
|
||||||
processes for a single virtual machine or container. A "partition" is a cgroup
|
|
||||||
which does not contain any processes, but can have resource controls applied.
|
|
||||||
A "partition" will have zero or more child directories which may be either
|
|
||||||
"consumer" or "partition".
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
As of libvirt 1.1.1 or later, the cgroups layout will have some slight
|
|
||||||
differences when running on a host with systemd 205 or later. The overall
|
|
||||||
tree structure is the same, but there are some differences in the naming
|
|
||||||
conventions for the cgroup directories. Thus the following docs split
|
|
||||||
in two, one describing systemd hosts and the other non-systemd hosts.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a name="currentLayoutSystemd">Systemd cgroups integration</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
On hosts which use systemd, each consumer maps to a systemd scope unit,
|
|
||||||
while partitions map to a system slice unit.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4><a name="systemdScope">Systemd scope naming</a></h4>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The systemd convention is for the scope name of virtual machines / containers
|
|
||||||
to be of the general format <code>machine-$NAME.scope</code>. Libvirt forms the
|
|
||||||
<code>$NAME</code> part of this by concatenating the driver type with the name
|
|
||||||
of the guest, and then escaping any systemd reserved characters.
|
|
||||||
So for a guest <code>demo</code> running under the <code>lxc</code> driver,
|
|
||||||
we get a <code>$NAME</code> of <code>lxc-demo</code> which when escaped is
|
|
||||||
<code>lxc\x2ddemo</code>. So the complete scope name is <code>machine-lxc\x2ddemo.scope</code>.
|
|
||||||
The scope names map directly to the cgroup directory names.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4><a name="systemdSlice">Systemd slice naming</a></h4>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The systemd convention for slice naming is that a slice should include the
|
|
||||||
name of all of its parents prepended on its own name. So for a libvirt
|
|
||||||
partition <code>/machine/engineering/testing</code>, the slice name will
|
|
||||||
be <code>machine-engineering-testing.slice</code>. Again the slice names
|
|
||||||
map directly to the cgroup directory names. Systemd creates three top level
|
|
||||||
slices by default, <code>system.slice</code> <code>user.slice</code> and
|
|
||||||
<code>machine.slice</code>. All virtual machines or containers created
|
|
||||||
by libvirt will be associated with <code>machine.slice</code> by default.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4><a name="systemdLayout">Systemd cgroup layout</a></h4>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Given this, a possible systemd cgroups layout involving 3 qemu guests,
|
|
||||||
3 lxc containers and 3 custom child slices, would be:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ROOT
|
|
||||||
|
|
|
||||||
+- system.slice
|
|
||||||
| |
|
|
||||||
| +- libvirtd.service
|
|
||||||
|
|
|
||||||
+- machine.slice
|
|
||||||
|
|
|
||||||
+- machine-qemu\x2dvm1.scope
|
|
||||||
| |
|
|
||||||
| +- emulator
|
|
||||||
| +- vcpu0
|
|
||||||
| +- vcpu1
|
|
||||||
|
|
|
||||||
+- machine-qemu\x2dvm2.scope
|
|
||||||
| |
|
|
||||||
| +- emulator
|
|
||||||
| +- vcpu0
|
|
||||||
| +- vcpu1
|
|
||||||
|
|
|
||||||
+- machine-qemu\x2dvm3.scope
|
|
||||||
| |
|
|
||||||
| +- emulator
|
|
||||||
| +- vcpu0
|
|
||||||
| +- vcpu1
|
|
||||||
|
|
|
||||||
+- machine-engineering.slice
|
|
||||||
| |
|
|
||||||
| +- machine-engineering-testing.slice
|
|
||||||
| | |
|
|
||||||
| | +- machine-lxc\x2dcontainer1.scope
|
|
||||||
| |
|
|
||||||
| +- machine-engineering-production.slice
|
|
||||||
| |
|
|
||||||
| +- machine-lxc\x2dcontainer2.scope
|
|
||||||
|
|
|
||||||
+- machine-marketing.slice
|
|
||||||
|
|
|
||||||
+- machine-lxc\x2dcontainer3.scope
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h3><a name="currentLayoutGeneric">Non-systemd cgroups layout</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
On hosts which do not use systemd, each consumer has a corresponding cgroup
|
|
||||||
named <code>$VMNAME.libvirt-{qemu,lxc}</code>. Each consumer is associated
|
|
||||||
with exactly one partition, which also have a corresponding cgroup usually
|
|
||||||
named <code>$PARTNAME.partition</code>. The exceptions to this naming rule
|
|
||||||
are the three top level default partitions, named <code>/system</code> (for
|
|
||||||
system services), <code>/user</code> (for user login sessions) and
|
|
||||||
<code>/machine</code> (for virtual machines and containers). By default
|
|
||||||
every consumer will of course be associated with the <code>/machine</code>
|
|
||||||
partition.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Given this, a possible systemd cgroups layout involving 3 qemu guests,
|
|
||||||
3 lxc containers and 2 custom child slices, would be:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ROOT
|
|
||||||
|
|
|
||||||
+- system
|
|
||||||
| |
|
|
||||||
| +- libvirtd.service
|
|
||||||
|
|
|
||||||
+- machine
|
|
||||||
|
|
|
||||||
+- vm1.libvirt-qemu
|
|
||||||
| |
|
|
||||||
| +- emulator
|
|
||||||
| +- vcpu0
|
|
||||||
| +- vcpu1
|
|
||||||
|
|
|
||||||
+- vm2.libvirt-qemu
|
|
||||||
| |
|
|
||||||
| +- emulator
|
|
||||||
| +- vcpu0
|
|
||||||
| +- vcpu1
|
|
||||||
|
|
|
||||||
+- vm3.libvirt-qemu
|
|
||||||
| |
|
|
||||||
| +- emulator
|
|
||||||
| +- vcpu0
|
|
||||||
| +- vcpu1
|
|
||||||
|
|
|
||||||
+- engineering.partition
|
|
||||||
| |
|
|
||||||
| +- testing.partition
|
|
||||||
| | |
|
|
||||||
| | +- container1.libvirt-lxc
|
|
||||||
| |
|
|
||||||
| +- production.partition
|
|
||||||
| |
|
|
||||||
| +- container2.libvirt-lxc
|
|
||||||
|
|
|
||||||
+- marketing.partition
|
|
||||||
|
|
|
||||||
+- container3.libvirt-lxc
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2><a name="customPartiton">Using custom partitions</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If there is a need to apply resource constraints to groups of
|
|
||||||
virtual machines or containers, then the single default
|
|
||||||
partition <code>/machine</code> may not be sufficiently
|
|
||||||
flexible. The administrator may wish to sub-divide the
|
|
||||||
default partition, for example into "testing" and "production"
|
|
||||||
partitions, and then assign each guest to a specific
|
|
||||||
sub-partition. This is achieved via a small element addition
|
|
||||||
to the guest domain XML config, just below the main <code>domain</code>
|
|
||||||
element
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
...
|
|
||||||
<resource>
|
|
||||||
<partition>/machine/production</partition>
|
|
||||||
</resource>
|
|
||||||
...
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note that the partition names in the guest XML are using a
|
|
||||||
generic naming format, not the low level naming convention
|
|
||||||
required by the underlying host OS. That is, you should not include
|
|
||||||
any of the <code>.partition</code> or <code>.slice</code>
|
|
||||||
suffixes in the XML config. Given a partition name
|
|
||||||
<code>/machine/production</code>, libvirt will automatically
|
|
||||||
apply the platform specific translation required to get
|
|
||||||
<code>/machine/production.partition</code> (non-systemd)
|
|
||||||
or <code>/machine.slice/machine-production.slice</code>
|
|
||||||
(systemd) as the underlying cgroup name
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Libvirt will not auto-create the cgroups directory to back
|
|
||||||
this partition. In the future, libvirt / virsh will provide
|
|
||||||
APIs / commands to create custom partitions, but currently
|
|
||||||
this is left as an exercise for the administrator.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<strong>Note:</strong> the ability to place guests in custom
|
|
||||||
partitions is only available with libvirt >= 1.0.5, using
|
|
||||||
the new cgroup layout. The legacy cgroups layout described
|
|
||||||
later in this document did not support customization per guest.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a name="createSystemd">Creating custom partitions (systemd)</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Given the XML config above, the admin on a systemd based host would
|
|
||||||
need to create a unit file <code>/etc/systemd/system/machine-production.slice</code>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# cat > /etc/systemd/system/machine-testing.slice <<EOF
|
|
||||||
[Unit]
|
|
||||||
Description=VM testing slice
|
|
||||||
Before=slices.target
|
|
||||||
Wants=machine.slice
|
|
||||||
EOF
|
|
||||||
# systemctl start machine-testing.slice
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h3><a name="createNonSystemd">Creating custom partitions (non-systemd)</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Given the XML config above, the admin on a non-systemd based host
|
|
||||||
would need to create a cgroup named '/machine/production.partition'
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# cd /sys/fs/cgroup
|
|
||||||
# for i in blkio cpu,cpuacct cpuset devices freezer memory net_cls perf_event
|
|
||||||
do
|
|
||||||
mkdir $i/machine/production.partition
|
|
||||||
done
|
|
||||||
# for i in cpuset.cpus cpuset.mems
|
|
||||||
do
|
|
||||||
cat cpuset/machine/$i > cpuset/machine/production.partition/$i
|
|
||||||
done
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2><a name="resourceAPIs">Resource management APIs/commands</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Since libvirt aims to provide an API which is portable across
|
|
||||||
hypervisors, the concept of cgroups is not exposed directly
|
|
||||||
in the API or XML configuration. It is considered to be an
|
|
||||||
internal implementation detail. Instead libvirt provides a
|
|
||||||
set of APIs for applying resource controls, which are then
|
|
||||||
mapped to corresponding cgroup tunables
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>Scheduler tuning</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Parameters from the "cpu" controller are exposed via the
|
|
||||||
<code>schedinfo</code> command in virsh.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# virsh schedinfo demo
|
|
||||||
Scheduler : posix
|
|
||||||
cpu_shares : 1024
|
|
||||||
vcpu_period : 100000
|
|
||||||
vcpu_quota : -1
|
|
||||||
emulator_period: 100000
|
|
||||||
emulator_quota : -1</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Block I/O tuning</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Parameters from the "blkio" controller are exposed via the
|
|
||||||
<code>bkliotune</code> command in virsh.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# virsh blkiotune demo
|
|
||||||
weight : 500
|
|
||||||
device_weight : </pre>
|
|
||||||
|
|
||||||
<h3>Memory tuning</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Parameters from the "memory" controller are exposed via the
|
|
||||||
<code>memtune</code> command in virsh.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# virsh memtune demo
|
|
||||||
hard_limit : 580192
|
|
||||||
soft_limit : unlimited
|
|
||||||
swap_hard_limit: unlimited
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h3>Network tuning</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <code>net_cls</code> is not currently used. Instead traffic
|
|
||||||
filter policies are set directly against individual virtual
|
|
||||||
network interfaces.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="legacyLayout">Legacy cgroups layout</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Prior to libvirt 1.0.5, the cgroups layout created by libvirt was different
|
|
||||||
from that described above, and did not allow for administrator customization.
|
|
||||||
Libvirt used a fixed, 3-level hierarchy <code>libvirt/{qemu,lxc}/$VMNAME</code>
|
|
||||||
which was rooted at the point in the hierarchy where libvirtd itself was
|
|
||||||
located. So if libvirtd was placed at <code>/system/libvirtd.service</code>
|
|
||||||
by systemd, the groups for each virtual machine / container would be located
|
|
||||||
at <code>/system/libvirtd.service/libvirt/{qemu,lxc}/$VMNAME</code>. In addition
|
|
||||||
to this, the QEMU drivers further child groups for each vCPU thread and the
|
|
||||||
emulator thread(s). This leads to a hierarchy that looked like
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ROOT
|
|
||||||
|
|
|
||||||
+- system
|
|
||||||
|
|
|
||||||
+- libvirtd.service
|
|
||||||
|
|
|
||||||
+- libvirt
|
|
||||||
|
|
|
||||||
+- qemu
|
|
||||||
| |
|
|
||||||
| +- vm1
|
|
||||||
| | |
|
|
||||||
| | +- emulator
|
|
||||||
| | +- vcpu0
|
|
||||||
| | +- vcpu1
|
|
||||||
| |
|
|
||||||
| +- vm2
|
|
||||||
| | |
|
|
||||||
| | +- emulator
|
|
||||||
| | +- vcpu0
|
|
||||||
| | +- vcpu1
|
|
||||||
| |
|
|
||||||
| +- vm3
|
|
||||||
| |
|
|
||||||
| +- emulator
|
|
||||||
| +- vcpu0
|
|
||||||
| +- vcpu1
|
|
||||||
|
|
|
||||||
+- lxc
|
|
||||||
|
|
|
||||||
+- container1
|
|
||||||
|
|
|
||||||
+- container2
|
|
||||||
|
|
|
||||||
+- container3
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Although current releases are much improved, historically the use of deep
|
|
||||||
hierarchies has had a significant negative impact on the kernel scalability.
|
|
||||||
The legacy libvirt cgroups layout highlighted these problems, to the detriment
|
|
||||||
of the performance of virtual machines and containers.
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1><a name="installation">libvirt Installation</a></h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="compiling">Compiling a release tarball</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
libvirt uses the standard configure/make/install steps:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ xz -c libvirt-x.x.x.tar.xz | tar xvf -
|
|
||||||
$ cd libvirt-x.x.x
|
|
||||||
$ ./configure</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <i>configure</i> script can be given options to change its default
|
|
||||||
behaviour.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To get the complete list of the options it can take, pass it the
|
|
||||||
<i>--help</i> option like this:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ ./configure <i>--help</i></pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
When you have determined which options you want to use (if any),
|
|
||||||
continue the process.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note the use of <b>sudo</b> with the <i>make install</i> command
|
|
||||||
below. Using sudo is only required when installing to a location your
|
|
||||||
user does not have write access to. Installing to a system location
|
|
||||||
is a good example of this.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If you are installing to a location that your user <i>does</i> have write
|
|
||||||
access to, then you can instead run the <i>make install</i> command
|
|
||||||
without putting <b>sudo</b> before it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ ./configure <i>[possible options]</i>
|
|
||||||
$ make
|
|
||||||
$ <b>sudo</b> <i>make install</i></pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
At this point you <b>may</b> have to run ldconfig or a similar utility
|
|
||||||
to update your list of installed shared libs.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="building">Building from a GIT checkout</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The libvirt build process uses GNU autotools, so after obtaining a
|
|
||||||
checkout it is necessary to generate the configure script and Makefile.in
|
|
||||||
templates using the <code>autogen.sh</code> command. By default when
|
|
||||||
the <code>configure</code> script is run from within a GIT checkout, it
|
|
||||||
will turn on -Werror for builds. This can be disabled with
|
|
||||||
--disable-werror, but this is not recommended.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Libvirt takes advantage of
|
|
||||||
the <a href="http://www.gnu.org/software/gnulib/">gnulib</a>
|
|
||||||
project to provide portability to a number of platforms. This
|
|
||||||
is normally done dynamically via a git submodule in
|
|
||||||
the <code>.gnulib</code> subdirectory, which is auto-updated as
|
|
||||||
needed when you do incremental builds. Setting the environment
|
|
||||||
variable <code>GNULIB_SRCDIR</code> to a local directory
|
|
||||||
containing a git checkout of gnulib will let you reduce local
|
|
||||||
disk space requirements and network download time, regardless of
|
|
||||||
which actual commit you have in that reference directory.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
However, if you are developing on a platform where git is not
|
|
||||||
available, or are behind a firewall that does not allow for git
|
|
||||||
to easily obtain the gnulib submodule, it is possible to instead
|
|
||||||
use a static mode of operation where you are then responsible
|
|
||||||
for updating the git submodule yourself. In this mode, you must
|
|
||||||
track the exact gnulib commit needed by libvirt (usually not the
|
|
||||||
latest gnulib.git) via alternative means, such as a shared NFS
|
|
||||||
drive or manual download, and run this any time libvirt.git
|
|
||||||
updates the commit stored in the .gnulib submodule:</p>
|
|
||||||
<pre>
|
|
||||||
$ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>To build & install libvirt to your home
|
|
||||||
directory the following commands can be run:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ ./autogen.sh --prefix=$HOME/usr
|
|
||||||
$ make
|
|
||||||
$ <b>sudo</b> make install</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Be aware though, that binaries built with a custom prefix will not
|
|
||||||
interoperate with OS vendor provided binaries, since the UNIX socket
|
|
||||||
paths will all be different. To produce a build that is compatible
|
|
||||||
with normal OS vendor prefixes, use
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ ./autogen.sh --system
|
|
||||||
$ make
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
When doing this for day-to-day development purposes, it is recommended
|
|
||||||
not to install over the OS vendor provided binaries. Instead simply
|
|
||||||
run libvirt directly from the source tree. For example to run
|
|
||||||
a privileged libvirtd instance
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ su -
|
|
||||||
# service libvirtd stop (or systemctl stop libvirtd.service)
|
|
||||||
# /home/to/your/checkout/daemon/libvirtd
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
It is also possible to run virsh directly from the source tree
|
|
||||||
using the ./run script (which sets some environment variables):
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ ./run ./tools/virsh ....
|
|
||||||
</pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Contacting the development team</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="security">Security Issues</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If you think that an issue with libvirt may have security
|
|
||||||
implications, <strong>please do not</strong> publicly
|
|
||||||
report it in the bug tracker, mailing lists, or irc. Libvirt
|
|
||||||
has <a href="securityprocess.html">a dedicated process for handling (potential) security issues</a>
|
|
||||||
that should be used instead. So if your issue has security
|
|
||||||
implications, ignore the rest of this page and follow the
|
|
||||||
<a href="securityprocess.html">security process</a> instead.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="email">Mailing lists</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
There are three mailing-lists:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="https://www.redhat.com/mailman/listinfo/libvir-list">libvir-list@redhat.com</a> (for development)</dt>
|
|
||||||
<dd>
|
|
||||||
Archives at <a href="https://www.redhat.com/archives/libvir-list">https://www.redhat.com/archives/libvir-list</a>
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
This is a high volume mailing list. It is a place for discussions
|
|
||||||
about the <strong>development</strong> of libvirt.
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
Topics for discussion include:
|
|
||||||
<ul>
|
|
||||||
<li>New features for libvirt</li>
|
|
||||||
<li>Bug fixing of libvirt</li>
|
|
||||||
<li>New hypervisor drivers</li>
|
|
||||||
<li>Development of language bindings for libvirt API</li>
|
|
||||||
<li>Testing and documentation of libvirt</li>
|
|
||||||
</ul>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="https://www.redhat.com/mailman/listinfo/libvirt-users">libvirt-users@redhat.com</a> (for users)</dt>
|
|
||||||
<dd>
|
|
||||||
Archives at <a href="https://www.redhat.com/archives/libvirt-users">https://www.redhat.com/archives/libvirt-users</a>
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
This is a moderate volume mailing list. It is a place for discussions
|
|
||||||
involving libvirt <strong>users</strong>.
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
Topics for discussion include:
|
|
||||||
<ul>
|
|
||||||
<li>Usage of libvirt / virsh</li>
|
|
||||||
<li>Administration of libvirt</li>
|
|
||||||
<li>Deployment of libvirt with hypervisors</li>
|
|
||||||
<li>Development of applications on top of / using the libvirt API(s)</li>
|
|
||||||
<li>Any other topics along these lines</li>
|
|
||||||
</ul>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="https://www.redhat.com/mailman/listinfo/libvirt-announce">libvirt-announce@redhat.com</a> (for release notices)</dt>
|
|
||||||
<dd>
|
|
||||||
Archives at <a href="https://www.redhat.com/archives/libvirt-announce">https://www.redhat.com/archives/libvirt-announce</a>
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
This is a low volume mailing list, with restricted posting, for
|
|
||||||
announcements of new libvirt releases.
|
|
||||||
</dd>
|
|
||||||
<dd>
|
|
||||||
Subscribe to just this if you want to be notified of new releases,
|
|
||||||
without subscribing to either of the other mailing lists.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
It is recommended but not required that you subscribe before posting
|
|
||||||
to the user and development lists. Posts from non-subscribers will be
|
|
||||||
subject to manual moderation delays. You can subscribe at the linked
|
|
||||||
web pages above.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Patches with explanations and provided as attachments are really
|
|
||||||
appreciated, and should be directed to the development mailing list
|
|
||||||
for review and discussion.
|
|
||||||
Wherever possible, please generate the patches by using
|
|
||||||
<code>git format-patch</code> in a git repository clone. Further
|
|
||||||
useful information regarding developing libvirt and/or contributing is
|
|
||||||
available on our <a href="hacking.html">Contributor Guidelines</a>
|
|
||||||
page.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="irc">IRC discussion</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Some of the libvirt developers may be found on IRC on the <a href="http://oftc.net">OFTC IRC</a>
|
|
||||||
network. Use the settings:
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>server: irc.oftc.net</li>
|
|
||||||
<li>port: 6667 (the usual IRC port)</li>
|
|
||||||
<li>channel: #virt</li>
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
NB There is no guarantee that someone will be watching or able to reply
|
|
||||||
promptly, so use the mailing-list if you don't get an answer on the IRC
|
|
||||||
channel.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,503 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>C# API bindings</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="description">Description</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The C# libvirt bindings are a class library. They use a Microsoft
|
|
||||||
Visual Studio project architecture, and have been tested with Windows
|
|
||||||
.NET, and Mono, on both Linux and Windows.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Compiling them produces <b>LibvirtBindings.dll</b>, which can
|
|
||||||
be added as a .NET reference to any .NET project needing access
|
|
||||||
to libvirt.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<h2><a name="requirements">Requirements</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
These bindings depend upon the libvirt libraries being installed.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
In the .NET case, this is <b>libvirt-0.dll</b>, produced from
|
|
||||||
compiling libvirt for windows.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<!-- 2010-10-19 JC: Commented out until we have C# tarballs to download
|
|
||||||
<h2><a name="getting">Getting them</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The latest versions of the libvirt C# bindings can be downloaded from:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="ftp://libvirt.org/libvirt/csharp/">libvirt.org FTP server</a></li>
|
|
||||||
<li><a href="http://libvirt.org/sources/csharp/">libvirt.org HTTP server</a></li>
|
|
||||||
</ul>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<h2><a name="git">GIT source repository</a></h2>
|
|
||||||
<p>
|
|
||||||
The C# bindings source code is maintained in a <a
|
|
||||||
href="http://git-scm.com/">git</a> repository available on
|
|
||||||
<a href="http://libvirt.org/git/">libvirt.org</a>:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
git clone git://libvirt.org/libvirt-csharp.git
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
They can also be browsed online:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<a href="http://libvirt.org/git/?p=libvirt-csharp.git;a=summary">http://libvirt.org/git/?p=libvirt-csharp.git;a=summary</a>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<h2><a name="usage">Usage</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The libvirt C# bindings class library exposes the <b>Libvirt</b>
|
|
||||||
namespace. This namespace exposes all of the needed types (enum,
|
|
||||||
struct), plus many classes exposing the libvirt API methods.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
These classes are grouped into functional areas, with each class
|
|
||||||
exposing libvirt methods related to that area.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
For example, the libvirt methods related to connections, such as
|
|
||||||
<b>virConnectOpenAuth</b> and <b>virConnectNumOfDomains</b>, are in
|
|
||||||
the <b>Connect</b> class.
|
|
||||||
<br />
|
|
||||||
They are accessed as <b>Connect.OpenAuth</b>, and
|
|
||||||
<b>Connect.NumOfDomains</b> respectively.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
In the same manner, the other class name mappings are:
|
|
||||||
</p>
|
|
||||||
<table class="top_table">
|
|
||||||
<tr><th>Name of libvirt function</th><th>C# class name</th></tr>
|
|
||||||
<tr><td>virDomain...</td><td>Domain</td></tr>
|
|
||||||
<tr><td>virEvent...</td><td>Event</td></tr>
|
|
||||||
<tr><td>virInterface...</td><td>Interface</td></tr>
|
|
||||||
<tr><td>virNetwork...</td><td>Network</td></tr>
|
|
||||||
<tr><td>virNode...</td><td>Node</td></tr>
|
|
||||||
<tr><td>virSecret...</td><td>Secret</td></tr>
|
|
||||||
<tr><td>virStoragePool...</td><td>StoragePool</td></tr>
|
|
||||||
<tr><td>virStorageVolume...</td><td>StorageVolume</td></tr>
|
|
||||||
<tr><td>virStream...</td><td>Stream</td></tr>
|
|
||||||
</table>
|
|
||||||
<p>
|
|
||||||
There are some additions as well:
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
There is a class named <b>Library</b>, exposing the
|
|
||||||
<b>virGetVersion</b> and <b>virInitialize</b> methods
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
There is a class named <b>Errors</b>, exposing the error
|
|
||||||
related methods. For example, <b>virSetErrorFunc</b> and
|
|
||||||
<b>virConnResetLastError</b>.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<h2><a name="authors">Authors</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The C# bindings are the work of Arnaud Champion
|
|
||||||
<<a href="mailto:arnaud.champion AT devatom.fr">arnaud.champion AT devatom.fr</a>>,
|
|
||||||
based upon the previous work of Jaromír Červenka.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<h2><a name="notes">Test Configuration</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Testing is performed using the following configurations:
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>Windows 7 (64 bits) / .Net 4</li>
|
|
||||||
<li>Windows 7 (64 bits) / Mono 2.6.7 (compiled in 32 bits)</li>
|
|
||||||
<li>Ubuntu 10.10 amd64 / Mono 2.6.7 (compiled in 64 bits)</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<h2><a name="type">Type Coverage</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Coverage of the libvirt types is:
|
|
||||||
</p>
|
|
||||||
<table class="top_table">
|
|
||||||
<tr><th>Type</th><th>Name</th><th>Binding?</th><th>Tested?</th><th>Sample Code?</th><th>Works?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
|
|
||||||
<tr><td>enum</td><td>virCPUCompareResult</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virConnect</td><td>Yes, an IntPtr as the struct is not public</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virConnectAuth</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>struct</td><td>virConnectCredential</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virConnectCredentialType</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virConnectFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomain</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainBlockInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainBlockStatsInfo</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainCoreDumpFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainCreateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainDeviceModifyFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventDefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainEventGraphicsAddress</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventGraphicsAddressType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventGraphicsPhase</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainEventGraphicsSubject</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainEventGraphicsSubjectIdentity</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventID</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventIOErrorAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventResumedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventStartedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventStoppedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventSuspendedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventUndefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainEventWatchdogAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainInfo</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainInterfaceStatsStruct</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainJobInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainJobType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainMemoryFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainMemoryStatStruct</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainMemoryStatTags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainMigrateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virDomainSnapshot</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainSnapshotDeleteFlags</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virDomainXMLFlags</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virEventHandleType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>struct</td><td>virInterface</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virInterfaceXMLFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virNWFilter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virNetwork</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virNodeDevice</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virNodeInfo</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virSchedParameter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virSchedParameterType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virSecret</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virSecretUsageType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virSecurityLabel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virSecurityModel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virStoragePoolBuildFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virStoragePoolDeleteFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virStoragePoolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virStoragePool</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virStoragePoolState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virStorageVol</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virStorageVolDeleteFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virStorageVolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virStorageVolType</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virStream</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virStreamEventType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virStreamFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virVcpuInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>enum</td><td>virVcpuState</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>struct</td><td>virError</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p> </p>
|
|
||||||
|
|
||||||
<h2><a name="funccover">Function Coverage</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Coverage of the libvirt functions is:
|
|
||||||
</p>
|
|
||||||
<table class="top_table">
|
|
||||||
<tr><th>Name</th><th>Binding?</th><th>Type?</th><th>Tested?</th><th>Sample Code?</th><th>Working?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
|
|
||||||
<tr><td>virConnectAuthCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectBaselineCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectClose</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectCompareCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventDeregister</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventDeregisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventGenericCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventGraphicsCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventIOErrorCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventIOErrorReasonCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventRTCChangeCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventRegister</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectDomainEventRegisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainEventWatchdogCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainXMLFromNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectDomainXMLToNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectFindStoragePoolSources</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectGetCapabilities</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectGetHostname</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectGetLibVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectGetType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectGetURI</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectGetVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectIsEncrypted</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectIsSecure</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectListDefinedInterfaces </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectListInterfaces</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes, if the host handle the method</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListNWFilters </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectListStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectNumOfDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectNumOfDefinedInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectNumOfDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectNumOfDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectNumOfDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectNumOfInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectNumOfNWFilters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectNumOfNetworks </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectNumOfSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectNumOfStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectOpen</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen, virEventRegisterImpl, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectOpenAuth</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnectOpenReadOnly</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virConnectRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainAbortJob</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainAttachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainAttachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainBlockPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainBlockStats</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virDomainCoreDump</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainCreateLinux</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainCreateWithFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainDetachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainDetachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetBlockInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virDomainGetJobInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetMaxMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetName</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virDomainGetOSType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetSchedulerType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetSecurityLabel</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetVcpus</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virDomainHasCurrentSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainHasManagedSaveImage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainInterfaceStats </td><td>No</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virDomainIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainIsPersistent</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainLookupByID</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virDomainLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virDomainLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainManagedSave </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainManagedSaveRemove</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainMemoryPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainMemoryStats</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainMigrate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainMigrateSetMaxDowntime</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainMigrateToURI </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainPinVcpu</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainReboot</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainRef </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainRestore</td><td>Yes </td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainResume </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainRevertToSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSave</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSetMaxMemory </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSetMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSetVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainShutdown</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotCurrent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotDelete</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotListNames</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSnapshotNum</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainSuspend</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virDomainUpdateDeviceFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virEventAddHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virEventAddTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virEventHandleCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virEventRegisterImpl</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virEventRemoveHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virEventRemoveTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virEventTimeoutCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virEventUpdateHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virEventUpdateTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virFreeCallback</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virGetVersion</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInitialize</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceCreate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceGetMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceIsActive</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceLookupByMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceRef </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virInterfaceUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterGetUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterLookupByName </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterRef </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNWFilterUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkGetBridgeName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkGetName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkGetUUIDString </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNetworkUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceDettach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceGetParent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceListCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceNumOfCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceReAttach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeDeviceReset</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeGetCellsFreeMemory</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeGetFreeMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeGetInfo</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeGetSecurityModel </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeListDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virNodeNumOfDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretFree </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretGetUUIDString </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretGetUsageID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretGetUsageType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretGetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretLookupByUsage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretSetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virSecretUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolBuild</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolCreateXML </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolDelete</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolGetUUIDString</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolListVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolLookupByVolume</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolNumOfVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolRefresh</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStoragePoolUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolCreateXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolCreateXMLFrom</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolDelete</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolFree</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolGetConnect </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolGetKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolGetPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolGetXMLDesc </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolLookupByKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolLookupByPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>No</td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStorageVolWipe</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamAbort </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamEventAddCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamEventCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamEventRemoveCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamEventUpdateCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamFinish </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamFree </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamNew</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamRecv</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamRecvAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamSend</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamSendAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamSinkFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virStreamSourceFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
|
||||||
<tr><td>virGetLastError</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virConnSetErrorFunc</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
<tr><td>virErrorFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
|
||||||
</table>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Deployment</h1>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a name="packages">Pre-packaged releases</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The libvirt API is now available in all major Linux distributions,
|
|
||||||
so the simplest deployment approach is to use your distributions'
|
|
||||||
package management software to install the <code>libvirt</code>
|
|
||||||
module.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a name="tarball">Self-built releases</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
libvirt uses GNU autotools for its build system, so deployment
|
|
||||||
follows the usual process of <code>configure; make ; make install</code>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
|
|
||||||
# ./configure --prefix=$HOME/usr
|
|
||||||
# make
|
|
||||||
# make install
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2><a name="git">Built from GIT</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
When building from GIT it is necessary to generate the autotools
|
|
||||||
support files. This requires having <code>autoconf</code>,
|
|
||||||
<code>automake</code>, <code>libtool</code> and <code>intltool</code>
|
|
||||||
installed. The process can be automated with the <code>autogen.sh</code>
|
|
||||||
script.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
|
|
||||||
# ./autogen.sh --prefix=$HOME/usr
|
|
||||||
# make
|
|
||||||
# make install
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>libvirt Application Development Guides</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The libvirt API is accessible from a number of programming languages.
|
|
||||||
At this time, there are application development guides available
|
|
||||||
which cover the C API and the Python API. Of the two, the Python guide
|
|
||||||
is currently the more comprehensive document.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide/en-US/html/">Application Development Guide (C language) HTML</a></li>
|
|
||||||
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide/en-US/pdf/">Application Development Guide (C language) PDF</a></li>
|
|
||||||
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/">Application Development Guide (Python language) HTML</a></li>
|
|
||||||
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/pdf/">Application Development Guide (Python language) PDF</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2>Contributing content</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
These guides are written in DocBook and published with the
|
|
||||||
publican tool, which is also used for Fedora and Red Hat
|
|
||||||
documentation. The original content is provided in GIT and
|
|
||||||
any contributions to the guide are welcome.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
# C language
|
|
||||||
$ git clone <a href="http://libvirt.org/git/?p=libvirt-appdev-guide.git">git://libvirt.org/libvirt-appdev-guide.git</a>
|
|
||||||
|
|
||||||
# Python language
|
|
||||||
$ git clone <a href="http://libvirt.org/git/?p=libvirt-appdev-guide-python.git">git://libvirt.org/libvirt-appdev-guide-python.git</a>
|
|
||||||
|
|
||||||
# Publican Style/Theme
|
|
||||||
$ git clone <a href="http://libvirt.org/git/?p=libvirt-publican.git">git://libvirt.org/libvirt-publican.git</a>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
|
||||||
xmlns="http://www.devhelp.net/book"
|
|
||||||
xmlns:exsl="http://exslt.org/common"
|
|
||||||
xmlns:str="http://exslt.org/strings"
|
|
||||||
extension-element-prefixes="exsl str"
|
|
||||||
exclude-result-prefixes="exsl str">
|
|
||||||
<!-- The stylesheet for the html pages -->
|
|
||||||
<xsl:import href="html.xsl"/>
|
|
||||||
|
|
||||||
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
|
|
||||||
|
|
||||||
<!-- Build keys for all symbols -->
|
|
||||||
<xsl:key name="symbols" match="/api/symbols/*" use="@name"/>
|
|
||||||
|
|
||||||
<xsl:template match="/">
|
|
||||||
<xsl:document xmlns="http://www.devhelp.net/book" href="libvirt.devhelp"
|
|
||||||
method="xml" encoding="UTF-8" indent="yes">
|
|
||||||
<xsl:apply-templates/>
|
|
||||||
</xsl:document>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template match="/api">
|
|
||||||
<book title="{@name} Reference Manual" link="index.html" author="" name="{@name}">
|
|
||||||
<xsl:apply-templates select="files"/>
|
|
||||||
<xsl:apply-templates select="symbols"/>
|
|
||||||
</book>
|
|
||||||
<xsl:call-template name="generate_index"/>
|
|
||||||
<xsl:call-template name="generate_general"/>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/files">
|
|
||||||
<chapters>
|
|
||||||
<sub name="API" link="general.html">
|
|
||||||
<xsl:apply-templates select="file"/>
|
|
||||||
</sub>
|
|
||||||
</chapters>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/files/file">
|
|
||||||
<xsl:variable name="module" select="@name"/>
|
|
||||||
<xsl:variable name="prev" select="string(preceding-sibling::file[position()=1]/@name)"/>
|
|
||||||
<xsl:variable name="next" select="string(following-sibling::file[position()=1]/@name)"/>
|
|
||||||
<sub name="{@name}" link="libvirt-{@name}.html"/>
|
|
||||||
<xsl:document xmlns="" href="libvirt-{@name}.html" method="xml" indent="yes" encoding="UTF-8">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
|
||||||
<title><xsl:value-of select="concat(@name, ': ', summary)"/></title>
|
|
||||||
<meta name="generator" content="Libvirt devhelp stylesheet"/>
|
|
||||||
<link rel="start" href="index.html" title="libvirt Reference Manual"/>
|
|
||||||
<link rel="up" href="general.html" title="API"/>
|
|
||||||
<link rel="stylesheet" href="style.css" type="text/css"/>
|
|
||||||
<link rel="chapter" href="general.html" title="API"/>
|
|
||||||
</head>
|
|
||||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
|
||||||
|
|
||||||
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
|
|
||||||
<tr valign="middle">
|
|
||||||
<xsl:if test="$prev != ''">
|
|
||||||
<td><a accesskey="p" href="libvirt-{$prev}.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"/></a></td>
|
|
||||||
</xsl:if>
|
|
||||||
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"/></a></td>
|
|
||||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"/></a></td>
|
|
||||||
<xsl:if test="$next != ''">
|
|
||||||
<td><a accesskey="n" href="libvirt-{$next}.html"><img src="right.png" width="24" height="24" border="0" alt="Next"/></a></td>
|
|
||||||
</xsl:if>
|
|
||||||
<th width="100%" align="center">libvirt Reference Manual</th>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<h2><span class="refentrytitle"><xsl:value-of select="@name"/></span></h2>
|
|
||||||
<p><xsl:value-of select="@name"/> - <xsl:value-of select="summary"/></p>
|
|
||||||
<p><xsl:value-of select="description"/></p>
|
|
||||||
<xsl:if test="deprecated">
|
|
||||||
<p> WARNING: this module is deprecated !</p>
|
|
||||||
</xsl:if>
|
|
||||||
<p>Author(s): <xsl:value-of select="author"/></p>
|
|
||||||
<div class="refsynopsisdiv">
|
|
||||||
<h2>Synopsis</h2>
|
|
||||||
<pre class="synopsis">
|
|
||||||
<xsl:apply-templates mode="synopsis" select="exports"/>
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
<div class="refsect1" lang="en">
|
|
||||||
<h2>Description</h2>
|
|
||||||
</div>
|
|
||||||
<div class="refsect1" lang="en">
|
|
||||||
<h2>Details</h2>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<xsl:apply-templates mode="details" select="/api/symbols/macro[@file=$module]"/>
|
|
||||||
<xsl:apply-templates mode="details" select="/api/symbols/typedef[@file=$module] | /api/symbols/struct[@file=$module]"/>
|
|
||||||
<xsl:apply-templates mode="details" select="/api/symbols/functype[@file=$module]"/>
|
|
||||||
<xsl:apply-templates mode="details" select="/api/symbols/variable[@file=$module]"/>
|
|
||||||
<xsl:apply-templates mode="details" select="/api/symbols/function[@file=$module]"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
</xsl:document>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols">
|
|
||||||
<functions>
|
|
||||||
<xsl:apply-templates select="macro"/>
|
|
||||||
<xsl:apply-templates select="enum"/>
|
|
||||||
<xsl:apply-templates select="typedef"/>
|
|
||||||
<xsl:apply-templates select="struct"/>
|
|
||||||
<xsl:apply-templates select="functype"/>
|
|
||||||
<xsl:apply-templates select="variable"/>
|
|
||||||
<xsl:apply-templates select="function"/>
|
|
||||||
</functions>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols/functype">
|
|
||||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols/function">
|
|
||||||
<function name="{@name} ()" link="libvirt-{@file}.html#{@name}"/>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols/typedef">
|
|
||||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols/enum">
|
|
||||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols/struct">
|
|
||||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols/macro">
|
|
||||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template match="/api/symbols/variable">
|
|
||||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
</xsl:stylesheet>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 654 B |
@@ -1,577 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
|
||||||
xmlns:exsl="http://exslt.org/common"
|
|
||||||
xmlns:str="http://exslt.org/strings"
|
|
||||||
extension-element-prefixes="exsl str"
|
|
||||||
exclude-result-prefixes="exsl str">
|
|
||||||
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
|
|
||||||
|
|
||||||
<!-- This is convoluted but needed to force the current document to
|
|
||||||
be the API one and not the result tree from the tokenize() result,
|
|
||||||
because the keys are only defined on the main document -->
|
|
||||||
<xsl:template mode="dumptoken" match='*'>
|
|
||||||
<xsl:param name="token"/>
|
|
||||||
<xsl:variable name="ref" select="key('symbols', $token)"/>
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="$ref">
|
|
||||||
<a href="libvirt-{$ref/@file}.html#{$ref/@name}"><xsl:value-of select="$token"/></a>
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<xsl:value-of select="$token"/>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!-- dumps a string, making cross-reference links -->
|
|
||||||
<xsl:template name="dumptext">
|
|
||||||
<xsl:param name="text"/>
|
|
||||||
<xsl:variable name="ctxt" select='.'/>
|
|
||||||
<!-- <xsl:value-of select="$text"/> -->
|
|
||||||
<xsl:for-each select="str:tokenize($text, ' 	')">
|
|
||||||
<xsl:apply-templates select="$ctxt" mode='dumptoken'>
|
|
||||||
<xsl:with-param name="token" select="string(.)"/>
|
|
||||||
</xsl:apply-templates>
|
|
||||||
<xsl:if test="position() != last()">
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:for-each>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
The following builds the Synopsis section
|
|
||||||
|
|
||||||
-->
|
|
||||||
<xsl:template mode="synopsis" match="function">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
|
||||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
|
||||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="return/@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
<a href="#{@name}"><xsl:value-of select="@name"/></a>
|
|
||||||
<xsl:if test="$blen - 40 < -8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 < 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>	(</xsl:text>
|
|
||||||
<xsl:if test="not(arg)">
|
|
||||||
<xsl:text>void</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="position() != last()">
|
|
||||||
<xsl:text>, </xsl:text><br/>
|
|
||||||
<xsl:if test="$blen - 40 > 8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 > 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>					 </xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>);</xsl:text>
|
|
||||||
<xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="synopsis" match="functype">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
|
||||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
|
||||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
|
||||||
<xsl:text>typedef </xsl:text>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="return/@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<a href="#{@name}"><xsl:value-of select="@name"/></a>
|
|
||||||
<xsl:if test="$blen - 40 < -8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 < 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>	(</xsl:text>
|
|
||||||
<xsl:if test="not(arg)">
|
|
||||||
<xsl:text>void</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="position() != last()">
|
|
||||||
<xsl:text>, </xsl:text><br/>
|
|
||||||
<xsl:if test="$blen - 40 > 8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 > 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>					 </xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>);</xsl:text>
|
|
||||||
<xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="synopsis" match="exports[@type='function']">
|
|
||||||
<xsl:variable name="def" select="key('symbols',@symbol)"/>
|
|
||||||
<xsl:apply-templates mode="synopsis" select="$def"/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="synopsis" match="exports[@type='typedef']">
|
|
||||||
<xsl:text>typedef </xsl:text>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="string(key('symbols',@symbol)/@type)"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<a href="#{@symbol}"><xsl:value-of select="@symbol"/></a>
|
|
||||||
<xsl:text>;
|
|
||||||
</xsl:text>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="synopsis" match="exports[@type='macro']">
|
|
||||||
<xsl:variable name="def" select="key('symbols',@symbol)"/>
|
|
||||||
<xsl:text>#define </xsl:text>
|
|
||||||
<a href="#{@symbol}"><xsl:value-of select="@symbol"/></a>
|
|
||||||
<xsl:if test="$def/arg">
|
|
||||||
<xsl:text>(</xsl:text>
|
|
||||||
<xsl:for-each select="$def/arg">
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="position() != last()">
|
|
||||||
<xsl:text>, </xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>)</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>;
|
|
||||||
</xsl:text>
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template mode="synopsis" match="exports[@type='enum']">
|
|
||||||
</xsl:template>
|
|
||||||
<xsl:template mode="synopsis" match="exports[@type='struct']">
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
The following builds the Details section
|
|
||||||
|
|
||||||
-->
|
|
||||||
<xsl:template mode="details" match="struct">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<h3><a name="{$name}">Structure </a><xsl:value-of select="$name"/></h3>
|
|
||||||
<pre class="programlisting">
|
|
||||||
<xsl:value-of select="@type"/><xsl:text> {
|
|
||||||
</xsl:text>
|
|
||||||
<xsl:if test="not(field)">
|
|
||||||
<xsl:text>The content of this structure is not made public by the API.
|
|
||||||
</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:for-each select="field">
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="@info != ''">
|
|
||||||
<xsl:text>	: </xsl:text>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="substring(@info, 1, 70)"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>} </xsl:text>
|
|
||||||
<xsl:value-of select="$name"/>
|
|
||||||
<xsl:text>;
|
|
||||||
</xsl:text>
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</p><xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</div><hr/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="details" match="typedef[@type != 'enum']">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<h3><a name="{$name}">Typedef </a><xsl:value-of select="$name"/></h3>
|
|
||||||
<pre class="programlisting">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="string(@type)"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<xsl:value-of select="$name"/>
|
|
||||||
<xsl:text>;
|
|
||||||
</xsl:text>
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</p><xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</div><hr/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="details" match="variable">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<h3><a name="{$name}">Variable </a><xsl:value-of select="$name"/></h3>
|
|
||||||
<pre class="programlisting">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="string(@type)"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<xsl:value-of select="$name"/>
|
|
||||||
<xsl:text>;
|
|
||||||
</xsl:text>
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</p><xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</div><hr/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="details" match="typedef[@type = 'enum']">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<h3><a name="{$name}">Enum </a><xsl:value-of select="$name"/></h3>
|
|
||||||
<pre class="programlisting">
|
|
||||||
<xsl:text>enum </xsl:text>
|
|
||||||
<a href="#{$name}"><xsl:value-of select="$name"/></a>
|
|
||||||
<xsl:text> {
|
|
||||||
</xsl:text>
|
|
||||||
<xsl:for-each select="/api/symbols/enum[@type=$name]">
|
|
||||||
<xsl:sort select="@value" data-type="number" order="ascending"/>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<a name="{@name}"><xsl:value-of select="@name"/></a>
|
|
||||||
<xsl:if test="@value">
|
|
||||||
<xsl:text> = </xsl:text>
|
|
||||||
<xsl:value-of select="@value"/>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="@info">
|
|
||||||
<xsl:text> /* </xsl:text>
|
|
||||||
<xsl:value-of select="@info"/>
|
|
||||||
<xsl:text> */</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>};
|
|
||||||
</xsl:text>
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</p><xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</div><hr/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="details" match="macro">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<h3><a name="{$name}">Macro </a><xsl:value-of select="$name"/></h3>
|
|
||||||
<pre class="programlisting">
|
|
||||||
<xsl:text>#define </xsl:text>
|
|
||||||
<a href="#{$name}"><xsl:value-of select="$name"/></a>
|
|
||||||
<xsl:if test="arg">
|
|
||||||
<xsl:text>(</xsl:text>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="position() != last()">
|
|
||||||
<xsl:text>, </xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>)</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>;
|
|
||||||
</xsl:text>
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</p>
|
|
||||||
<xsl:if test="arg">
|
|
||||||
<div class="variablelist"><table border="0"><col align="left"/><tbody>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<tr>
|
|
||||||
<td><span class="term"><i><tt><xsl:value-of select="@name"/></tt></i>:</span></td>
|
|
||||||
<td>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</xsl:for-each>
|
|
||||||
</tbody></table></div>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</div><hr/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="details" match="function">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
|
||||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
|
||||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<h3><a name="{$name}"></a><xsl:value-of select="$name"/> ()</h3>
|
|
||||||
<pre class="programlisting">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="return/@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="$blen - 40 < -8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 < 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>	(</xsl:text>
|
|
||||||
<xsl:if test="not(arg)">
|
|
||||||
<xsl:text>void</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="position() != last()">
|
|
||||||
<xsl:text>, </xsl:text><br/>
|
|
||||||
<xsl:if test="$blen - 40 > 8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 > 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>					 </xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>)</xsl:text><br/>
|
|
||||||
<xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</p><xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
<xsl:if test="arg | return/@info">
|
|
||||||
<div class="variablelist"><table border="0"><col align="left"/><tbody>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<tr>
|
|
||||||
<td><span class="term"><i><tt><xsl:value-of select="@name"/></tt></i>:</span></td>
|
|
||||||
<td>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:if test="return/@info">
|
|
||||||
<tr>
|
|
||||||
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
|
|
||||||
<td>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="return/@info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</xsl:if>
|
|
||||||
</tbody></table></div>
|
|
||||||
</xsl:if>
|
|
||||||
</div><hr/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<xsl:template mode="details" match="functype">
|
|
||||||
<xsl:variable name="name" select="string(@name)"/>
|
|
||||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
|
||||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
|
||||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
|
||||||
<div class="refsect2" lang="en">
|
|
||||||
<h3><a name="{$name}"></a>Function type <xsl:value-of select="$name"/> </h3>
|
|
||||||
<pre class="programlisting">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="return/@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="$blen - 40 < -8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 < 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>	(</xsl:text>
|
|
||||||
<xsl:if test="not(arg)">
|
|
||||||
<xsl:text>void</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@type"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<xsl:value-of select="@name"/>
|
|
||||||
<xsl:if test="position() != last()">
|
|
||||||
<xsl:text>, </xsl:text><br/>
|
|
||||||
<xsl:if test="$blen - 40 > 8">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="$blen - 40 > 0">
|
|
||||||
<xsl:text>	</xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:text>					 </xsl:text>
|
|
||||||
</xsl:if>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:text>)</xsl:text><br/>
|
|
||||||
<xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</p><xsl:text>
|
|
||||||
</xsl:text>
|
|
||||||
<xsl:if test="arg | return/@info">
|
|
||||||
<div class="variablelist"><table border="0"><col align="left"/><tbody>
|
|
||||||
<xsl:for-each select="arg">
|
|
||||||
<tr>
|
|
||||||
<td><span class="term"><i><tt><xsl:value-of select="@name"/></tt></i>:</span></td>
|
|
||||||
<td>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="@info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</xsl:for-each>
|
|
||||||
<xsl:if test="return/@info">
|
|
||||||
<tr>
|
|
||||||
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
|
|
||||||
<td>
|
|
||||||
<xsl:call-template name="dumptext">
|
|
||||||
<xsl:with-param name="text" select="return/@info"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</xsl:if>
|
|
||||||
</tbody></table></div>
|
|
||||||
</xsl:if>
|
|
||||||
</div><hr/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
The following builds the general.html page
|
|
||||||
|
|
||||||
-->
|
|
||||||
<xsl:template name="generate_general">
|
|
||||||
<xsl:variable name="next" select="string(/api/files/file[position()=1]/@name)"/>
|
|
||||||
<xsl:document xmlns="" href="general.html" method="xml" indent="yes" encoding="UTF-8">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
|
||||||
<title><xsl:value-of select="concat(@name, ': ', summary)"/></title>
|
|
||||||
<meta name="generator" content="Libvirt devhelp stylesheet"/>
|
|
||||||
<link rel="start" href="index.html" title="libvirt Reference Manual"/>
|
|
||||||
<link rel="up" href="index.html" title="libvirt Reference Manual"/>
|
|
||||||
<link rel="stylesheet" href="style.css" type="text/css"/>
|
|
||||||
<link rel="chapter" href="index.html" title="libvirt Reference Manual"/>
|
|
||||||
</head>
|
|
||||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
|
||||||
|
|
||||||
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
|
|
||||||
<tr valign="middle">
|
|
||||||
<td><a accesskey="u" href="index.html"><img src="up.png" width="24" height="24" border="0" alt="Up"/></a></td>
|
|
||||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"/></a></td>
|
|
||||||
<xsl:if test="$next != ''">
|
|
||||||
<td><a accesskey="n" href="libvirt-{$next}.html"><img src="right.png" width="24" height="24" border="0" alt="Next"/></a></td>
|
|
||||||
</xsl:if>
|
|
||||||
<th width="100%" align="center">libvirt Reference Manual</th>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<h2><span class="refentrytitle">libvirt API Modules</span></h2>
|
|
||||||
<p>
|
|
||||||
<xsl:for-each select="/api/files/file">
|
|
||||||
<a href="libvirt-{@name}.html"><xsl:value-of select="@name"/></a> - <xsl:value-of select="summary"/><br/>
|
|
||||||
</xsl:for-each>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
</xsl:document>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
The following builds the index.html page
|
|
||||||
|
|
||||||
-->
|
|
||||||
<xsl:template name="generate_index">
|
|
||||||
<xsl:document xmlns="" href="index.html" method="xml" indent="yes" encoding="UTF-8">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
|
||||||
<title>libvirt Reference Manual</title>
|
|
||||||
<meta name="generator" content="Libvirt devhelp stylesheet"/>
|
|
||||||
<link rel="stylesheet" href="style.css" type="text/css"/>
|
|
||||||
</head>
|
|
||||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
|
||||||
|
|
||||||
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
|
|
||||||
<tr valign="middle">
|
|
||||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"/></a></td>
|
|
||||||
<td><a accesskey="n" href="general.html"><img src="right.png" width="24" height="24" border="0" alt="Next"/></a></td>
|
|
||||||
<th width="100%" align="center">libvirt Reference Manual</th>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<h2><span class="refentrytitle">libvirt Reference Manual</span></h2>
|
|
||||||
<p>Libvir is a C toolkit to interact with the virtualization capabilities of
|
|
||||||
recent versions of Linux (and other OSes). It is free software available
|
|
||||||
under the <a href="http://www.opensource.org/licenses/lgpl-license.html">GNU
|
|
||||||
Lesser General Public License</a>. Virtualization of the Linux Operating
|
|
||||||
System means the ability to run multiple instances of Operating Systems
|
|
||||||
concurrently on a single hardware system where the basic resources are driven
|
|
||||||
by a Linux instance. The library aim at providing long term stable C API
|
|
||||||
initially for the <a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.html">Xen
|
|
||||||
paravirtualization</a> but should be able to integrate other virtualization
|
|
||||||
mechanisms if needed.</p>
|
|
||||||
<p> If you get lost searching for some specific API use, try
|
|
||||||
<a href="http://libvirt.org/search.php">the online search
|
|
||||||
engine</a> hosted on <a href="http://libvirt.org/">libvirt.org</a>
|
|
||||||
it indexes the project page, the APIs as well as the mailing-list archives. </p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
</xsl:document>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
</xsl:stylesheet>
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user