Connect: add auth/credential handling for connect
[ocaml-libvirt.git] / libvirt / libvirt.mli
1 (** OCaml bindings for libvirt. *)
2 (* (C) Copyright 2007-2015 Richard W.M. Jones, Red Hat Inc.
3    http://libvirt.org/
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2 of the License, or (at your option) any later version,
9    with the OCaml linking exception described in ../COPYING.LIB.
10
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with this library; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
19 *)
20
21 (**
22    {2 Introduction and examples}
23
24    This is a set of bindings for writing OCaml programs to
25    manage virtual machines through {{:http://libvirt.org/}libvirt}.
26
27    {3 Using libvirt interactively}
28
29    Using the interactive toplevel:
30
31 {v
32 $ ocaml -I +libvirt
33         Objective Caml version 3.10.0
34
35 # #load "unix.cma";;
36 # #load "mllibvirt.cma";;
37 # let name = "test:///default";;
38 val name : string = "test:///default"
39 # let conn = Libvirt.Connect.connect_readonly ~name () ;;
40 val conn : Libvirt.ro Libvirt.Connect.t = <abstr>
41 # Libvirt.Connect.get_node_info conn;;
42   : Libvirt.Connect.node_info =
43 {Libvirt.Connect.model = "i686"; Libvirt.Connect.memory = 3145728L;
44  Libvirt.Connect.cpus = 16; Libvirt.Connect.mhz = 1400;
45  Libvirt.Connect.nodes = 2; Libvirt.Connect.sockets = 2;
46  Libvirt.Connect.cores = 2; Libvirt.Connect.threads = 2}
47 v}
48
49    {3 Compiling libvirt programs}
50
51    This command compiles a program to native code:
52
53 {v
54 ocamlopt -I +libvirt mllibvirt.cmxa list_domains.ml -o list_domains
55 v}
56
57    {3 Example: Connect to the hypervisor}
58
59    The main modules are {!Libvirt.Connect}, {!Libvirt.Domain} and
60    {!Libvirt.Network} corresponding respectively to the
61    {{:http://libvirt.org/html/libvirt-libvirt.html}virConnect*, virDomain* and virNetwork* functions from libvirt}.
62    For brevity I usually rename these modules like this:
63
64 {[
65 module C = Libvirt.Connect
66 module D = Libvirt.Domain
67 module N = Libvirt.Network
68 ]}
69
70    To get a connection handle, assuming a Xen hypervisor:
71
72 {[
73 let name = "xen:///"
74 let conn = C.connect_readonly ~name ()
75 ]}
76
77    {3 Example: List running domains}
78
79 {[
80 open Printf
81
82 let domains = D.get_domains conn [D.ListActive] in
83 List.iter (
84   fun dom ->
85     printf "%8d %s\n%!" (D.get_id dom) (D.get_name dom)
86 ) domains;
87 ]}
88
89    {3 Example: List inactive domains}
90
91 {[
92 let domains = D.get_domains conn [D.ListInactive] in
93 List.iter (
94   fun dom ->
95     printf "inactive %s\n%!" (D.get_name dom)
96 ) domains;
97 ]}
98
99    {3 Example: Print node info}
100
101 {[
102 let node_info = C.get_node_info conn in
103 printf "model = %s\n" node_info.C.model;
104 printf "memory = %Ld K\n" node_info.C.memory;
105 printf "cpus = %d\n" node_info.C.cpus;
106 printf "mhz = %d\n" node_info.C.mhz;
107 printf "nodes = %d\n" node_info.C.nodes;
108 printf "sockets = %d\n" node_info.C.sockets;
109 printf "cores = %d\n" node_info.C.cores;
110 printf "threads = %d\n%!" node_info.C.threads;
111
112 let hostname = C.get_hostname conn in
113 printf "hostname = %s\n%!" hostname;
114
115 let uri = C.get_uri conn in
116 printf "uri = %s\n%!" uri
117 ]}
118
119 *)
120
121
122 (** {2 Programming issues}
123
124     {3 General safety issues}
125
126     Memory allocation / automatic garbage collection of all libvirt
127     objects should be completely safe.  If you find any safety issues
128     or if your pure OCaml program ever segfaults, please contact the author.
129
130     You can force a libvirt object to be freed early by calling
131     the [close] function on the object.  This shouldn't affect
132     the safety of garbage collection and should only be used when
133     you want to explicitly free memory.  Note that explicitly
134     closing a connection object does nothing if there are still
135     unclosed domain or network objects referencing it.
136
137     Note that even though you hold open (eg) a domain object, that
138     doesn't mean that the domain (virtual machine) actually exists.
139     The domain could have been shut down or deleted by another user.
140     Thus domain objects can raise odd exceptions at any time.
141     This is just the nature of virtualisation.
142
143     {3 Backwards and forwards compatibility}
144
145     OCaml-libvirt requires libvirt version 1.0.2 or later. Future
146     releases of OCaml-libvirt will use newer features of libvirt
147     and therefore will require later versions of libvirt. It is always
148     possible to dynamically link your application against a newer
149     libvirt than OCaml-libvirt was originally compiled against.
150
151     {3 Get list of domains and domain infos}
152
153     This is a very common operation, and libvirt supports various
154     different methods to do it.  We have hidden the complexity in a
155     flexible {!Libvirt.Domain.get_domains} and
156     {!Libvirt.Domain.get_domains_and_infos} calls which is easy to use and
157     automatically chooses the most efficient method depending on the
158     version of libvirt in use.
159
160     {3 Threads}
161
162     You can issue multiple concurrent libvirt requests in
163     different threads.  However you must follow this rule:
164     Each thread must have its own separate libvirt connection, {i or}
165     you must implement your own mutex scheme to ensure that no
166     two threads can ever make concurrent calls using the same
167     libvirt connection.
168
169     (Note that multithreaded code is not well tested.  If you find
170     bugs please report them.)
171
172     {3 Initialisation}
173
174     Libvirt requires all callers to call virInitialize before
175     using the library.  This is done automatically for you by
176     these bindings when the program starts up, and we believe
177     that the way this is done is safe.
178
179     {2 Reference}
180 *)
181
182 type uuid = string
183     (** This is a "raw" UUID, ie. a packed string of bytes. *)
184
185 type xml = string
186     (** Type of XML (an uninterpreted string of bytes).  Use PXP, expat,
187         xml-light, etc. if you want to do anything useful with the XML.
188     *)
189
190 type filename = string
191     (** A filename. *)
192
193 val get_version : ?driver:string -> unit -> int * int
194   (** [get_version ()] returns the library version in the first part
195       of the tuple, and [0] in the second part.
196
197       [get_version ~driver ()] returns the library version in the first
198       part of the tuple, and the version of the driver called [driver]
199       in the second part.
200
201       The version numbers are encoded as
202       1,000,000 * major + 1,000 * minor + release.
203   *)
204
205 val uuid_length : int
206   (** Length of packed UUIDs. *)
207
208 val uuid_string_length : int
209   (** Length of UUID strings. *)
210
211 type rw = [`R|`W]
212 type ro = [`R]
213     (** These
214         {{:http://caml.inria.fr/pub/ml-archives/caml-list/2004/07/80683af867cce6bf8fff273973f70c95.en.html}phantom types}
215         are used to ensure the type-safety of read-only
216         versus read-write connections.
217
218         All connection/domain/etc. objects are marked with
219         a phantom read-write or read-only type, and trying to
220         pass a read-only object into a function which could
221         mutate the object will cause a compile time error.
222
223         Each module provides a function like {!Libvirt.Connect.const}
224         to demote a read-write object into a read-only object.  The
225         opposite operation is, of course, not allowed.
226
227         If you want to handle both read-write and read-only
228         connections at runtime, use a variant similar to this:
229 {[
230 type conn_t =
231     | No_connection
232     | Read_only of Libvirt.ro Libvirt.Connect.t
233     | Read_write of Libvirt.rw Libvirt.Connect.t
234 ]}
235     *)
236
237 (** {3 Forward definitions}
238
239     These definitions are placed here to avoid the need to
240     use recursive module dependencies.
241 *)
242
243 (** {3 Connections} *)
244
245 module Connect :
246 sig
247   type 'rw t
248     (** Connection.  Read-only connections have type [ro Connect.t] and
249         read-write connections have type [rw Connect.t].
250       *)
251
252   type node_info = {
253     model : string;                     (** CPU model *)
254     memory : int64;                     (** memory size in kilobytes *)
255     cpus : int;                         (** number of active CPUs *)
256     mhz : int;                          (** expected CPU frequency *)
257     nodes : int;                        (** number of NUMA nodes (1 = UMA) *)
258     sockets : int;                      (** number of CPU sockets per node *)
259     cores : int;                        (** number of cores per socket *)
260     threads : int;                      (** number of threads per core *)
261   }
262
263   type credential_type =
264     | CredentialUsername                (** Identity to act as *)
265     | CredentialAuthname                (** Identify to authorize as *)
266     | CredentialLanguage                (** RFC 1766 languages, comma separated *)
267     | CredentialCnonce                  (** client supplies a nonce *)
268     | CredentialPassphrase              (** Passphrase secret *)
269     | CredentialEchoprompt              (** Challenge response *)
270     | CredentialNoechoprompt            (** Challenge response *)
271     | CredentialRealm                   (** Authentication realm *)
272     | CredentialExternal                (** Externally managed credential *)
273
274   type credential = {
275     typ : credential_type;              (** The type of credential *)
276     prompt : string;                    (** Prompt to show to user *)
277     challenge : string option;          (** Additional challenge to show *)
278     defresult : string option;          (** Optional default result *)
279   }
280
281   type auth = {
282     credtype : credential_type list;    (** List of supported credential_type values *)
283     cb : (credential list -> string option list);
284     (** Callback used to collect credentials.
285
286         The input is a list of all the requested credentials.
287
288         The function returns a list of all the results from the
289         requested credentials, so the number of results {e must} match
290         the number of input credentials.  Each result is optional,
291         and in case it is [None] it means there was no result.
292      *)
293   }
294
295   val connect : ?name:string -> unit -> rw t
296   val connect_readonly : ?name:string -> unit -> ro t
297     (** [connect ~name ()] connects to the hypervisor with URI [name].
298
299         [connect ()] connects to the default hypervisor.
300
301         [connect_readonly] is the same but connects in read-only mode.
302     *)
303
304   val connect_auth : ?name:string -> auth -> rw t
305   val connect_auth_readonly : ?name:string -> auth -> ro t
306
307   val close : [>`R] t -> unit
308     (** [close conn] closes and frees the connection object in memory.
309
310         The connection is automatically closed if it is garbage
311         collected.  This function just forces it to be closed
312         and freed right away.
313     *)
314
315   val get_type : [>`R] t -> string
316     (** Returns the name of the driver (hypervisor). *)
317
318   val get_version : [>`R] t -> int
319     (** Returns the driver version
320         [major * 1_000_000 + minor * 1000 + release]
321     *)
322   val get_hostname : [>`R] t -> string
323     (** Returns the hostname of the physical server. *)
324   val get_uri : [>`R] t -> string
325     (** Returns the canonical connection URI. *)
326   val get_max_vcpus : [>`R] t -> ?type_:string -> unit -> int
327     (** Returns the maximum number of virtual CPUs
328         supported by a guest VM of a particular type. *)
329   val list_domains : [>`R] t -> int -> int array
330     (** [list_domains conn max] returns the running domain IDs,
331         up to a maximum of [max] entries.
332
333         Call {!num_of_domains} first to get a value for [max].
334
335         See also:
336         {!Libvirt.Domain.get_domains},
337         {!Libvirt.Domain.get_domains_and_infos}.
338     *)
339   val num_of_domains : [>`R] t -> int
340     (** Returns the number of running domains. *)
341   val get_capabilities : [>`R] t -> xml
342     (** Returns the hypervisor capabilities (as XML). *)
343   val num_of_defined_domains : [>`R] t -> int
344     (** Returns the number of inactive (shutdown) domains. *)
345   val list_defined_domains : [>`R] t -> int -> string array
346     (** [list_defined_domains conn max]
347         returns the names of the inactive domains, up to
348         a maximum of [max] entries.
349
350         Call {!num_of_defined_domains} first to get a value for [max].
351
352         See also:
353         {!Libvirt.Domain.get_domains},
354         {!Libvirt.Domain.get_domains_and_infos}.
355     *)
356   val num_of_networks : [>`R] t -> int
357     (** Returns the number of networks. *)
358   val list_networks : [>`R] t -> int -> string array
359     (** [list_networks conn max]
360         returns the names of the networks, up to a maximum
361         of [max] entries.
362         Call {!num_of_networks} first to get a value for [max].
363     *)
364   val num_of_defined_networks : [>`R] t -> int
365     (** Returns the number of inactive networks. *)
366   val list_defined_networks : [>`R] t -> int -> string array
367     (** [list_defined_networks conn max]
368         returns the names of the inactive networks, up to a maximum
369         of [max] entries.
370         Call {!num_of_defined_networks} first to get a value for [max].
371     *)
372
373   val num_of_pools : [>`R] t -> int
374     (** Returns the number of storage pools. *)
375   val list_pools : [>`R] t -> int -> string array
376     (** Return list of storage pools. *)
377   val num_of_defined_pools : [>`R] t -> int
378     (** Returns the number of storage pools. *)
379   val list_defined_pools : [>`R] t -> int -> string array
380     (** Return list of storage pools. *)
381
382     (* The name of this function is inconsistent, but the inconsistency
383      * is really in libvirt itself.
384      *)
385   val get_node_info : [>`R] t -> node_info
386     (** Return information about the physical server. *)
387
388   val node_get_free_memory : [> `R] t -> int64
389     (**
390        [node_get_free_memory conn]
391        returns the amount of free memory (not allocated to any guest)
392        in the machine.
393     *)
394
395   val node_get_cells_free_memory : [> `R] t -> int -> int -> int64 array
396     (**
397        [node_get_cells_free_memory conn start max]
398        returns the amount of free memory on each NUMA cell in kilobytes.
399        [start] is the first cell for which we return free memory.
400        [max] is the maximum number of cells for which we return free memory.
401        Returns an array of up to [max] entries in length.
402     *)
403
404   val maxcpus_of_node_info : node_info -> int
405     (** Calculate the total number of CPUs supported (but not necessarily
406         active) in the host.
407     *)
408
409   val cpumaplen : int -> int
410     (** Calculate the length (in bytes) required to store the complete
411         CPU map between a single virtual and all physical CPUs of a domain.
412     *)
413
414   val use_cpu : bytes -> int -> unit
415     (** [use_cpu cpumap cpu] marks [cpu] as usable in [cpumap]. *)
416   val unuse_cpu : bytes -> int -> unit
417     (** [unuse_cpu cpumap cpu] marks [cpu] as not usable in [cpumap]. *)
418   val cpu_usable : bytes -> int -> int -> int -> bool
419     (** [cpu_usable cpumaps maplen vcpu cpu] checks returns true iff the
420         [cpu] is usable by [vcpu]. *)
421
422   val set_keep_alive : [>`R] t -> int -> int -> unit
423     (** [set_keep_alive conn interval count] starts sending keepalive
424         messages after [interval] seconds of inactivity and consider the
425         connection to be broken when no response is received after [count]
426         keepalive messages.
427         Note: the client has to implement and run an event loop to
428         be able to use keep-alive messages. *)
429
430   external const : [>`R] t -> ro t = "%identity"
431     (** [const conn] turns a read/write connection into a read-only
432         connection.  Note that the opposite operation is impossible.
433       *)
434 end
435   (** Module dealing with connections.  [Connect.t] is the
436       connection object. *)
437
438 (** {3 Domains} *)
439
440 module Domain :
441 sig
442   type 'rw t
443     (** Domain handle.  Read-only handles have type [ro Domain.t] and
444         read-write handles have type [rw Domain.t].
445     *)
446
447   type state =
448     | InfoNoState | InfoRunning | InfoBlocked | InfoPaused
449     | InfoShutdown | InfoShutoff | InfoCrashed
450
451   type info = {
452     state : state;                      (** running state *)
453     max_mem : int64;                    (** maximum memory in kilobytes *)
454     memory : int64;                     (** memory used in kilobytes *)
455     nr_virt_cpu : int;                  (** number of virtual CPUs *)
456     cpu_time : int64;                   (** CPU time used in nanoseconds *)
457   }
458
459   type vcpu_state = VcpuOffline | VcpuRunning | VcpuBlocked
460
461   type vcpu_info = {
462     number : int;                       (** virtual CPU number *)
463     vcpu_state : vcpu_state;            (** state *)
464     vcpu_time : int64;                  (** CPU time used in nanoseconds *)
465     cpu : int;                          (** real CPU number, -1 if offline *)
466   }
467
468   type domain_create_flag =
469   | START_PAUSED                        (** Launch guest in paused state *)
470   | START_AUTODESTROY                   (** Automatically kill guest on close *)
471   | START_BYPASS_CACHE                  (** Avoid filesystem cache pollution *)
472   | START_FORCE_BOOT                    (** Discard any managed save *)
473   | START_VALIDATE                      (** Validate XML against schema *)
474
475   type sched_param = string * sched_param_value
476   and sched_param_value =
477     | SchedFieldInt32 of int32 | SchedFieldUInt32 of int32
478     | SchedFieldInt64 of int64 | SchedFieldUInt64 of int64
479     | SchedFieldFloat of float | SchedFieldBool of bool
480
481   type typed_param = string * typed_param_value
482   and typed_param_value =
483     | TypedFieldInt32 of int32 | TypedFieldUInt32 of int32
484     | TypedFieldInt64 of int64 | TypedFieldUInt64 of int64
485     | TypedFieldFloat of float | TypedFieldBool of bool
486     | TypedFieldString of string
487
488   type migrate_flag = Live
489
490   type memory_flag = Virtual
491
492   type list_flag =
493     | ListActive
494     | ListInactive
495     | ListAll
496
497   type block_stats = {
498     rd_req : int64;
499     rd_bytes : int64;
500     wr_req : int64;
501     wr_bytes : int64;
502     errs : int64;
503   }
504
505   type interface_stats = {
506     rx_bytes : int64;
507     rx_packets : int64;
508     rx_errs : int64;
509     rx_drop : int64;
510     tx_bytes : int64;
511     tx_packets : int64;
512     tx_errs : int64;
513     tx_drop : int64;
514   }
515
516   type get_all_domain_stats_flag =
517     | GetAllDomainsStatsActive
518     | GetAllDomainsStatsInactive
519     | GetAllDomainsStatsOther
520     | GetAllDomainsStatsPaused
521     | GetAllDomainsStatsPersistent
522     | GetAllDomainsStatsRunning
523     | GetAllDomainsStatsShutoff
524     | GetAllDomainsStatsTransient
525     | GetAllDomainsStatsBacking
526     | GetAllDomainsStatsEnforceStats
527
528   type stats_type =
529     | StatsState | StatsCpuTotal | StatsBalloon | StatsVcpu
530     | StatsInterface | StatsBlock | StatsPerf
531
532   type domain_stats_record = {
533     dom_uuid : uuid;
534     params : typed_param array;
535   }
536
537   val max_peek : [>`R] t -> int
538     (** Maximum size supported by the {!block_peek} and {!memory_peek}
539         functions.  If you want to peek more than this then you must
540         break your request into chunks. *)
541
542   val create_linux : [>`W] Connect.t -> xml -> rw t
543     (** Create a new guest domain (not necessarily a Linux one)
544         from the given XML.  Use {!create_xml} instead.
545     *)
546   val create_xml : [>`W] Connect.t -> xml -> domain_create_flag list -> rw t
547     (** Create a new guest domain from the given XML. *)
548   val lookup_by_id : 'a Connect.t -> int -> 'a t
549     (** Lookup a domain by ID. *)
550   val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
551     (** Lookup a domain by UUID.  This uses the packed byte array UUID. *)
552   val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
553     (** Lookup a domain by (string) UUID. *)
554   val lookup_by_name : 'a Connect.t -> string -> 'a t
555     (** Lookup a domain by name. *)
556   val destroy : [>`W] t -> unit
557     (** Abruptly destroy a domain. *)
558   val free : [>`R] t -> unit
559     (** [free domain] frees the domain object in memory.
560
561         The domain object is automatically freed if it is garbage
562         collected.  This function just forces it to be freed right
563         away.
564     *)
565
566   val suspend : [>`W] t -> unit
567     (** Suspend a domain. *)
568   val resume : [>`W] t -> unit
569     (** Resume a domain. *)
570   val save : [>`W] t -> filename -> unit
571     (** Suspend a domain, then save it to the file. *)
572   val restore : [>`W] Connect.t -> filename -> unit
573     (** Restore a domain from a file. *)
574   val core_dump : [>`W] t -> filename -> unit
575     (** Force a domain to core dump to the named file. *)
576   val shutdown : [>`W] t -> unit
577     (** Shutdown a domain. *)
578   val reboot : [>`W] t -> unit
579     (** Reboot a domain. *)
580   val get_name : [>`R] t -> string
581     (** Get the domain name. *)
582   val get_uuid : [>`R] t -> uuid
583     (** Get the domain UUID (as a packed byte array). *)
584   val get_uuid_string : [>`R] t -> string
585     (** Get the domain UUID (as a printable string). *)
586   val get_id : [>`R] t -> int
587     (** [get_id dom] returns the ID of the domain.  In most cases
588         this returns [-1] if the domain is not running. *)
589   val get_os_type : [>`R] t -> string
590     (** Get the operating system type. *)
591   val get_max_memory : [>`R] t -> int64
592     (** Get the maximum memory allocation. *)
593   val set_max_memory : [>`W] t -> int64 -> unit
594     (** Set the maximum memory allocation. *)
595   val set_memory : [>`W] t -> int64 -> unit
596     (** Set the normal memory allocation. *)
597   val get_info : [>`R] t -> info
598     (** Get information about a domain. *)
599   val get_xml_desc : [>`R] t -> xml
600     (** Get the XML description of a domain. *)
601   val get_scheduler_type : [>`R] t -> string * int
602     (** Get the scheduler type. *)
603   val get_scheduler_parameters : [>`R] t -> int -> sched_param array
604     (** Get the array of scheduler parameters. *)
605   val set_scheduler_parameters : [>`W] t -> sched_param array -> unit
606     (** Set the array of scheduler parameters. *)
607   val define_xml : [>`W] Connect.t -> xml -> rw t
608     (** Define a new domain (but don't start it up) from the XML. *)
609   val undefine : [>`W] t -> unit
610     (** Undefine a domain - removes its configuration. *)
611   val create : [>`W] t -> unit
612     (** Launch a defined (inactive) domain. *)
613   val get_autostart : [>`R] t -> bool
614     (** Get the autostart flag for a domain. *)
615   val set_autostart : [>`W] t -> bool -> unit
616     (** Set the autostart flag for a domain. *)
617   val set_vcpus : [>`W] t -> int -> unit
618     (** Change the number of vCPUs available to a domain. *)
619   val pin_vcpu : [>`W] t -> int -> string -> unit
620     (** [pin_vcpu dom vcpu bitmap] pins a domain vCPU to a bitmap of physical
621         CPUs.  See the libvirt documentation for details of the
622         layout of the bitmap. *)
623   val get_vcpus : [>`R] t -> int -> int -> int * vcpu_info array * string
624     (** [get_vcpus dom maxinfo maplen] returns the pinning information
625         for a domain.  See the libvirt documentation for details
626         of the array and bitmap returned from this function.
627     *)
628   val get_cpu_stats : [>`R] t -> typed_param list array
629     (** [get_pcpu_stats dom] returns the physical CPU stats
630         for a domain.  See the libvirt documentation for details.
631     *)
632   val get_max_vcpus : [>`R] t -> int
633     (** Returns the maximum number of vCPUs supported for this domain. *)
634   val attach_device : [>`W] t -> xml -> unit
635     (** Attach a device (described by the device XML) to a domain. *)
636   val detach_device : [>`W] t -> xml -> unit
637     (** Detach a device (described by the device XML) from a domain. *)
638
639   val migrate : [>`W] t -> [>`W] Connect.t -> migrate_flag list ->
640     ?dname:string -> ?uri:string -> ?bandwidth:int -> unit -> rw t
641     (** [migrate dom dconn flags ()] migrates a domain to a
642         destination host described by [dconn].
643
644         The optional flag [?dname] is used to rename the domain.
645
646         The optional flag [?uri] is used to route the migration.
647
648         The optional flag [?bandwidth] is used to limit the bandwidth
649         used for migration (in Mbps). *)
650
651   val block_stats : [>`R] t -> string -> block_stats
652     (** Returns block device stats. *)
653   val interface_stats : [>`R] t -> string -> interface_stats
654     (** Returns network interface stats. *)
655
656   val block_peek : [>`W] t -> string -> int64 -> int -> string -> int -> unit
657     (** [block_peek dom path offset size buf boff] reads [size] bytes at
658         [offset] in the domain's [path] block device.
659
660         If successful then the data is written into [buf] starting
661         at offset [boff], for [size] bytes.
662
663         See also {!max_peek}. *)
664   val memory_peek : [>`W] t -> memory_flag list -> int64 -> int ->
665     string -> int -> unit
666     (** [memory_peek dom Virtual offset size] reads [size] bytes
667         at [offset] in the domain's virtual memory.
668
669         If successful then the data is written into [buf] starting
670         at offset [boff], for [size] bytes.
671
672         See also {!max_peek}. *)
673
674   external get_all_domain_stats : [>`R] Connect.t -> stats_type list -> get_all_domain_stats_flag list -> domain_stats_record array = "ocaml_libvirt_domain_get_all_domain_stats"
675     (** [get_all_domain_stats conn stats flags] allows you to read
676         all stats across multiple/all domains in a single call.
677
678         See the libvirt documentation for
679         [virConnectGetAllDomainStats]. *)
680
681   external const : [>`R] t -> ro t = "%identity"
682     (** [const dom] turns a read/write domain handle into a read-only
683         domain handle.  Note that the opposite operation is impossible.
684       *)
685
686   val get_domains : ([>`R] as 'a) Connect.t -> list_flag list -> 'a t list
687     (** Get the active and/or inactive domains using the most
688         efficient method available.
689
690         See also:
691         {!get_domains_and_infos},
692         {!Connect.list_domains},
693         {!Connect.list_defined_domains}.
694   *)
695
696   val get_domains_and_infos : ([>`R] as 'a) Connect.t -> list_flag list ->
697     ('a t * info) list
698     (** This gets the active and/or inactive domains and the
699         domain info for each one using the most efficient
700         method available.
701
702         See also:
703         {!get_domains},
704         {!Connect.list_domains},
705         {!Connect.list_defined_domains},
706         {!get_info}.
707     *)
708
709 end
710   (** Module dealing with domains.  [Domain.t] is the
711       domain object. *)
712
713 module Event :
714 sig
715
716   module Defined : sig
717     type t = [
718       | `Added          (** Newly created config file *)
719       | `Updated        (** Changed config file *)
720       | `Unknown of int
721     ]
722
723     val to_string: t -> string
724   end
725
726   module Undefined : sig
727     type t = [
728       | `Removed        (** Deleted the config file *)
729       | `Unknown of int
730     ]
731
732     val to_string: t -> string
733   end
734
735   module Started : sig
736     type t = [
737       | `Booted         (** Normal startup from boot *)
738       | `Migrated       (** Incoming migration from another host *)
739       | `Restored       (** Restored from a state file *)
740       | `FromSnapshot   (** Restored from snapshot *)
741       | `Wakeup         (** Started due to wakeup event *)
742       | `Unknown of int
743     ]
744
745     val to_string: t -> string
746   end
747
748   module Suspended : sig
749     type t = [
750       | `Paused        (** Normal suspend due to admin pause *)
751       | `Migrated      (** Suspended for offline migration *)
752       | `IOError       (** Suspended due to a disk I/O error *)
753       | `Watchdog      (** Suspended due to a watchdog firing *)
754       | `Restored      (** Restored from paused state file *)
755       | `FromSnapshot  (** Restored from paused snapshot *)
756       | `APIError      (** suspended after failure during libvirt API call *)
757       | `Unknown of int
758     ]
759
760     val to_string: t -> string
761   end
762
763   module Resumed : sig
764     type t = [
765       | `Unpaused      (** Normal resume due to admin unpause *)
766       | `Migrated      (** Resumed for completion of migration *)
767       | `FromSnapshot  (** Resumed from snapshot *)
768       | `Unknown of int
769     ]
770
771     val to_string: t -> string
772   end
773
774   module Stopped : sig
775     type t = [
776       | `Shutdown     (** Normal shutdown *)
777       | `Destroyed    (** Forced poweroff from host *)
778       | `Crashed      (** Guest crashed *)
779       | `Migrated     (** Migrated off to another host *)
780       | `Saved        (** Saved to a state file *)
781       | `Failed       (** Host emulator/mgmt failed *)
782       | `FromSnapshot (** offline snapshot loaded *)
783       | `Unknown of int
784     ]
785
786     val to_string: t -> string
787   end
788
789   module PM_suspended : sig
790     type t = [
791       | `Memory       (** Guest was PM suspended to memory *)
792       | `Disk         (** Guest was PM suspended to disk *)
793       | `Unknown of int
794     ]
795
796     val to_string: t -> string
797   end
798
799   module Lifecycle : sig
800     type t = [
801       | `Defined of Defined.t
802       | `Undefined of Undefined.t
803       | `Started of Started.t
804       | `Suspended of Suspended.t
805       | `Resumed of Resumed.t
806       | `Stopped of Stopped.t
807       | `Shutdown (* no detail defined yet *)
808       | `PMSuspended of PM_suspended.t
809       | `Unknown of int
810     ]
811
812     val to_string: t -> string
813   end
814
815   module Reboot : sig
816     type t = unit
817
818     val to_string: t -> string
819   end
820
821   module Rtc_change : sig
822     type t = int64
823
824     val to_string: t -> string
825   end
826
827   module Watchdog : sig
828     type t = [
829       | `None           (** No action, watchdog ignored *)
830       | `Pause          (** Guest CPUs are paused *)
831       | `Reset          (** Guest CPUs are reset *)
832       | `Poweroff       (** Guest is forcably powered off *)
833       | `Shutdown       (** Guest is requested to gracefully shutdown *)
834       | `Debug          (** No action, a debug message logged *)
835       | `Unknown of int (** newer libvirt *)
836     ]
837
838     val to_string: t -> string
839   end
840
841   module Io_error : sig
842     (** Represents both IOError and IOErrorReason *)
843     type action = [
844       | `None           (** No action, IO error ignored *)
845       | `Pause          (** Guest CPUs are paused *)
846       | `Report         (** IO error reported to guest OS *)
847       | `Unknown of int (** newer libvirt *)
848     ]
849
850     type t = {
851       src_path: string option;  (** The host file on which the I/O error occurred *)
852       dev_alias: string option; (** The guest device alias associated with the path *)
853       action: action;    (** The action that is to be taken due to the IO error *)
854       reason: string option;    (** The cause of the IO error *)
855     }
856
857     val to_string: t -> string
858   end
859
860   module Graphics_address : sig
861     type family = [
862       | `Ipv4           (** IPv4 address *)
863       | `Ipv6           (** IPv6 address *)
864       | `Unix           (** UNIX socket path *)
865       | `Unknown of int (** newer libvirt *)
866     ]
867
868     type t = {
869       family: family;         (** Address family *)
870       node: string option;    (** Address of node (eg IP address, or UNIX path *)
871       service: string option; (** Service name/number (eg TCP port, or NULL) *)
872     }
873
874     val to_string: t -> string
875   end
876
877   module Graphics_subject : sig
878     type identity = {
879       ty: string option;   (** Type of identity *)
880       name: string option; (** Identity value *)
881     }
882
883     type t = identity list
884
885     val to_string: t -> string
886   end
887
888   module Graphics : sig
889     type phase = [
890       | `Connect        (** Initial socket connection established *)
891       | `Initialize     (** Authentication & setup completed *)
892       | `Disconnect     (** Final socket disconnection *)
893       | `Unknown of int (** newer libvirt *)
894     ]
895
896     type t = {
897       phase: phase;                (** the phase of the connection *)
898       local: Graphics_address.t;   (** the local server address *)
899       remote: Graphics_address.t;  (** the remote client address *)
900       auth_scheme: string option;  (** the authentication scheme activated *)
901       subject: Graphics_subject.t; (** the authenticated subject (user) *)
902     }
903
904     val to_string: t -> string
905   end
906
907   module Control_error : sig
908     type t = unit
909
910     val to_string: t -> string
911   end
912
913   module Block_job : sig
914     type ty = [
915       | `KnownUnknown (** explicitly named UNKNOWN in the spec *)
916       | `Pull
917       | `Copy
918       | `Commit
919       | `Unknown of int
920     ]
921
922     type status = [
923       | `Completed
924       | `Failed
925       | `Cancelled
926       | `Ready
927       | `Unknown of int
928     ]
929
930     type t = {
931       disk: string option; (** fully-qualified name of the affected disk *)     
932       ty: ty;              (** type of block job *)
933       status: status;      (** final status of the operation *)
934     }
935
936     val to_string: t -> string
937   end
938
939   module Disk_change : sig
940     type reason = [
941       | `MissingOnStart
942       | `Unknown of int
943     ]
944
945     type t = {
946       old_src_path: string option; (** old source path *)
947       new_src_path: string option; (** new source path *)
948       dev_alias: string option;    (** device alias name *)
949       reason: reason;              (** reason why this callback was called *)
950     }
951
952     val to_string: t -> string
953   end
954
955   module Tray_change : sig
956     type reason = [
957       | `Open
958       | `Close
959       | `Unknown of int
960     ]
961
962     type t = {
963       dev_alias: string option; (** device alias *)
964       reason: reason;           (** why the tray status was changed *)
965     }
966
967     val to_string: t -> string
968   end
969
970   module PM_wakeup : sig
971     type reason = [
972       | `Unknown of int
973     ]
974
975     type t = reason
976
977     val to_string: t -> string
978   end
979
980   module PM_suspend : sig
981     type reason = [
982       | `Unknown of int
983     ]
984
985     type t = reason
986
987     val to_string: t -> string
988   end
989
990   module Balloon_change : sig
991     type t = int64
992
993     val to_string: t -> string
994   end
995
996   module PM_suspend_disk : sig
997     type reason = [
998       | `Unknown of int
999     ]
1000
1001     type t = reason
1002
1003     val to_string: t -> string
1004   end
1005
1006
1007   type callback =
1008     | Lifecycle     of ([`R] Domain.t -> Lifecycle.t -> unit)
1009     | Reboot        of ([`R] Domain.t -> Reboot.t -> unit)
1010     | RtcChange     of ([`R] Domain.t -> Rtc_change.t -> unit)
1011     | Watchdog      of ([`R] Domain.t -> Watchdog.t -> unit)
1012     | IOError       of ([`R] Domain.t -> Io_error.t -> unit)
1013     | Graphics      of ([`R] Domain.t -> Graphics.t -> unit)
1014     | IOErrorReason of ([`R] Domain.t -> Io_error.t -> unit)
1015     | ControlError  of ([`R] Domain.t -> Control_error.t -> unit)
1016     | BlockJob      of ([`R] Domain.t -> Block_job.t -> unit)
1017     | DiskChange    of ([`R] Domain.t -> Disk_change.t -> unit)
1018     | TrayChange    of ([`R] Domain.t -> Tray_change.t -> unit)
1019     | PMWakeUp      of ([`R] Domain.t -> PM_wakeup.t -> unit)
1020     | PMSuspend     of ([`R] Domain.t -> PM_suspend.t -> unit)
1021     | BalloonChange of ([`R] Domain.t -> Balloon_change.t -> unit)
1022     | PMSuspendDisk of ([`R] Domain.t -> PM_suspend_disk.t -> unit)
1023
1024     (** type of a registered call back function *)
1025
1026   val register_default_impl : unit -> unit
1027     (** Registers the default event loop based on poll(). This
1028         must be done before connections are opened.
1029
1030         Once registered call run_default_impl in a loop. *)
1031
1032   val run_default_impl : unit -> unit
1033     (** Runs one iteration of the event loop. Applications will
1034         generally want to have a thread which invokes this in an
1035         infinite loop. *)
1036
1037   type callback_id
1038     (** an individual event registration *)
1039
1040   val register_any : 'a Connect.t -> ?dom:'a Domain.t -> callback -> callback_id
1041     (** [register_any con ?dom callback] registers [callback]
1042         to receive notification of arbitrary domain events. Return
1043         a registration id which can be used in [deregister_any].
1044
1045         If [?dom] is None then register for this kind of event on
1046         all domains. If [dom] is [Some d] then register for this
1047         kind of event only on [d].
1048     *)
1049
1050   val deregister_any : 'a Connect.t -> callback_id -> unit
1051     (** [deregister_any con id] deregisters the previously registered
1052         callback with id [id]. *)
1053
1054   type timer_id
1055     (** an individual timer event *)
1056
1057   val add_timeout : 'a Connect.t -> int -> (unit -> unit) -> timer_id
1058     (** [add_timeout con ms cb] registers [cb] as a timeout callback
1059         which will be called every [ms] milliseconds *)
1060
1061   val remove_timeout : 'a Connect.t -> timer_id -> unit
1062     (** [remove_timeout con t] deregisters timeout callback [t]. *)
1063
1064 end
1065   (** Module dealing with events generated by domain
1066       state changes. *)
1067
1068 (** {3 Networks} *)
1069
1070 module Network : 
1071 sig
1072   type 'rw t
1073     (** Network handle.  Read-only handles have type [ro Network.t] and
1074         read-write handles have type [rw Network.t].
1075     *)
1076
1077   val lookup_by_name : 'a Connect.t -> string -> 'a t
1078     (** Lookup a network by name. *)
1079   val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
1080     (** Lookup a network by (packed) UUID. *)
1081   val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
1082     (** Lookup a network by UUID string. *)
1083   val create_xml : [>`W] Connect.t -> xml -> rw t
1084     (** Create a network. *)
1085   val define_xml : [>`W] Connect.t -> xml -> rw t
1086     (** Define but don't activate a network. *)
1087   val undefine : [>`W] t -> unit
1088     (** Undefine configuration of a network. *)
1089   val create : [>`W] t -> unit
1090     (** Start up a defined (inactive) network. *)
1091   val destroy : [>`W] t -> unit
1092     (** Destroy a network. *)
1093   val free : [>`R] t -> unit
1094     (** [free network] frees the network object in memory.
1095
1096         The network object is automatically freed if it is garbage
1097         collected.  This function just forces it to be freed right
1098         away.
1099     *)
1100
1101   val get_name : [>`R] t -> string
1102     (** Get network name. *)
1103   val get_uuid : [>`R] t -> uuid
1104     (** Get network packed UUID. *)
1105   val get_uuid_string : [>`R] t -> string
1106     (** Get network UUID as a printable string. *)
1107   val get_xml_desc : [>`R] t -> xml
1108     (** Get XML description of a network. *)
1109   val get_bridge_name : [>`R] t -> string
1110     (** Get bridge device name of a network. *)
1111   val get_autostart : [>`R] t -> bool
1112     (** Get the autostart flag for a network. *)
1113   val set_autostart : [>`W] t -> bool -> unit
1114     (** Set the autostart flag for a network. *)
1115
1116   external const : [>`R] t -> ro t = "%identity"
1117     (** [const network] turns a read/write network handle into a read-only
1118         network handle.  Note that the opposite operation is impossible.
1119       *)
1120 end
1121   (** Module dealing with networks.  [Network.t] is the
1122       network object. *)
1123
1124 (** {3 Storage pools} *)
1125
1126 module Pool :
1127 sig
1128   type 'rw t
1129     (** Storage pool handle. *)
1130
1131   type pool_state = Inactive | Building | Running | Degraded
1132     (** State of the storage pool. *)
1133
1134   type pool_build_flags = New | Repair | Resize
1135     (** Flags for creating a storage pool. *)
1136
1137   type pool_delete_flags = Normal | Zeroed
1138     (** Flags for deleting a storage pool. *)
1139
1140   type pool_info = {
1141     state : pool_state;                 (** Pool state. *)
1142     capacity : int64;                   (** Logical size in bytes. *)
1143     allocation : int64;                 (** Currently allocated in bytes. *)
1144     available : int64;                  (** Remaining free space bytes. *)
1145   }
1146
1147   val lookup_by_name : 'a Connect.t -> string -> 'a t
1148   val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
1149   val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
1150     (** Look up a storage pool by name, UUID or UUID string. *)
1151
1152   val create_xml : [>`W] Connect.t -> xml -> rw t
1153     (** Create a storage pool. *)
1154   val define_xml : [>`W] Connect.t -> xml -> rw t
1155     (** Define but don't activate a storage pool. *)
1156   val build : [>`W] t -> pool_build_flags -> unit
1157     (** Build a storage pool. *)
1158   val undefine : [>`W] t -> unit
1159     (** Undefine configuration of a storage pool. *)
1160   val create : [>`W] t -> unit
1161     (** Start up a defined (inactive) storage pool. *)
1162   val destroy : [>`W] t -> unit
1163     (** Destroy a storage pool. *)
1164   val delete : [>`W] t -> unit
1165     (** Delete a storage pool. *)
1166   val free : [>`R] t -> unit
1167     (** Free a storage pool object in memory.
1168
1169         The storage pool object is automatically freed if it is garbage
1170         collected.  This function just forces it to be freed right
1171         away.
1172     *)
1173   val refresh : [`R] t -> unit
1174     (** Refresh the list of volumes in the storage pool. *)
1175
1176   val get_name : [`R] t -> string
1177     (** Name of the pool. *)
1178   val get_uuid : [`R] t -> uuid
1179     (** Get the UUID (as a packed byte array). *)
1180   val get_uuid_string : [`R] t -> string
1181     (** Get the UUID (as a printable string). *)
1182   val get_info : [`R] t -> pool_info
1183     (** Get information about the pool. *)
1184   val get_xml_desc : [`R] t -> xml
1185     (** Get the XML description. *)
1186   val get_autostart : [`R] t -> bool
1187     (** Get the autostart flag for the storage pool. *)
1188   val set_autostart : [>`W] t -> bool -> unit
1189     (** Set the autostart flag for the storage pool. *)
1190
1191   val num_of_volumes : [`R] t -> int
1192     (** Returns the number of storage volumes within the storage pool. *)
1193   val list_volumes : [`R] t -> int -> string array
1194     (** Return list of storage volumes. *)
1195
1196   external const : [>`R] t -> ro t = "%identity"
1197     (** [const conn] turns a read/write storage pool into a read-only
1198         pool.  Note that the opposite operation is impossible.
1199       *)
1200 end
1201   (** Module dealing with storage pools. *)
1202
1203 (** {3 Storage volumes} *)
1204
1205 module Volume :
1206 sig
1207   type 'rw t
1208     (** Storage volume handle. *)
1209
1210   type vol_type = File | Block
1211     (** Type of a storage volume. *)
1212
1213   type vol_delete_flags = Normal | Zeroed
1214     (** Flags for deleting a storage volume. *)
1215
1216   type vol_info = {
1217     typ : vol_type;                     (** Type of storage volume. *)
1218     capacity : int64;                   (** Logical size in bytes. *)
1219     allocation : int64;                 (** Currently allocated in bytes. *)
1220   }
1221
1222   val lookup_by_name : 'a Pool.t -> string -> 'a t
1223   val lookup_by_key : 'a Connect.t -> string -> 'a t
1224   val lookup_by_path : 'a Connect.t -> string -> 'a t
1225     (** Look up a storage volume by name, key or path volume. *)
1226
1227   val pool_of_volume : 'a t -> 'a Pool.t
1228     (** Get the storage pool containing this volume. *)
1229
1230   val get_name : [`R] t -> string
1231     (** Name of the volume. *)
1232   val get_key : [`R] t -> string
1233     (** Key of the volume. *)
1234   val get_path : [`R] t -> string
1235     (** Path of the volume. *)
1236   val get_info : [`R] t -> vol_info
1237     (** Get information about the storage volume. *)
1238   val get_xml_desc : [`R] t -> xml
1239     (** Get the XML description. *)
1240
1241   val create_xml : [>`W] Pool.t -> xml -> unit
1242     (** Create a storage volume. *)
1243   val delete : [>`W] t -> vol_delete_flags -> unit
1244     (** Delete a storage volume. *)
1245   val free : [>`R] t -> unit
1246     (** Free a storage volume object in memory.
1247
1248         The storage volume object is automatically freed if it is garbage
1249         collected.  This function just forces it to be freed right
1250         away.
1251     *)
1252
1253   external const : [>`R] t -> ro t = "%identity"
1254     (** [const conn] turns a read/write storage volume into a read-only
1255         volume.  Note that the opposite operation is impossible.
1256       *)
1257 end
1258   (** Module dealing with storage volumes. *)
1259
1260 (** {3 Error handling and exceptions} *)
1261
1262 module Virterror :
1263 sig
1264   type code =
1265     | VIR_ERR_OK
1266     | VIR_ERR_INTERNAL_ERROR
1267     | VIR_ERR_NO_MEMORY
1268     | VIR_ERR_NO_SUPPORT
1269     | VIR_ERR_UNKNOWN_HOST
1270     | VIR_ERR_NO_CONNECT
1271     | VIR_ERR_INVALID_CONN
1272     | VIR_ERR_INVALID_DOMAIN
1273     | VIR_ERR_INVALID_ARG
1274     | VIR_ERR_OPERATION_FAILED
1275     | VIR_ERR_GET_FAILED
1276     | VIR_ERR_POST_FAILED
1277     | VIR_ERR_HTTP_ERROR
1278     | VIR_ERR_SEXPR_SERIAL
1279     | VIR_ERR_NO_XEN
1280     | VIR_ERR_XEN_CALL
1281     | VIR_ERR_OS_TYPE
1282     | VIR_ERR_NO_KERNEL
1283     | VIR_ERR_NO_ROOT
1284     | VIR_ERR_NO_SOURCE
1285     | VIR_ERR_NO_TARGET
1286     | VIR_ERR_NO_NAME
1287     | VIR_ERR_NO_OS
1288     | VIR_ERR_NO_DEVICE
1289     | VIR_ERR_NO_XENSTORE
1290     | VIR_ERR_DRIVER_FULL
1291     | VIR_ERR_CALL_FAILED
1292     | VIR_ERR_XML_ERROR
1293     | VIR_ERR_DOM_EXIST
1294     | VIR_ERR_OPERATION_DENIED
1295     | VIR_ERR_OPEN_FAILED
1296     | VIR_ERR_READ_FAILED
1297     | VIR_ERR_PARSE_FAILED
1298     | VIR_ERR_CONF_SYNTAX
1299     | VIR_ERR_WRITE_FAILED
1300     | VIR_ERR_XML_DETAIL
1301     | VIR_ERR_INVALID_NETWORK
1302     | VIR_ERR_NETWORK_EXIST
1303     | VIR_ERR_SYSTEM_ERROR
1304     | VIR_ERR_RPC
1305     | VIR_ERR_GNUTLS_ERROR
1306     | VIR_WAR_NO_NETWORK
1307     | VIR_ERR_NO_DOMAIN
1308     | VIR_ERR_NO_NETWORK
1309     | VIR_ERR_INVALID_MAC
1310     | VIR_ERR_AUTH_FAILED
1311     | VIR_ERR_INVALID_STORAGE_POOL
1312     | VIR_ERR_INVALID_STORAGE_VOL
1313     | VIR_WAR_NO_STORAGE
1314     | VIR_ERR_NO_STORAGE_POOL
1315     | VIR_ERR_NO_STORAGE_VOL
1316         (* ^^ NB: If you add a variant you MUST edit
1317            libvirt_c_epilogue.c:MAX_VIR_* *)
1318     | VIR_ERR_UNKNOWN of int
1319         (** See [<libvirt/virterror.h>] for meaning of these codes. *)
1320
1321   val string_of_code : code -> string
1322
1323   type domain =
1324     | VIR_FROM_NONE
1325     | VIR_FROM_XEN
1326     | VIR_FROM_XEND
1327     | VIR_FROM_XENSTORE
1328     | VIR_FROM_SEXPR
1329     | VIR_FROM_XML
1330     | VIR_FROM_DOM
1331     | VIR_FROM_RPC
1332     | VIR_FROM_PROXY
1333     | VIR_FROM_CONF
1334     | VIR_FROM_QEMU
1335     | VIR_FROM_NET
1336     | VIR_FROM_TEST
1337     | VIR_FROM_REMOTE
1338     | VIR_FROM_OPENVZ
1339     | VIR_FROM_XENXM
1340     | VIR_FROM_STATS_LINUX
1341     | VIR_FROM_STORAGE
1342         (* ^^ NB: If you add a variant you MUST edit
1343            libvirt_c_epilogue.c: MAX_VIR_* *)
1344     | VIR_FROM_UNKNOWN of int
1345         (** Subsystem / driver which produced the error. *)
1346
1347   val string_of_domain : domain -> string
1348
1349   type level =
1350     | VIR_ERR_NONE
1351     | VIR_ERR_WARNING
1352     | VIR_ERR_ERROR
1353         (* ^^ NB: If you add a variant you MUST edit libvirt_c.c: MAX_VIR_* *)
1354     | VIR_ERR_UNKNOWN_LEVEL of int
1355         (** No error, a warning or an error. *)
1356
1357   val string_of_level : level -> string
1358
1359   type t = {
1360     code : code;                        (** Error code. *)
1361     domain : domain;                    (** Origin of the error. *)
1362     message : string option;            (** Human-readable message. *)
1363     level : level;                      (** Error or warning. *)
1364     str1 : string option;               (** Informational string. *)
1365     str2 : string option;               (** Informational string. *)
1366     str3 : string option;               (** Informational string. *)
1367     int1 : int32;                       (** Informational integer. *)
1368     int2 : int32;                       (** Informational integer. *)
1369   }
1370     (** An error object. *)
1371
1372   val to_string : t -> string
1373     (** Turn the exception into a printable string. *)
1374
1375   val get_last_error : unit -> t option
1376   val get_last_conn_error : [>`R] Connect.t -> t option
1377     (** Get the last error at a global or connection level.
1378
1379         Normally you do not need to use these functions because
1380         the library automatically turns errors into exceptions.
1381     *)
1382
1383   val reset_last_error : unit -> unit
1384   val reset_last_conn_error : [>`R] Connect.t -> unit
1385     (** Reset the error at a global or connection level.
1386
1387         Normally you do not need to use these functions.
1388     *)
1389
1390   val no_error : unit -> t
1391     (** Creates an empty error message.
1392
1393         Normally you do not need to use this function.
1394     *)
1395 end
1396   (** Module dealing with errors. *)
1397
1398 exception Virterror of Virterror.t
1399 (** This exception can be raised by any library function that detects
1400     an error.  To get a printable error message, call
1401     {!Virterror.to_string} on the content of this exception.
1402 *)
1403
1404 exception Not_supported of string
1405 (**
1406     Functions may raise
1407     [Not_supported "virFoo"]
1408     (where [virFoo] is the libvirt function name) if a function is
1409     not supported at either compile or run time.  This applies to
1410     any libvirt function added after version 0.2.1.
1411
1412     See also {{:http://libvirt.org/hvsupport.html}http://libvirt.org/hvsupport.html}
1413 *)
1414
1415 (** {3 Utility functions} *)
1416
1417 val map_ignore_errors : ('a -> 'b) -> 'a list -> 'b list
1418 (** [map_ignore_errors f xs] calls function [f] for each element of [xs].
1419
1420     This is just like [List.map] except that if [f x] throws a
1421     {!Virterror.t} exception, the error is ignored and [f x]
1422     is not returned in the final list.
1423
1424     This function is primarily useful when dealing with domains which
1425     might 'disappear' asynchronously from the currently running
1426     program.
1427 *)