The hvsupport.html.in file is forever out of date. By annotating
the driver struct tables in each driver with version information,
we can auto-generate the hvsupport.html.in file. Annotating the
drivers will be mandatory for new patches, ensuring hvsupport.html.in
is never out of date again.
* docs/hvsupport.html.in: Delete
* hvsupport.pl: Script to generate hvsupport.html.in
* Makefile.am: Autogenerate hvsupport.html.in
---
docs/Makefile.am | 10 +-
docs/hvsupport.html.in | 801 ------------------------------------------------
docs/hvsupport.pl | 353 +++++++++++++++++++++
3 files changed, 360 insertions(+), 804 deletions(-)
delete mode 100644 docs/hvsupport.html.in
create mode 100644 docs/hvsupport.pl
diff --git a/docs/Makefile.am b/docs/Makefile.am
index db4bc59..12b3fcd 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -60,7 +60,7 @@ gif = \
architecture.gif \
node.gif
-dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) todo.html.in \
+dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) todo.html.in hvsupport.html.in \
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in))
dot_html = $(dot_html_in:%.html.in=%.html)
@@ -86,7 +86,7 @@ EXTRA_DIST= \
$(xml) $(fig) $(png) $(css) \
$(patches) \
sitemap.html.in \
- todo.pl todo.cfg-example
+ todo.pl hvsupport.pl todo.cfg-example
MAINTAINERCLEANFILES = \
$(addprefix $(srcdir)/,$(dot_html)) \
@@ -113,6 +113,10 @@ todo:
rm -f todo.html.in
$(MAKE) todo.html
+hvsupport.html.in: hvsupport.pl $(srcdir)/../src/libvirt_public.syms \
+ $(srcdir)/../src/libvirt_qemu.syms $(srcdir)/../src/driver.h
+ $(AM_V_GEN)$(PERL) $(srcdir)/$< $(srcdir)/../src > $@ || { rm $@ && exit
1; }
+
.PHONY: todo
%.png: %.fig
@@ -183,7 +187,7 @@ 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-api.xml $(srcdir)/libvirt-refs.xml todo.html.in
hvsupport.html.in
rebuild: api all
diff --git a/docs/hvsupport.html.in b/docs/hvsupport.html.in
deleted file mode 100644
index 4cc2634..0000000
--- a/docs/hvsupport.html.in
+++ /dev/null
@@ -1,801 +0,0 @@
-<?xml version="1.0"?>
-<html>
- <body>
- <h1>Driver support matrix</h1>
- <p>
-This page documents which <a href="html/">libvirt calls</a> work
on
-which libvirt drivers / hypervisors, and which version the API appeared
-in.
-</p>
- <p>
-This information changes frequently. This page was last checked or
-updated on <i>2008-06-05</i>.
-</p>
- <h3>Domain functions</h3>
- <p> x = not supported; empty cell means no information </p>
- <table class="top_table">
- <tr>
- <th> Function </th>
- <th> Since </th>
- <th><a href="drvxen.html">Xen</a></th>
- <th><a href="drvqemu.html">QEMU</a></th>
- <th><a href="drvkvm.html">KVM</a></th>
- <th><a href="remote.html">Remote</a></th>
- <th><a href="drvvbox.html">VirtualBox</a></th>
- <th><a href="drvone.html">ONE</a></th>
- <th><a href="drvesx.html">ESX</a></th>
- </tr>
- <tr>
- <td> virConnectClose </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectGetCapabilities </td>
- <td> 0.2.1 </td>
- <td> ≥ 0.2.1 </td>
- <td> ≥ 0.2.1 </td>
- <td> ≥ 0.2.1 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.1 </td>
- </tr>
- <tr>
- <td> virConnectGetHostname </td>
- <td> 0.3.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.3.3 </td>
- <td> ≥ 0.3.3 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectGetMaxVcpus </td>
- <td> 0.2.1 </td>
- <td> ≥ 0.2.1 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virConnectGetType </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectGetURI </td>
- <td> 0.3.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectGetVersion </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectListDefinedDomains </td>
- <td> 0.1.5 </td>
- <td> ≥ 0.1.9 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectListDomains </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectNumOfDefinedDomains </td>
- <td> 0.1.5 </td>
- <td> ≥ 0.1.9 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectNumOfDomains </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectOpen </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virConnectOpenAuth </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virConnectOpenReadOnly </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainAttachDevice </td>
- <td> 0.1.9 </td>
- <td> ≥ 0.1.9 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainBlockPeek </td>
- <td> 0.4.3 </td>
- <td> 0.4.3 </td>
- <td> 0.4.3 </td>
- <td> 0.4.3 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainBlockStats </td>
- <td> 0.3.2 </td>
- <td> ≥ 0.3.2 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.2 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainCoreDump </td>
- <td> 0.1.9 </td>
- <td> ≥ 0.1.9 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainCreate </td>
- <td> 0.1.5 </td>
- <td> ≥ 0.1.9 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainCreateLinux </td>
- <td> All </td>
- <td> ≥ 0.0.5 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainDefineXML </td>
- <td> 0.1.5 </td>
- <td> ≥ 0.1.9 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.2 </td>
- </tr>
- <tr>
- <td> virDomainDestroy </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainDetachDevice </td>
- <td> 0.1.9 </td>
- <td> ≥ 0.1.9 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainFree </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetAutostart </td>
- <td> 0.2.1 </td>
- <td> x </td>
- <td> ≥ 0.2.1 </td>
- <td> ≥ 0.2.1 </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainGetConnect </td>
- <td> 0.3.0 </td>
- <td colspan="7"> not a HV function </td>
- </tr>
- <tr>
- <td> virDomainGetID </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetInfo </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetMaxMemory </td>
- <td> All </td>
- <td> All </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetMaxVcpus </td>
- <td> 0.2.1 </td>
- <td> ≥ 0.2.1 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetName </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetOSType </td>
- <td> All </td>
- <td> All </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetSchedulerParameters </td>
- <td> 0.2.3 </td>
- <td> ≥ 0.2.3 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetSchedulerType </td>
- <td> 0.2.3 </td>
- <td> ≥ 0.2.3 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetUUID </td>
- <td> 0.1.10 </td>
- <td> ≥ 0.1.10 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetUUIDString </td>
- <td> 0.1.10 </td>
- <td> ≥ 0.1.10 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainGetVcpus </td>
- <td> 0.1.4 </td>
- <td> ≥ 0.1.4 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainInterfaceStats </td>
- <td> 0.3.2 </td>
- <td> ≥ 0.3.2 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.2 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainGetXMLDesc </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainLookupByID </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainLookupByName </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainLookupByUUID </td>
- <td> 0.1.10 </td>
- <td> ≥ 0.1.10 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainLookupByUUIDString </td>
- <td> 0.1.10 </td>
- <td> ≥ 0.1.10 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainMigrate </td>
- <td> 0.3.2 </td>
- <td> ≥ 0.3.2 </td>
- <td> x </td>
- <td> x </td>
- <td> 0.3.2 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainPinVcpu </td>
- <td> 0.1.4 </td>
- <td> ≥ 0.1.4 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainReboot </td>
- <td> 0.1.0 </td>
- <td> ≥ 0.1.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainRestore </td>
- <td> All </td>
- <td> All </td>
- <td> x </td>
- <td> ≥ 0.3.2 </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainResume </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainSave </td>
- <td> All </td>
- <td> All </td>
- <td> x </td>
- <td> ≥ 0.3.2 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainSetAutostart </td>
- <td> 0.2.1 </td>
- <td> x </td>
- <td> ≥ 0.2.1 </td>
- <td> ≥ 0.2.1 </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virDomainSetMaxMemory </td>
- <td> All </td>
- <td> All </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainSetMemory </td>
- <td> 0.1.1 </td>
- <td> ≥ 0.1.1 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainSetSchedulerParameters </td>
- <td> 0.2.3 </td>
- <td> ≥ 0.2.3 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainSetVcpus </td>
- <td> 0.1.4 </td>
- <td> ≥ 0.1.4 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.3.0 </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainShutdown </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainSuspend </td>
- <td> All </td>
- <td> All </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virDomainUndefine </td>
- <td> 0.1.5 </td>
- <td> ≥ 0.1.9 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> ≥ 0.6.4 </td>
- <td> ≥ 0.7.1 </td>
- </tr>
- <tr>
- <td> virGetVersion </td>
- <td> All </td>
- <td> All </td>
- <td colspan="6"> Returns -1 if HV unsupported. </td>
- </tr>
- <tr>
- <td> virInitialize </td>
- <td> 0.1.0 </td>
- <td colspan="7"> not a HV function </td>
- </tr>
- <tr>
- <td> virDomainMemoryPeek </td>
- <td> 0.4.3 </td>
- <td> x </td>
- <td> 0.4.3 </td>
- <td> 0.4.3 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- <tr>
- <td> virNodeGetInfo </td>
- <td> 0.1.0 </td>
- <td> ≥ 0.1.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.2.0 </td>
- <td> ≥ 0.3.0 </td>
- <td> ≥ 0.6.3 </td>
- <td> x </td>
- <td> ≥ 0.7.0 </td>
- </tr>
- <tr>
- <td> virNodeGetFreeMemory </td>
- <td> 0.3.3 </td>
- <td> ≥ 0.3.3 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> ≥ 0.7.2 </td>
- </tr>
- <tr>
- <td> virNodeGetCellsFreeMemory </td>
- <td> 0.3.3 </td>
- <td> ≥ 0.3.3 </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- <td> x </td>
- </tr>
- </table>
- <h3>Network functions</h3>
- <p>
-Network functions are not hypervisor-specific.They require the libvirtd
-daemon to be running. Most network functions first appeared in libvirt 0.2.0.
-</p>
- <table class="top_table">
- <tr>
- <th> Function </th>
- <th> Since </th>
- </tr>
- <tr>
- <td> virConnectNumOfNetworks </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virConnectListNetworks </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virConnectNumOfDefinedNetworks </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virConnectListDefinedNetworks </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkCreate </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkCreateXML </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkDefineXML </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkDestroy </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkFree </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkGetAutostart </td>
- <td> 0.2.1 </td>
- </tr>
- <tr>
- <td> virNetworkGetConnect </td>
- <td> 0.3.0 </td>
- </tr>
- <tr>
- <td> virNetworkGetBridgeName </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkGetName </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkGetUUID </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkGetUUIDString </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkGetXMLDesc </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkLookupByName </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkLookupByUUID </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkLookupByUUIDString </td>
- <td> 0.2.0 </td>
- </tr>
- <tr>
- <td> virNetworkSetAutostart </td>
- <td> 0.2.1 </td>
- </tr>
- <tr>
- <td> virNetworkUndefine </td>
- <td> 0.2.0 </td>
- </tr>
- </table>
- </body>
-</html>
diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl
new file mode 100644
index 0000000..5cfb824
--- /dev/null
+++ b/docs/hvsupport.pl
@@ -0,0 +1,353 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use File::Find;
+
+die "syntax: $0 SRCDIR\n" unless int(@ARGV) == 1;
+
+my $srcdir = shift @ARGV;
+
+my $symslibvirt = "$srcdir/libvirt_public.syms";
+my $symsqemu = "$srcdir/libvirt_qemu.syms";
+my $drivertable = "$srcdir/driver.h";
+
+my %groupheaders = (
+ "virDriver" => "Hypervisor APIs",
+ "virNetworkDriver" => "Virtual Network APIs",
+ "virInterfaceDriver" => "Host Interface APIs",
+ "virDeviceMonitor" => "Host Device APIs",
+ "virStorageDriver" => "Storage Pool APIs",
+ "virSecretDriver" => "Secret APIs",
+ "virNWFilterDriver" => "Network Filter APIs",
+ );
+
+
+my @srcs;
+find({
+ wanted => sub {
+ if (m!$srcdir/.*/\w+_(driver|tmpl)\.c$!) {
+ push @srcs, $_ if $_ !~ /vbox_driver\.c/;
+ }
+ }, no_chdir => 1}, $srcdir);
+my $line;
+
+# Get the list of all public APIs and their corresponding version
+
+my %apis;
+open FILE, "<$symslibvirt"
+ or die "cannot read $symslibvirt: $!";
+
+my $vers;
+my $prevvers;
+while (defined($line = <FILE>)) {
+ chomp $line;
+ next if $line =~ /^\s*#/;
+ next if $line =~ /^\s*$/;
+ next if $line =~ /^\s*(global|local):/;
+ if ($line =~ /^\s*LIBVIRT_(\d+\.\d+\.\d+)\s*{\s*$/) {
+ if (defined $vers) {
+ die "malformed syms file";
+ }
+ $vers = $1;
+ } elsif ($line =~ /\s*}\s*;\s*$/) {
+ if (defined $prevvers) {
+ die "malformed syms file";
+ }
+ $prevvers = $vers;
+ $vers = undef;
+ } elsif ($line =~ /\s*}\s*LIBVIRT_(\d+\.\d+\.\d+)\s*;\s*$/) {
+ if ($1 ne $prevvers) {
+ die "malformed syms file $1 != $vers";
+ }
+ $prevvers = $vers;
+ $vers = undef;
+ } elsif ($line =~ /\s*(\w+)\s*;\s*$/) {
+ $apis{$1} = $vers;
+ } else {
+ die "unexpected data $line\n";
+ }
+}
+
+close FILE;
+
+
+# And the same for the QEMU specific APIs
+
+open FILE, "<$symsqemu"
+ or die "cannot read $symsqemu: $!";
+
+$prevvers = undef;
+$vers = undef;
+while (defined($line = <FILE>)) {
+ chomp $line;
+ next if $line =~ /^\s*#/;
+ next if $line =~ /^\s*$/;
+ next if $line =~ /^\s*(global|local):/;
+ if ($line =~ /^\s*LIBVIRT_QEMU_(\d+\.\d+\.\d+)\s*{\s*$/) {
+ if (defined $vers) {
+ die "malformed syms file";
+ }
+ $vers = $1;
+ } elsif ($line =~ /\s*}\s*;\s*$/) {
+ if (defined $prevvers) {
+ die "malformed syms file";
+ }
+ $prevvers = $vers;
+ $vers = undef;
+ } elsif ($line =~ /\s*}\s*LIBVIRT_QEMU_(\d+\.\d+\.\d+)\s*;\s*$/) {
+ if ($1 ne $prevvers) {
+ die "malformed syms file $1 != $vers";
+ }
+ $prevvers = $vers;
+ $vers = undef;
+ } elsif ($line =~ /\s*(\w+)\s*;\s*$/) {
+ $apis{$1} = $vers;
+ } else {
+ die "unexpected data $line\n";
+ }
+}
+
+close FILE;
+
+
+
+# Now we want to get the mapping between public APIs
+# and driver struct fields. This lets us later match
+# update the driver impls with the public APis.
+
+open FILE, "<$drivertable"
+ or die "cannot read $drivertable: $!";
+
+# Group name -> hash of APIs { fields -> api name }
+my %groups;
+
+# XXX handle these better
+my %apisecret = qw(
+ DrvSupportsFeature virConnectDrvSupportsFeature
+ DomainMigratePrepare virDomainMigratePrepare
+ DomainMigratePerform virDomainMigratePerform
+ DomainMigrateFinish virDomainMigrateFinish
+ DomainMigratePrepare2 virDomainMigratePrepare2
+ DomainMigrateFinish2 virDomainMigrateFinish2
+ DomainMigratePrepareTunnel virDomainMigratePrepareTunnel
+ );
+
+foreach my $field (keys %apisecret) {
+ my $api = $apisecret{$field};
+ $apis{$api} = "0.0.0";
+}
+
+my $ingrp;
+while (defined($line = <FILE>)) {
+ if ($line =~ /struct _(vir\w*Driver)/) {
+ my $grp = $1;
+ if ($grp ne "virStateDriver" &&
+ $grp ne "virStreamDriver") {
+ $ingrp = $grp;
+ $groups{$ingrp} = { apis => {}, drivers => {} };
+ }
+ } elsif ($ingrp) {
+ if ($line =~ /^\s*virDrv(\w+)\s+(\w+);\s*$/) {
+ my $field = $2;
+ my $name = $1;
+
+ my $api;
+ if (exists $apis{"vir$name"}) {
+ $api = "vir$name";
+ } elsif (exists $apis{"virConnect$name"}) {
+ $api = "virConnect$name";
+ } else {
+ die "driver $name does not have a public API";
+ }
+ $groups{$ingrp}->{apis}->{$field} = $api;
+ } elsif ($line =~ /};/) {
+ $ingrp = undef;
+ }
+ }
+}
+
+close FILE;
+
+
+# Finally, we read all the primary driver files and extract
+# the driver API tables from each one.
+
+foreach my $src (@srcs) {
+ open FILE, "<$src" or
+ die "cannot read $src: $!";
+
+ $ingrp = undef;
+ my $impl;
+ while (defined($line = <FILE>)) {
+ if (!$ingrp) {
+ foreach my $grp (keys %groups) {
+ if ($line =~ /^\s*(?:static\s+)?$grp\s+(\w+)\s*=\s*{/ ||
+ $line =~ /^\s*(?:static\s+)?$grp\s+NAME\(\w+\)\s*=\s*{/) {
+ $ingrp = $grp;
+ $impl = $src;
+ $impl =~ s,.*/(\w+?)_((\w+)_)?(\w+)\.c,$1,;
+ $groups{$ingrp}->{drivers}->{$impl} = {};
+ }
+ }
+
+ } else {
+ if ($line =~ m!\s*\.(\w+)\s*=\s*(\w+)\s*,?\s*(?:/\*\s*(\d+\.\d+\.\d+)\s*\*/\s*)?$!)
{
+ my $api = $1;
+ my $meth = $2;
+ my $vers = $3;
+
+ $vers = "Y" unless defined $vers;
+
+ die "Driver method for $api is NULL in $src" if $meth eq "NULL";
+
+ if (!exists($groups{$ingrp}->{apis}->{$api})) {
+ die "Found unexpected driver $api in $ingrp\n";
+ }
+
+ $groups{$ingrp}->{drivers}->{$impl}->{$api} = $vers;
+ } elsif ($line =~ /}/) {
+ $ingrp = undef;
+ }
+ }
+ }
+
+ close FILE;
+}
+
+
+# The '.open' driver method is used for 3 public APIs, so we
+# have a bit of manual fixup todo with the per-driver versioning
+# and support matrix
+
+$groups{virDriver}->{apis}->{"openAuth"} =
"virConnectOpenAuth";
+$groups{virDriver}->{apis}->{"openReadOnly"} =
"virConnectOpenReadOnly";
+
+my $openAuthVers = (0 * 1000 * 1000) + (4 * 1000) + 0;
+
+foreach my $drv (keys %{$groups{"virDriver"}->{drivers}}) {
+ my $openVersStr =
$groups{"virDriver"}->{drivers}->{$drv}->{"open"};
+ my $openVers;
+ if ($openVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
+ $openVers = ($1 * 1000 * 1000) + ($2 * 1000) + $3;
+ }
+
+ # virConnectOpenReadOnly always matches virConnectOpen version
+
$groups{"virDriver"}->{drivers}->{$drv}->{"openReadOnly"} =
+ $groups{"virDriver"}->{drivers}->{$drv}->{"open"};
+
+ # virConnectOpenAuth is always 0.4.0 if the driver existed
+ # before this time, otherwise it matches the version of
+ # the driver's virConnectOpen entry
+ if ($openVersStr eq "Y" ||
+ $openVers >= $openAuthVers) {
+ $groups{"virDriver"}->{drivers}->{$drv}->{"openAuth"} =
$openVersStr;
+ } else {
+ $groups{"virDriver"}->{drivers}->{$drv}->{"openAuth"} =
"0.4.0";
+ }
+}
+
+
+# Another special case for the virDomainCreateLinux which was replaced
+# with virDomainCreateXML
+$groups{virDriver}->{apis}->{"domainCreateLinux"} =
"virDomainCreateLinux";
+
+my $createAPIVers = (0 * 1000 * 1000) + (0 * 1000) + 3;
+
+foreach my $drv (keys %{$groups{"virDriver"}->{drivers}}) {
+ my $createVersStr =
$groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateXML"};
+ next unless defined $createVersStr;
+ my $createVers;
+ if ($createVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
+ $createVers = ($1 * 1000 * 1000) + ($2 * 1000) + $3;
+ }
+
+ # virCreateLinux is always 0.0.3 if the driver existed
+ # before this time, otherwise it matches the version of
+ # the driver's virCreateXML entry
+ if ($createVersStr eq "Y" ||
+ $createVers >= $createAPIVers) {
+ $groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateLinux"}
= $createVersStr;
+ } else {
+ $groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateLinux"}
= "0.0.3";
+ }
+}
+
+
+# Finally we generate the HTML file with the tables
+
+print <<EOF;
+<html>
+<head>
+<title>libvirt API support matrix</title>
+</head>
+<body>
+<h1>libvirt API support matrix</h1>
+
+<ul id="toc"></ul>
+
+<p>
+This page documents which <a href="html/">libvirt calls</a> work
on
+which libvirt drivers / hypervisors, and which version the API appeared
+in.
+</p>
+
+EOF
+
+foreach my $grp (sort { $a cmp $b } keys %groups) {
+ print "<h2><a name=\"$grp\">", $groupheaders{$grp},
"</a></h2>\n";
+ print <<EOF;
+<table class="top_table">
+<thead>
+<tr>
+<th>API</th>
+<th>Version</th>
+EOF
+
+ foreach my $drv (sort { $a cmp $b } keys %{$groups{$grp}->{drivers}}) {
+ print " <th>$drv</th>\n";
+ }
+
+ print <<EOF;
+</tr>
+</thead>
+<tbody>
+EOF
+
+ foreach my $field (sort {
+ $groups{$grp}->{apis}->{$a}
+ cmp
+ $groups{$grp}->{apis}->{$b}
+ } keys %{$groups{$grp}->{apis}}) {
+ my $api = $groups{$grp}->{apis}->{$field};
+ my $vers = $apis{$api};
+ print <<EOF;
+<tr>
+<td><a
href=\"html/libvirt-libvirt.html#$api\">$api</a></td>
+<td>$vers</td>
+EOF
+
+ foreach my $drv (sort {$a cmp $b } keys %{$groups{$grp}->{drivers}}) {
+ if (exists $groups{$grp}->{drivers}->{$drv}->{$field}) {
+ print "<td>", $groups{$grp}->{drivers}->{$drv}->{$field},
"</td>\n";
+ } else {
+ print "<td></td>\n";
+ }
+ }
+
+ print <<EOF;
+</tr>
+EOF
+ }
+
+ print <<EOF;
+</tbody>
+</table>
+EOF
+}
+
+print <<EOF;
+</body>
+</html>
+EOF
--
1.7.4.4