From 316befbb0ca0913de3fb968571e70fe9fa8fb3da Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Wed, 15 Apr 2009 20:42:50 +0000 Subject: [PATCH] Api documentation * docs/Makefile.am docs/api.html docs/api.html.in docs/archdomain.html docs/archnetwork.html docs/archnode.html docs/archstorage.html docs/goals.html docs/intro.html docs/libvirt-daemon-arch.fig docs/libvirt-daemon-arch.png docs/libvirt-driver-arch.fig docs/libvirt-driver-arch.png docs/libvirt-object-model.fig docs/libvirt-object-model.png docs/page.xsl docs/sitemap.html docs/sitemap.html.in: adding a new api page, extending the stylesheet to allow references and including images from Dan Berrange daniel --- ChangeLog | 12 ++ docs/Makefile.am | 11 +- docs/api.html | 242 ++++++++++++++++++++++++++++++++++ docs/api.html.in | 136 +++++++++++++++++++ docs/archdomain.html | 4 + docs/archnetwork.html | 4 + docs/archnode.html | 4 + docs/archstorage.html | 4 + docs/goals.html | 4 + docs/intro.html | 4 + docs/libvirt-daemon-arch.fig | 114 ++++++++++++++++ docs/libvirt-daemon-arch.png | Bin 0 -> 16479 bytes docs/libvirt-driver-arch.fig | 62 +++++++++ docs/libvirt-driver-arch.png | Bin 0 -> 16835 bytes docs/libvirt-object-model.fig | 61 +++++++++ docs/libvirt-object-model.png | Bin 0 -> 14327 bytes docs/page.xsl | 27 ++-- docs/sitemap.html | 3 + docs/sitemap.html.in | 4 + 19 files changed, 685 insertions(+), 11 deletions(-) create mode 100644 docs/api.html create mode 100644 docs/api.html.in create mode 100644 docs/libvirt-daemon-arch.fig create mode 100644 docs/libvirt-daemon-arch.png create mode 100644 docs/libvirt-driver-arch.fig create mode 100644 docs/libvirt-driver-arch.png create mode 100644 docs/libvirt-object-model.fig create mode 100644 docs/libvirt-object-model.png diff --git a/ChangeLog b/ChangeLog index 5d1d869f19..5b6b343db4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Wed Apr 15 22:40:50 CEST 2009 Daniel Veillard + + * docs/Makefile.am docs/api.html docs/api.html.in docs/archdomain.html + docs/archnetwork.html docs/archnode.html docs/archstorage.html + docs/goals.html docs/intro.html + docs/libvirt-daemon-arch.fig docs/libvirt-daemon-arch.png + docs/libvirt-driver-arch.fig docs/libvirt-driver-arch.png + docs/libvirt-object-model.fig docs/libvirt-object-model.png + docs/page.xsl docs/sitemap.html docs/sitemap.html.in: + adding a new api page, extending the stylesheet to allow references + and including images from Dan Berrange + Wed Apr 15 22:08:12 CEST 2009 Daniel Veillard * src/virsh.c: fix for virsh ttyconsole return value bug #495954 diff --git a/docs/Makefile.am b/docs/Makefile.am index abb0529152..4a55965213 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -29,6 +29,9 @@ 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 \ windows-cygwin-1.png \ windows-cygwin-2.png \ @@ -54,7 +57,10 @@ xml = \ fig = \ libvirt-net-logical.fig \ - libvirt-net-physical.fig + libvirt-net-physical.fig \ + libvirt-daemon-arch.fig \ + libvirt-driver-arch.fig \ + libvirt-object-model.fig EXTRA_DIST= \ libvirt-api.xml libvirt-refs.xml apibuild.py \ @@ -83,6 +89,9 @@ ChangeLog.html.in: ChangeLog.xml ChangeLog.xsl name=`echo $@ | sed -e 's/.tmp//'`; \ $(XSLTPROC) --nonet $(top_srcdir)/docs/ChangeLog.xsl $< > $@ || (rm $@ && exit 1) ; fi ) +%.png: %.fig + convert -rotate 90 $< $@ + %.html.tmp: %.html.in site.xsl page.xsl sitemap.html.in @(if [ -x $(XSLTPROC) ] ; then \ echo "Generating $@"; \ diff --git a/docs/api.html b/docs/api.html new file mode 100644 index 0000000000..e799e51618 --- /dev/null +++ b/docs/api.html @@ -0,0 +1,242 @@ + + + + + + + + + libvirt: The libvirt API concepts + + + + +
+ +
+

The libvirt API concepts

+

This page describes the main principles and architecture choices + behind the definition of the libvirt API: +

+ +

+ Objects exposed +

+

As defined in the goals section, libvirt + API need to expose all the resources needed to manage the virtualization + support of recent operating systems. The first object manipulated though + the API is virConnectPtr which represent a connection to + an hypervisor. Any application using libvirt is likely to start using the + API by calling one of the virConnectOpen functions. You will note that those functions take + a name argument which is actually an URI to select the right hypervisor to + open, this 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 connection + URI page for a full descriptions of the values allowed.

+

+

+

Once the application obtained a virConnectPtr + connection to the + hypervisor it can then use it to manage domains and related resources + available for virtualization like 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).

+

+ first class objects exposed by the API

+

The figure above shows the five main objects exported by the API:

+
  • virConnectPtr: represent a connection to an hypervisor.
  • virDomainPtr: represent one domain either active or defined (i.e. + existing as permanent config file and storage but not currently running + on that node). The function virConnectListDomains + allows to list all the IDs for the domains active on this hypervisor.
  • virNetworkPtr: represent one network either active or defined (i.e. + existing as permanent config file and storage but not currently activated. + The function virConnectListNetworks + allows to list all the virtualization networks actived on this node.
  • virStorageVolPtr: represent one storage volume, usually this is used + as a block device available to one of the domains. The function + virStorageVolLookupByPath allows to find + the object based on its path on the node.
  • virStoragePoolPtr: represent a storage pool, i.e. a logical area + which can be used to allocate and store storage volumes. The function + virStoragePoolLookupByVolume allows to find + the storage pool containing a given storage volume.
+

Most object 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.

+

Domains, network and storage pools can be either active + i.e. either running or available for immediate use, or + defined in which case they are inactive but there is + a permanent definition available in the system for them. Based on this + thay can be activated dynamically in order to be used.

+

Most kind of object can also be named in various ways:

+

+

+
  • by their name, an user friendly identifier but + whose unicity cannot be garanteed between two nodes.
  • by their ID, which is a runtime unique identifier + provided by the hypervisor for one given activation of the object, + but it becomes invalid once the resource is deactivated.
  • by their UUID, a 16 bytes unique identifier + as defined in RFC 4122, + which is garanteed to be unique for long term usage and across a + set of nodes.
+

+ Functions and naming + conventions +

+

The naming of the functions present in the library is usually + made of a prefix describing the object associated to the function + and a verb describing the action on that object.

+

For each first class object you will find apis + for the following actions:

+ +

For more in-depth details of the storage related APIs see + the storage management page, +

+

+ The libvirt drivers +

+

+

+ The libvirt driver architecture

+

+ Daemon and remote access +

+

+

+ The libvirt daemon and remote architecture

+
+
+ + + diff --git a/docs/api.html.in b/docs/api.html.in new file mode 100644 index 0000000000..0b9ffd3608 --- /dev/null +++ b/docs/api.html.in @@ -0,0 +1,136 @@ + + + +

The libvirt API concepts

+ +

This page describes the main principles and architecture choices + behind the definition of the libvirt API: +

+

Objects exposed

+

As defined in the goals section, libvirt + API need to expose all the resources needed to manage the virtualization + support of recent operating systems. The first object manipulated though + the API is virConnectPtr which represent a connection to + an hypervisor. Any application using libvirt is likely to start using the + API by calling one of the virConnectOpen functions. You will note that those functions take + a name argument which is actually an URI to select the right hypervisor to + open, this 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 connection + URI page for a full descriptions of the values allowed.

+

Once the application obtained a virConnectPtr + connection to the + hypervisor it can then use it to manage domains and related resources + available for virtualization like 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).

+

+ first class objects exposed by the API +

+

The figure above shows the five main objects exported by the API:

+
    +
  • virConnectPtr: represent a connection to an hypervisor.
  • +
  • virDomainPtr: represent one domain either active or defined (i.e. + existing as permanent config file and storage but not currently running + on that node). The function virConnectListDomains + allows to list all the IDs for the domains active on this hypervisor.
  • +
  • virNetworkPtr: represent one network either active or defined (i.e. + existing as permanent config file and storage but not currently activated. + The function virConnectListNetworks + allows to list all the virtualization networks actived on this node.
  • +
  • virStorageVolPtr: represent one storage volume, usually this is used + as a block device available to one of the domains. The function + virStorageVolLookupByPath allows to find + the object based on its path on the node.
  • +
  • virStoragePoolPtr: represent a storage pool, i.e. a logical area + which can be used to allocate and store storage volumes. The function + virStoragePoolLookupByVolume allows to find + the storage pool containing a given storage volume.
  • +
+

Most object 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.

+

Domains, network and storage pools can be either active + i.e. either running or available for immediate use, or + defined in which case they are inactive but there is + a permanent definition available in the system for them. Based on this + thay can be activated dynamically in order to be used.

+

Most kind of object can also be named in various ways:

+

    +
  • by their name, an user friendly identifier but + whose unicity cannot be garanteed between two nodes.
  • +
  • by their ID, which is a runtime unique identifier + provided by the hypervisor for one given activation of the object, + but it becomes invalid once the resource is deactivated.
  • +
  • by their UUID, a 16 bytes unique identifier + as defined in RFC 4122, + which is garanteed to be unique for long term usage and across a + set of nodes.
  • +
+ +

Functions and naming + conventions

+

The naming of the functions present in the library is usually + made of a prefix describing the object associated to the function + and a verb describing the action on that object.

+

For each first class object you will find apis + for the following actions:

+
    +
  • Lookup:...LookupByName, +
  • Enumeration:virConnectList... and virConnectNumOf...: + those are used to enumerate a set of object available to an given + hypervisor connection like: + virConnectListDomains, + virConnectNumOfDomains, + virConnectListNetworks, + virConnectListStoragePools, etc.
  • +
  • Description: ...GetInfo: those are generic accessor providing + a set of informations about an object, they are + virNodeGetInfo, + virDomainGetInfo, + virStoragePoolGetInfo, + virStorageVolGetInfo.
  • +
  • Accessors: ...Get... and ...Set...: those are more specific + accessors to query or modify the given object, like + virConnectGetType, + virDomainGetMaxMemory, + virDomainSetMemory, + virDomainGetVcpus, + virStoragePoolSetAutostart, + virNetworkGetBridgeName, etc.
  • +
  • Creation:
  • +
  • Destruction: ...
  • +
+

For more in-depth details of the storage related APIs see + the storage management page, +

The libvirt drivers

+

+

+ The libvirt driver architecture +

+

Daemon and remote access

+

+

+ The libvirt daemon and remote architecture +

+ + diff --git a/docs/archdomain.html b/docs/archdomain.html index a6b65b8e95..a404c25d43 100644 --- a/docs/archdomain.html +++ b/docs/archdomain.html @@ -50,6 +50,10 @@
Goals
+
  • +
    + API concepts +
  • Domains diff --git a/docs/archnetwork.html b/docs/archnetwork.html index 7498da7b5f..6f4f8c1a37 100644 --- a/docs/archnetwork.html +++ b/docs/archnetwork.html @@ -50,6 +50,10 @@ +
  • +
    + API concepts +
  • Domains diff --git a/docs/archnode.html b/docs/archnode.html index ee75ee98cd..d2e4cdfcf0 100644 --- a/docs/archnode.html +++ b/docs/archnode.html @@ -50,6 +50,10 @@ +
  • +
    + API concepts +
  • Domains diff --git a/docs/archstorage.html b/docs/archstorage.html index f3e6b54cd1..cc33db8b59 100644 --- a/docs/archstorage.html +++ b/docs/archstorage.html @@ -50,6 +50,10 @@ +
  • +
    + API concepts +
  • Domains diff --git a/docs/goals.html b/docs/goals.html index 1f45e2d520..5e24327f2a 100644 --- a/docs/goals.html +++ b/docs/goals.html @@ -50,6 +50,10 @@
    Goals
    +
  • +
    + API concepts +
  • Domains diff --git a/docs/intro.html b/docs/intro.html index 3a453859c6..c02e5bd985 100644 --- a/docs/intro.html +++ b/docs/intro.html @@ -50,6 +50,10 @@ +
  • +
    + API concepts +
  • Domains diff --git a/docs/libvirt-daemon-arch.fig b/docs/libvirt-daemon-arch.fig new file mode 100644 index 0000000000..cd9a4cf58b --- /dev/null +++ b/docs/libvirt-daemon-arch.fig @@ -0,0 +1,114 @@ +#FIG 3.2 Produced by xfig version 3.2.5 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 75 150 13050 5100 +6 4425 764 5938 1150 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 4425 764 5938 764 5938 1150 4425 1150 4425 764 +4 0 0 50 -1 16 15 0.0000 4 131 415 4519 1053 xen\001 +-6 +6 4425 1246 5938 1631 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 4425 1246 5938 1246 5938 1631 4425 1631 4425 1246 +4 0 0 50 -1 16 15 0.0000 4 178 640 4519 1535 qemu\001 +-6 +6 4425 1728 5938 2113 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 4425 1728 5938 1728 5938 2113 4425 2113 4425 1728 +4 0 0 50 -1 16 15 0.0000 4 178 829 4519 2017 openvz\001 +-6 +6 4425 2210 5938 2595 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 4425 2210 5938 2210 5938 2595 4425 2595 4425 2210 +4 0 0 50 -1 16 15 0.0000 4 178 320 4519 2499 lxc\001 +-6 +6 4425 2691 5938 3077 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 4425 2691 5938 2691 5938 3077 4425 3077 4425 2691 +4 0 0 50 -1 16 15 0.0000 4 166 415 4519 2980 test\001 +-6 +6 4425 3173 5938 3559 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 4425 3173 5938 3173 5938 3559 4425 3559 4425 3173 +4 0 0 50 -1 16 15 0.0000 4 166 794 4519 3462 remote\001 +-6 +6 11328 764 12842 1150 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 11328 764 12842 764 12842 1150 11328 1150 11328 764 +4 0 0 50 -1 16 15 0.0000 4 131 415 11423 1053 xen\001 +-6 +6 11328 1246 12842 1631 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 11328 1246 12842 1246 12842 1631 11328 1631 11328 1246 +4 0 0 50 -1 16 15 0.0000 4 178 640 11423 1535 qemu\001 +-6 +6 11328 1728 12842 2113 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 11328 1728 12842 1728 12842 2113 11328 2113 11328 1728 +4 0 0 50 -1 16 15 0.0000 4 178 829 11423 2017 openvz\001 +-6 +6 11328 2210 12842 2595 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 11328 2210 12842 2210 12842 2595 11328 2595 11328 2210 +4 0 0 50 -1 16 15 0.0000 4 178 320 11423 2499 lxc\001 +-6 +6 11328 2691 12842 3077 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 11328 2691 12842 2691 12842 3077 11328 3077 11328 2691 +4 0 0 50 -1 16 15 0.0000 4 166 415 11423 2980 test\001 +-6 +6 11328 3173 12842 3559 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 11328 3173 12842 3173 12842 3559 11328 3559 11328 3173 +4 0 0 50 -1 16 15 0.0000 4 166 794 11423 3462 remote\001 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 75 1342 1587 1342 1587 2113 75 2113 75 1342 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 76.37 152.74 + 1587 1728 3101 1728 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 4 + 0 0 1.00 76.37 152.74 + 5938 3365 6883 3365 7262 1728 7640 1728 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 4 + 0 0 1.00 76.37 152.74 + 3101 1728 3858 1728 4141 3365 4425 3365 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3101 572 6127 572 6127 3751 3101 3751 3101 572 +2 1 0 5 0 7 50 -1 -1 12.000 0 0 -1 0 0 2 + 3101 572 3101 3751 +2 1 2 5 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3858 572 3858 3751 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 76.37 152.74 + 9154 1728 10004 1728 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7640 1342 9154 1342 9154 2113 7640 2113 7640 1342 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 4 + 0 0 1.00 76.37 152.74 + 10004 1728 10760 1728 10950 2402 11328 2402 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 10004 572 13030 572 13030 3751 10004 3751 10004 572 +2 1 0 5 0 7 50 -1 -1 12.000 0 0 -1 0 0 2 + 10004 572 10004 3751 +2 1 2 5 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 10760 572 10760 3751 +4 0 0 50 -1 16 15 0.0000 4 225 1256 170 1728 Application\001 +4 0 0 50 -1 16 13 0.0000 4 154 367 1966 1631 URI\001 +4 0 0 50 -1 16 15 5.3233 4 178 1149 3763 4040 Driver API\001 +4 0 0 50 -1 16 15 5.3233 4 178 1173 3101 4040 Public API\001 +4 0 0 50 -1 16 15 5.3233 4 225 1233 4992 4040 Driver Impl\001 +4 0 0 50 -1 16 18 0.0000 4 213 652 3763 379 libvirt\001 +4 0 0 50 -1 16 13 0.0000 4 154 901 1966 2017 lxc://host/\001 +4 0 0 50 -1 16 15 0.0000 4 178 747 7734 1728 libvirtd\001 +4 0 0 50 -1 16 15 5.3233 4 178 1149 10666 4040 Driver API\001 +4 0 0 50 -1 16 15 5.3233 4 178 1173 10004 4040 Public API\001 +4 0 0 50 -1 16 15 5.3233 4 225 1233 11896 4040 Driver Impl\001 +4 0 0 50 -1 16 18 0.0000 4 213 652 10666 379 libvirt\001 +-6 diff --git a/docs/libvirt-daemon-arch.png b/docs/libvirt-daemon-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ed2f689112e45ffd5b108ed7a03f9808618d96 GIT binary patch literal 16479 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 DPjQ^D literal 0 Hc-jL100001 diff --git a/docs/libvirt-driver-arch.fig b/docs/libvirt-driver-arch.fig new file mode 100644 index 0000000000..c1964a5d1e --- /dev/null +++ b/docs/libvirt-driver-arch.fig @@ -0,0 +1,62 @@ +#FIG 3.2 Produced by xfig version 3.2.5 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 1200 225 10950 8147 +6 8208 1291 10646 1900 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 8208 1291 10646 1291 10646 1900 8208 1900 8208 1291 +4 0 0 50 -1 16 24 0.0000 4 214 639 8360 1748 xen\001 +-6 +6 8208 2054 10646 2662 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 8208 2054 10646 2054 10646 2662 8208 2662 8208 2054 +4 0 0 50 -1 16 24 0.0000 4 305 975 8360 2510 qemu\001 +-6 +6 8208 2815 10646 3424 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 8208 2815 10646 2815 10646 3424 8208 3424 8208 2815 +4 0 0 50 -1 16 24 0.0000 4 305 1280 8360 3272 openvz\001 +-6 +6 8208 3577 10646 4187 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 8208 3577 10646 3577 10646 4187 8208 4187 8208 3577 +4 0 0 50 -1 16 24 0.0000 4 304 518 8360 4033 lxc\001 +-6 +6 8208 4339 10646 4948 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 8208 4339 10646 4339 10646 4948 8208 4948 8208 4339 +4 0 0 50 -1 16 24 0.0000 4 274 670 8360 4795 test\001 +-6 +6 8208 5100 10646 5710 +2 2 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5 + 8208 5100 10646 5100 10646 5710 8208 5710 8208 5100 +4 0 0 50 -1 16 24 0.0000 4 274 1219 8360 5557 remote\001 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1200 2206 3637 2206 3637 3424 1200 3424 1200 2206 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 121.88 243.75 + 3637 2815 6075 2815 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 4 + 0 0 1.00 121.88 243.75 + 6075 2815 7294 2815 7598 3881 8208 3881 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6075 987 10950 987 10950 6014 6075 6014 6075 987 +2 1 0 5 0 7 50 -1 -1 12.000 0 0 -1 0 0 2 + 6075 987 6075 6014 +2 1 2 5 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 7294 987 7294 6014 +4 0 0 50 -1 16 24 0.0000 4 395 1950 1352 2815 Application\001 +4 0 0 50 -1 16 20 0.0000 4 244 579 4246 2662 URI\001 +4 0 0 50 -1 16 20 0.0000 4 244 792 4246 3272 lxc:///\001 +4 0 0 50 -1 16 24 5.3233 4 304 1828 7142 6472 Driver API\001 +4 0 0 50 -1 16 24 5.3233 4 304 1889 6075 6472 Public API\001 +4 0 0 50 -1 16 24 5.3233 4 395 1920 9121 6472 Driver Impl\001 +4 0 0 50 -1 16 28 0.0000 4 366 1157 7142 682 libvirt\001 +-6 diff --git a/docs/libvirt-driver-arch.png b/docs/libvirt-driver-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e9678929a72634170f699a9dd552ca40d7cb24 GIT binary patch literal 16835 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 qYrv^8Yg4T*hF + + + + + + + + + + + + + + + + @@ -143,16 +159,7 @@

    - - - - - - - - - - +