summaryrefslogtreecommitdiff
path: root/docs/api.html.in
blob: 85b196417a1dd454507a69ce81e94cc58660bee7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<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 id="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 id="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 a 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 id="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 id="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,
    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>