Add event callback implementation based on virConnectDomainEventRegisterAny
[ocaml-libvirt.git] / libvirt / libvirt.mli
1 (** OCaml bindings for libvirt. *)
2 (* (C) Copyright 2007 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   val connect : ?name:string -> unit -> rw t
264   val connect_readonly : ?name:string -> unit -> ro t
265     (** [connect ~name ()] connects to the hypervisor with URI [name].
266
267         [connect ()] connects to the default hypervisor.
268
269         [connect_readonly] is the same but connects in read-only mode.
270     *)
271
272   val close : [>`R] t -> unit
273     (** [close conn] closes and frees the connection object in memory.
274
275         The connection is automatically closed if it is garbage
276         collected.  This function just forces it to be closed
277         and freed right away.
278     *)
279
280   val get_type : [>`R] t -> string
281     (** Returns the name of the driver (hypervisor). *)
282
283   val get_version : [>`R] t -> int
284     (** Returns the driver version
285         [major * 1_000_000 + minor * 1000 + release]
286     *)
287   val get_hostname : [>`R] t -> string
288     (** Returns the hostname of the physical server. *)
289   val get_uri : [>`R] t -> string
290     (** Returns the canonical connection URI. *)
291   val get_max_vcpus : [>`R] t -> ?type_:string -> unit -> int
292     (** Returns the maximum number of virtual CPUs
293         supported by a guest VM of a particular type. *)
294   val list_domains : [>`R] t -> int -> int array
295     (** [list_domains conn max] returns the running domain IDs,
296         up to a maximum of [max] entries.
297
298         Call {!num_of_domains} first to get a value for [max].
299
300         See also:
301         {!Libvirt.Domain.get_domains},
302         {!Libvirt.Domain.get_domains_and_infos}.
303     *)
304   val num_of_domains : [>`R] t -> int
305     (** Returns the number of running domains. *)
306   val get_capabilities : [>`R] t -> xml
307     (** Returns the hypervisor capabilities (as XML). *)
308   val num_of_defined_domains : [>`R] t -> int
309     (** Returns the number of inactive (shutdown) domains. *)
310   val list_defined_domains : [>`R] t -> int -> string array
311     (** [list_defined_domains conn max]
312         returns the names of the inactive domains, up to
313         a maximum of [max] entries.
314
315         Call {!num_of_defined_domains} first to get a value for [max].
316
317         See also:
318         {!Libvirt.Domain.get_domains},
319         {!Libvirt.Domain.get_domains_and_infos}.
320     *)
321   val num_of_networks : [>`R] t -> int
322     (** Returns the number of networks. *)
323   val list_networks : [>`R] t -> int -> string array
324     (** [list_networks conn max]
325         returns the names of the networks, up to a maximum
326         of [max] entries.
327         Call {!num_of_networks} first to get a value for [max].
328     *)
329   val num_of_defined_networks : [>`R] t -> int
330     (** Returns the number of inactive networks. *)
331   val list_defined_networks : [>`R] t -> int -> string array
332     (** [list_defined_networks conn max]
333         returns the names of the inactive networks, up to a maximum
334         of [max] entries.
335         Call {!num_of_defined_networks} first to get a value for [max].
336     *)
337
338   val num_of_pools : [>`R] t -> int
339     (** Returns the number of storage pools. *)
340   val list_pools : [>`R] t -> int -> string array
341     (** Return list of storage pools. *)
342   val num_of_defined_pools : [>`R] t -> int
343     (** Returns the number of storage pools. *)
344   val list_defined_pools : [>`R] t -> int -> string array
345     (** Return list of storage pools. *)
346
347     (* The name of this function is inconsistent, but the inconsistency
348      * is really in libvirt itself.
349      *)
350   val get_node_info : [>`R] t -> node_info
351     (** Return information about the physical server. *)
352
353   val node_get_free_memory : [> `R] t -> int64
354     (**
355        [node_get_free_memory conn]
356        returns the amount of free memory (not allocated to any guest)
357        in the machine.
358     *)
359
360   val node_get_cells_free_memory : [> `R] t -> int -> int -> int64 array
361     (**
362        [node_get_cells_free_memory conn start max]
363        returns the amount of free memory on each NUMA cell in kilobytes.
364        [start] is the first cell for which we return free memory.
365        [max] is the maximum number of cells for which we return free memory.
366        Returns an array of up to [max] entries in length.
367     *)
368
369   val maxcpus_of_node_info : node_info -> int
370     (** Calculate the total number of CPUs supported (but not necessarily
371         active) in the host.
372     *)
373
374   val cpumaplen : int -> int
375     (** Calculate the length (in bytes) required to store the complete
376         CPU map between a single virtual and all physical CPUs of a domain.
377     *)
378
379   val use_cpu : string -> int -> unit
380     (** [use_cpu cpumap cpu] marks [cpu] as usable in [cpumap]. *)
381   val unuse_cpu : string -> int -> unit
382     (** [unuse_cpu cpumap cpu] marks [cpu] as not usable in [cpumap]. *)
383   val cpu_usable : string -> int -> int -> int -> bool
384     (** [cpu_usable cpumaps maplen vcpu cpu] checks returns true iff the
385         [cpu] is usable by [vcpu]. *)
386
387   val set_keep_alive : [>`R] t -> int -> int -> unit
388     (** [set_keep_alive conn interval count] starts sending keepalive
389         messages after [interval] seconds of inactivity and consider the
390         connection to be broken when no response is received after [count]
391         keepalive messages.
392         Note: the client has to implement and run an event loop to
393         be able to use keep-alive messages. *)
394
395   external const : [>`R] t -> ro t = "%identity"
396     (** [const conn] turns a read/write connection into a read-only
397         connection.  Note that the opposite operation is impossible.
398       *)
399 end
400   (** Module dealing with connections.  [Connect.t] is the
401       connection object. *)
402
403 (** {3 Domains} *)
404
405 module Domain :
406 sig
407   type 'rw t
408     (** Domain handle.  Read-only handles have type [ro Domain.t] and
409         read-write handles have type [rw Domain.t].
410     *)
411
412   type state =
413     | InfoNoState | InfoRunning | InfoBlocked | InfoPaused
414     | InfoShutdown | InfoShutoff | InfoCrashed
415
416   type info = {
417     state : state;                      (** running state *)
418     max_mem : int64;                    (** maximum memory in kilobytes *)
419     memory : int64;                     (** memory used in kilobytes *)
420     nr_virt_cpu : int;                  (** number of virtual CPUs *)
421     cpu_time : int64;                   (** CPU time used in nanoseconds *)
422   }
423
424   type vcpu_state = VcpuOffline | VcpuRunning | VcpuBlocked
425
426   type vcpu_info = {
427     number : int;                       (** virtual CPU number *)
428     vcpu_state : vcpu_state;            (** state *)
429     vcpu_time : int64;                  (** CPU time used in nanoseconds *)
430     cpu : int;                          (** real CPU number, -1 if offline *)
431   }
432
433   type sched_param = string * sched_param_value
434   and sched_param_value =
435     | SchedFieldInt32 of int32 | SchedFieldUInt32 of int32
436     | SchedFieldInt64 of int64 | SchedFieldUInt64 of int64
437     | SchedFieldFloat of float | SchedFieldBool of bool
438
439   type typed_param = string * typed_param_value
440   and typed_param_value =
441     | TypedFieldInt32 of int32 | TypedFieldUInt32 of int32
442     | TypedFieldInt64 of int64 | TypedFieldUInt64 of int64
443     | TypedFieldFloat of float | TypedFieldBool of bool
444     | TypedFieldString of string
445
446   type migrate_flag = Live
447
448   type memory_flag = Virtual
449
450   type list_flag =
451     | ListActive
452     | ListInactive
453     | ListAll
454
455   type block_stats = {
456     rd_req : int64;
457     rd_bytes : int64;
458     wr_req : int64;
459     wr_bytes : int64;
460     errs : int64;
461   }
462
463   type interface_stats = {
464     rx_bytes : int64;
465     rx_packets : int64;
466     rx_errs : int64;
467     rx_drop : int64;
468     tx_bytes : int64;
469     tx_packets : int64;
470     tx_errs : int64;
471     tx_drop : int64;
472   }
473
474   val max_peek : [>`R] t -> int
475     (** Maximum size supported by the {!block_peek} and {!memory_peek}
476         functions.  If you want to peek more than this then you must
477         break your request into chunks. *)
478
479   val create_linux : [>`W] Connect.t -> xml -> rw t
480     (** Create a new guest domain (not necessarily a Linux one)
481         from the given XML.
482     *)
483   val lookup_by_id : 'a Connect.t -> int -> 'a t
484     (** Lookup a domain by ID. *)
485   val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
486     (** Lookup a domain by UUID.  This uses the packed byte array UUID. *)
487   val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
488     (** Lookup a domain by (string) UUID. *)
489   val lookup_by_name : 'a Connect.t -> string -> 'a t
490     (** Lookup a domain by name. *)
491   val destroy : [>`W] t -> unit
492     (** Abruptly destroy a domain. *)
493   val free : [>`R] t -> unit
494     (** [free domain] frees the domain object in memory.
495
496         The domain object is automatically freed if it is garbage
497         collected.  This function just forces it to be freed right
498         away.
499     *)
500
501   val suspend : [>`W] t -> unit
502     (** Suspend a domain. *)
503   val resume : [>`W] t -> unit
504     (** Resume a domain. *)
505   val save : [>`W] t -> filename -> unit
506     (** Suspend a domain, then save it to the file. *)
507   val restore : [>`W] Connect.t -> filename -> unit
508     (** Restore a domain from a file. *)
509   val core_dump : [>`W] t -> filename -> unit
510     (** Force a domain to core dump to the named file. *)
511   val shutdown : [>`W] t -> unit
512     (** Shutdown a domain. *)
513   val reboot : [>`W] t -> unit
514     (** Reboot a domain. *)
515   val get_name : [>`R] t -> string
516     (** Get the domain name. *)
517   val get_uuid : [>`R] t -> uuid
518     (** Get the domain UUID (as a packed byte array). *)
519   val get_uuid_string : [>`R] t -> string
520     (** Get the domain UUID (as a printable string). *)
521   val get_id : [>`R] t -> int
522     (** [get_id dom] returns the ID of the domain.  In most cases
523         this returns [-1] if the domain is not running. *)
524   val get_os_type : [>`R] t -> string
525     (** Get the operating system type. *)
526   val get_max_memory : [>`R] t -> int64
527     (** Get the maximum memory allocation. *)
528   val set_max_memory : [>`W] t -> int64 -> unit
529     (** Set the maximum memory allocation. *)
530   val set_memory : [>`W] t -> int64 -> unit
531     (** Set the normal memory allocation. *)
532   val get_info : [>`R] t -> info
533     (** Get information about a domain. *)
534   val get_xml_desc : [>`R] t -> xml
535     (** Get the XML description of a domain. *)
536   val get_scheduler_type : [>`R] t -> string * int
537     (** Get the scheduler type. *)
538   val get_scheduler_parameters : [>`R] t -> int -> sched_param array
539     (** Get the array of scheduler parameters. *)
540   val set_scheduler_parameters : [>`W] t -> sched_param array -> unit
541     (** Set the array of scheduler parameters. *)
542   val define_xml : [>`W] Connect.t -> xml -> rw t
543     (** Define a new domain (but don't start it up) from the XML. *)
544   val undefine : [>`W] t -> unit
545     (** Undefine a domain - removes its configuration. *)
546   val create : [>`W] t -> unit
547     (** Launch a defined (inactive) domain. *)
548   val get_autostart : [>`R] t -> bool
549     (** Get the autostart flag for a domain. *)
550   val set_autostart : [>`W] t -> bool -> unit
551     (** Set the autostart flag for a domain. *)
552   val set_vcpus : [>`W] t -> int -> unit
553     (** Change the number of vCPUs available to a domain. *)
554   val pin_vcpu : [>`W] t -> int -> string -> unit
555     (** [pin_vcpu dom vcpu bitmap] pins a domain vCPU to a bitmap of physical
556         CPUs.  See the libvirt documentation for details of the
557         layout of the bitmap. *)
558   val get_vcpus : [>`R] t -> int -> int -> int * vcpu_info array * string
559     (** [get_vcpus dom maxinfo maplen] returns the pinning information
560         for a domain.  See the libvirt documentation for details
561         of the array and bitmap returned from this function.
562     *)
563   val get_cpu_stats : [>`R] t -> typed_param list array
564     (** [get_pcpu_stats dom] returns the physical CPU stats
565         for a domain.  See the libvirt documentation for details.
566     *)
567   val get_max_vcpus : [>`R] t -> int
568     (** Returns the maximum number of vCPUs supported for this domain. *)
569   val attach_device : [>`W] t -> xml -> unit
570     (** Attach a device (described by the device XML) to a domain. *)
571   val detach_device : [>`W] t -> xml -> unit
572     (** Detach a device (described by the device XML) from a domain. *)
573
574   val migrate : [>`W] t -> [>`W] Connect.t -> migrate_flag list ->
575     ?dname:string -> ?uri:string -> ?bandwidth:int -> unit -> rw t
576     (** [migrate dom dconn flags ()] migrates a domain to a
577         destination host described by [dconn].
578
579         The optional flag [?dname] is used to rename the domain.
580
581         The optional flag [?uri] is used to route the migration.
582
583         The optional flag [?bandwidth] is used to limit the bandwidth
584         used for migration (in Mbps). *)
585
586   val block_stats : [>`R] t -> string -> block_stats
587     (** Returns block device stats. *)
588   val interface_stats : [>`R] t -> string -> interface_stats
589     (** Returns network interface stats. *)
590
591   val block_peek : [>`W] t -> string -> int64 -> int -> string -> int -> unit
592     (** [block_peek dom path offset size buf boff] reads [size] bytes at
593         [offset] in the domain's [path] block device.
594
595         If successful then the data is written into [buf] starting
596         at offset [boff], for [size] bytes.
597
598         See also {!max_peek}. *)
599   val memory_peek : [>`W] t -> memory_flag list -> int64 -> int ->
600     string -> int -> unit
601     (** [memory_peek dom Virtual offset size] reads [size] bytes
602         at [offset] in the domain's virtual memory.
603
604         If successful then the data is written into [buf] starting
605         at offset [boff], for [size] bytes.
606
607         See also {!max_peek}. *)
608
609   external const : [>`R] t -> ro t = "%identity"
610     (** [const dom] turns a read/write domain handle into a read-only
611         domain handle.  Note that the opposite operation is impossible.
612       *)
613
614   val get_domains : ([>`R] as 'a) Connect.t -> list_flag list -> 'a t list
615     (** Get the active and/or inactive domains using the most
616         efficient method available.
617
618         See also:
619         {!get_domains_and_infos},
620         {!Connect.list_domains},
621         {!Connect.list_defined_domains}.
622   *)
623
624   val get_domains_and_infos : ([>`R] as 'a) Connect.t -> list_flag list ->
625     ('a t * info) list
626     (** This gets the active and/or inactive domains and the
627         domain info for each one using the most efficient
628         method available.
629
630         See also:
631         {!get_domains},
632         {!Connect.list_domains},
633         {!Connect.list_defined_domains},
634         {!get_info}.
635     *)
636
637 end
638   (** Module dealing with domains.  [Domain.t] is the
639       domain object. *)
640
641 module Event :
642 sig
643
644   module Defined : sig
645     type t = [
646       | `Added          (** Newly created config file *)
647       | `Updated        (** Changed config file *)
648       | `Unknown of int
649     ]
650
651     val to_string: t -> string
652   end
653
654   module Undefined : sig
655     type t = [
656       | `Removed        (** Deleted the config file *)
657       | `Unknown of int
658     ]
659
660     val to_string: t -> string
661   end
662
663   module Started : sig
664     type t = [
665       | `Booted         (** Normal startup from boot *)
666       | `Migrated       (** Incoming migration from another host *)
667       | `Restored       (** Restored from a state file *)
668       | `FromSnapshot   (** Restored from snapshot *)
669       | `Wakeup         (** Started due to wakeup event *)
670       | `Unknown of int
671     ]
672
673     val to_string: t -> string
674   end
675
676   module Suspended : sig
677     type t = [
678       | `Paused        (** Normal suspend due to admin pause *)
679       | `Migrated      (** Suspended for offline migration *)
680       | `IOError       (** Suspended due to a disk I/O error *)
681       | `Watchdog      (** Suspended due to a watchdog firing *)
682       | `Restored      (** Restored from paused state file *)
683       | `FromSnapshot  (** Restored from paused snapshot *)
684       | `APIError      (** suspended after failure during libvirt API call *)
685       | `Unknown of int
686     ]
687
688     val to_string: t -> string
689   end
690
691   module Resumed : sig
692     type t = [
693       | `Unpaused      (** Normal resume due to admin unpause *)
694       | `Migrated      (** Resumed for completion of migration *)
695       | `FromSnapshot  (** Resumed from snapshot *)
696       | `Unknown of int
697     ]
698
699     val to_string: t -> string
700   end
701
702   module Stopped : sig
703     type t = [
704       | `Shutdown     (** Normal shutdown *)
705       | `Destroyed    (** Forced poweroff from host *)
706       | `Crashed      (** Guest crashed *)
707       | `Migrated     (** Migrated off to another host *)
708       | `Saved        (** Saved to a state file *)
709       | `Failed       (** Host emulator/mgmt failed *)
710       | `FromSnapshot (** offline snapshot loaded *)
711       | `Unknown of int
712     ]
713
714     val to_string: t -> string
715   end
716
717   module PM_suspended : sig
718     type t = [
719       | `Memory       (** Guest was PM suspended to memory *)
720       | `Disk         (** Guest was PM suspended to disk *)
721       | `Unknown of int
722     ]
723
724     val to_string: t -> string
725   end
726
727   module Lifecycle : sig
728     type t = [
729       | `Defined of Defined.t
730       | `Undefined of Undefined.t
731       | `Started of Started.t
732       | `Suspended of Suspended.t
733       | `Resumed of Resumed.t
734       | `Stopped of Stopped.t
735       | `Shutdown (* no detail defined yet *)
736       | `PMSuspended of PM_suspended.t
737       | `Unknown of int
738     ]
739
740     val to_string: t -> string
741   end
742
743   module Reboot : sig
744     type t = unit
745
746     val to_string: t -> string
747   end
748
749   module Rtc_change : sig
750     type t = int64
751
752     val to_string: t -> string
753   end
754
755   module Watchdog : sig
756     type t = [
757       | `None           (** No action, watchdog ignored *)
758       | `Pause          (** Guest CPUs are paused *)
759       | `Reset          (** Guest CPUs are reset *)
760       | `Poweroff       (** Guest is forcably powered off *)
761       | `Shutdown       (** Guest is requested to gracefully shutdown *)
762       | `Debug          (** No action, a debug message logged *)
763       | `Unknown of int (** newer libvirt *)
764     ]
765
766     val to_string: t -> string
767   end
768
769   module Io_error : sig
770     (** Represents both IOError and IOErrorReason *)
771     type action = [
772       | `None           (** No action, IO error ignored *)
773       | `Pause          (** Guest CPUs are paused *)
774       | `Report         (** IO error reported to guest OS *)
775       | `Unknown of int (** newer libvirt *)
776     ]
777
778     type t = {
779       src_path: string option;  (** The host file on which the I/O error occurred *)
780       dev_alias: string option; (** The guest device alias associated with the path *)
781       action: action;    (** The action that is to be taken due to the IO error *)
782       reason: string option;    (** The cause of the IO error *)
783     }
784
785     val to_string: t -> string
786   end
787
788   module Graphics_address : sig
789     type family = [
790       | `Ipv4           (** IPv4 address *)
791       | `Ipv6           (** IPv6 address *)
792       | `Unix           (** UNIX socket path *)
793       | `Unknown of int (** newer libvirt *)
794     ]
795
796     type t = {
797       family: family;         (** Address family *)
798       node: string option;    (** Address of node (eg IP address, or UNIX path *)
799       service: string option; (** Service name/number (eg TCP port, or NULL) *)
800     }
801
802     val to_string: t -> string
803   end
804
805   module Graphics_subject : sig
806     type identity = {
807       ty: string option;   (** Type of identity *)
808       name: string option; (** Identity value *)
809     }
810
811     type t = identity list
812
813     val to_string: t -> string
814   end
815
816   module Graphics : sig
817     type phase = [
818       | `Connect        (** Initial socket connection established *)
819       | `Initialize     (** Authentication & setup completed *)
820       | `Disconnect     (** Final socket disconnection *)
821       | `Unknown of int (** newer libvirt *)
822     ]
823
824     type t = {
825       phase: phase;                (** the phase of the connection *)
826       local: Graphics_address.t;   (** the local server address *)
827       remote: Graphics_address.t;  (** the remote client address *)
828       auth_scheme: string option;  (** the authentication scheme activated *)
829       subject: Graphics_subject.t; (** the authenticated subject (user) *)
830     }
831
832     val to_string: t -> string
833   end
834
835   module Control_error : sig
836     type t = unit
837
838     val to_string: t -> string
839   end
840
841   module Block_job : sig
842     type ty = [
843       | `KnownUnknown (** explicitly named UNKNOWN in the spec *)
844       | `Pull
845       | `Copy
846       | `Commit
847       | `Unknown of int
848     ]
849
850     type status = [
851       | `Completed
852       | `Failed
853       | `Cancelled
854       | `Ready
855       | `Unknown of int
856     ]
857
858     type t = {
859       disk: string option; (** fully-qualified name of the affected disk *)     
860       ty: ty;              (** type of block job *)
861       status: status;      (** final status of the operation *)
862     }
863
864     val to_string: t -> string
865   end
866
867   module Disk_change : sig
868     type reason = [
869       | `MissingOnStart
870       | `Unknown of int
871     ]
872
873     type t = {
874       old_src_path: string option; (** old source path *)
875       new_src_path: string option; (** new source path *)
876       dev_alias: string option;    (** device alias name *)
877       reason: reason;              (** reason why this callback was called *)
878     }
879
880     val to_string: t -> string
881   end
882
883   module Tray_change : sig
884     type reason = [
885       | `Open
886       | `Close
887       | `Unknown of int
888     ]
889
890     type t = {
891       dev_alias: string option; (** device alias *)
892       reason: reason;           (** why the tray status was changed *)
893     }
894
895     val to_string: t -> string
896   end
897
898   module PM_wakeup : sig
899     type reason = [
900       | `Unknown of int
901     ]
902
903     type t = reason
904
905     val to_string: t -> string
906   end
907
908   module PM_suspend : sig
909     type reason = [
910       | `Unknown of int
911     ]
912
913     type t = reason
914
915     val to_string: t -> string
916   end
917
918   module Balloon_change : sig
919     type t = int64
920
921     val to_string: t -> string
922   end
923
924   module PM_suspend_disk : sig
925     type reason = [
926       | `Unknown of int
927     ]
928
929     type t = reason
930
931     val to_string: t -> string
932   end
933
934
935   type callback =
936     | Lifecycle     of ([`R] Domain.t -> Lifecycle.t -> unit)
937     | Reboot        of ([`R] Domain.t -> Reboot.t -> unit)
938     | RtcChange     of ([`R] Domain.t -> Rtc_change.t -> unit)
939     | Watchdog      of ([`R] Domain.t -> Watchdog.t -> unit)
940     | IOError       of ([`R] Domain.t -> Io_error.t -> unit)
941     | Graphics      of ([`R] Domain.t -> Graphics.t -> unit)
942     | IOErrorReason of ([`R] Domain.t -> Io_error.t -> unit)
943     | ControlError  of ([`R] Domain.t -> Control_error.t -> unit)
944     | BlockJob      of ([`R] Domain.t -> Block_job.t -> unit)
945     | DiskChange    of ([`R] Domain.t -> Disk_change.t -> unit)
946     | TrayChange    of ([`R] Domain.t -> Tray_change.t -> unit)
947     | PMWakeUp      of ([`R] Domain.t -> PM_wakeup.t -> unit)
948     | PMSuspend     of ([`R] Domain.t -> PM_suspend.t -> unit)
949     | BalloonChange of ([`R] Domain.t -> Balloon_change.t -> unit)
950     | PMSuspendDisk of ([`R] Domain.t -> PM_suspend_disk.t -> unit)
951
952     (** type of a registered call back function *)
953
954   val register_default_impl : unit -> unit
955     (** Registers the default event loop based on poll(). This
956         must be done before connections are opened.
957
958         Once registered call run_default_impl in a loop. *)
959
960   val run_default_impl : unit -> unit
961     (** Runs one iteration of the event loop. Applications will
962         generally want to have a thread which invokes this in an
963         infinite loop. *)
964
965   type callback_id
966     (** an individual event registration *)
967
968   val register_any : 'a Connect.t -> ?dom:'a Domain.t -> callback -> callback_id
969     (** [register_any con ?dom callback] registers [callback]
970         to receive notification of arbitrary domain events. Return
971         a registration id which can be used in [deregister_any].
972
973         If [?dom] is None then register for this kind of event on
974         all domains. If [dom] is [Some d] then register for this
975         kind of event only on [d].
976     *)
977
978   val deregister_any : 'a Connect.t -> callback_id -> unit
979     (** [deregister_any con id] deregisters the previously registered
980         callback with id [id]. *)
981
982   type timer_id
983     (** an individual timer event *)
984
985   val add_timeout : 'a Connect.t -> int -> (unit -> unit) -> timer_id
986     (** [add_timeout con ms cb] registers [cb] as a timeout callback
987         which will be called every [ms] milliseconds *)
988
989   val remove_timeout : 'a Connect.t -> timer_id -> unit
990     (** [remove_timeout con t] deregisters timeout callback [t]. *)
991
992 end
993   (** Module dealing with events generated by domain
994       state changes. *)
995
996 (** {3 Networks} *)
997
998 module Network : 
999 sig
1000   type 'rw t
1001     (** Network handle.  Read-only handles have type [ro Network.t] and
1002         read-write handles have type [rw Network.t].
1003     *)
1004
1005   val lookup_by_name : 'a Connect.t -> string -> 'a t
1006     (** Lookup a network by name. *)
1007   val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
1008     (** Lookup a network by (packed) UUID. *)
1009   val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
1010     (** Lookup a network by UUID string. *)
1011   val create_xml : [>`W] Connect.t -> xml -> rw t
1012     (** Create a network. *)
1013   val define_xml : [>`W] Connect.t -> xml -> rw t
1014     (** Define but don't activate a network. *)
1015   val undefine : [>`W] t -> unit
1016     (** Undefine configuration of a network. *)
1017   val create : [>`W] t -> unit
1018     (** Start up a defined (inactive) network. *)
1019   val destroy : [>`W] t -> unit
1020     (** Destroy a network. *)
1021   val free : [>`R] t -> unit
1022     (** [free network] frees the network object in memory.
1023
1024         The network object is automatically freed if it is garbage
1025         collected.  This function just forces it to be freed right
1026         away.
1027     *)
1028
1029   val get_name : [>`R] t -> string
1030     (** Get network name. *)
1031   val get_uuid : [>`R] t -> uuid
1032     (** Get network packed UUID. *)
1033   val get_uuid_string : [>`R] t -> string
1034     (** Get network UUID as a printable string. *)
1035   val get_xml_desc : [>`R] t -> xml
1036     (** Get XML description of a network. *)
1037   val get_bridge_name : [>`R] t -> string
1038     (** Get bridge device name of a network. *)
1039   val get_autostart : [>`R] t -> bool
1040     (** Get the autostart flag for a network. *)
1041   val set_autostart : [>`W] t -> bool -> unit
1042     (** Set the autostart flag for a network. *)
1043
1044   external const : [>`R] t -> ro t = "%identity"
1045     (** [const network] turns a read/write network handle into a read-only
1046         network handle.  Note that the opposite operation is impossible.
1047       *)
1048 end
1049   (** Module dealing with networks.  [Network.t] is the
1050       network object. *)
1051
1052 (** {3 Storage pools} *)
1053
1054 module Pool :
1055 sig
1056   type 'rw t
1057     (** Storage pool handle. *)
1058
1059   type pool_state = Inactive | Building | Running | Degraded
1060     (** State of the storage pool. *)
1061
1062   type pool_build_flags = New | Repair | Resize
1063     (** Flags for creating a storage pool. *)
1064
1065   type pool_delete_flags = Normal | Zeroed
1066     (** Flags for deleting a storage pool. *)
1067
1068   type pool_info = {
1069     state : pool_state;                 (** Pool state. *)
1070     capacity : int64;                   (** Logical size in bytes. *)
1071     allocation : int64;                 (** Currently allocated in bytes. *)
1072     available : int64;                  (** Remaining free space bytes. *)
1073   }
1074
1075   val lookup_by_name : 'a Connect.t -> string -> 'a t
1076   val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
1077   val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
1078     (** Look up a storage pool by name, UUID or UUID string. *)
1079
1080   val create_xml : [>`W] Connect.t -> xml -> rw t
1081     (** Create a storage pool. *)
1082   val define_xml : [>`W] Connect.t -> xml -> rw t
1083     (** Define but don't activate a storage pool. *)
1084   val build : [>`W] t -> pool_build_flags -> unit
1085     (** Build a storage pool. *)
1086   val undefine : [>`W] t -> unit
1087     (** Undefine configuration of a storage pool. *)
1088   val create : [>`W] t -> unit
1089     (** Start up a defined (inactive) storage pool. *)
1090   val destroy : [>`W] t -> unit
1091     (** Destroy a storage pool. *)
1092   val delete : [>`W] t -> unit
1093     (** Delete a storage pool. *)
1094   val free : [>`R] t -> unit
1095     (** Free a storage pool object in memory.
1096
1097         The storage pool object is automatically freed if it is garbage
1098         collected.  This function just forces it to be freed right
1099         away.
1100     *)
1101   val refresh : [`R] t -> unit
1102     (** Refresh the list of volumes in the storage pool. *)
1103
1104   val get_name : [`R] t -> string
1105     (** Name of the pool. *)
1106   val get_uuid : [`R] t -> uuid
1107     (** Get the UUID (as a packed byte array). *)
1108   val get_uuid_string : [`R] t -> string
1109     (** Get the UUID (as a printable string). *)
1110   val get_info : [`R] t -> pool_info
1111     (** Get information about the pool. *)
1112   val get_xml_desc : [`R] t -> xml
1113     (** Get the XML description. *)
1114   val get_autostart : [`R] t -> bool
1115     (** Get the autostart flag for the storage pool. *)
1116   val set_autostart : [>`W] t -> bool -> unit
1117     (** Set the autostart flag for the storage pool. *)
1118
1119   val num_of_volumes : [`R] t -> int
1120     (** Returns the number of storage volumes within the storage pool. *)
1121   val list_volumes : [`R] t -> int -> string array
1122     (** Return list of storage volumes. *)
1123
1124   external const : [>`R] t -> ro t = "%identity"
1125     (** [const conn] turns a read/write storage pool into a read-only
1126         pool.  Note that the opposite operation is impossible.
1127       *)
1128 end
1129   (** Module dealing with storage pools. *)
1130
1131 (** {3 Storage volumes} *)
1132
1133 module Volume :
1134 sig
1135   type 'rw t
1136     (** Storage volume handle. *)
1137
1138   type vol_type = File | Block
1139     (** Type of a storage volume. *)
1140
1141   type vol_delete_flags = Normal | Zeroed
1142     (** Flags for deleting a storage volume. *)
1143
1144   type vol_info = {
1145     typ : vol_type;                     (** Type of storage volume. *)
1146     capacity : int64;                   (** Logical size in bytes. *)
1147     allocation : int64;                 (** Currently allocated in bytes. *)
1148   }
1149
1150   val lookup_by_name : 'a Pool.t -> string -> 'a t
1151   val lookup_by_key : 'a Connect.t -> string -> 'a t
1152   val lookup_by_path : 'a Connect.t -> string -> 'a t
1153     (** Look up a storage volume by name, key or path volume. *)
1154
1155   val pool_of_volume : 'a t -> 'a Pool.t
1156     (** Get the storage pool containing this volume. *)
1157
1158   val get_name : [`R] t -> string
1159     (** Name of the volume. *)
1160   val get_key : [`R] t -> string
1161     (** Key of the volume. *)
1162   val get_path : [`R] t -> string
1163     (** Path of the volume. *)
1164   val get_info : [`R] t -> vol_info
1165     (** Get information about the storage volume. *)
1166   val get_xml_desc : [`R] t -> xml
1167     (** Get the XML description. *)
1168
1169   val create_xml : [>`W] Pool.t -> xml -> unit
1170     (** Create a storage volume. *)
1171   val delete : [>`W] t -> vol_delete_flags -> unit
1172     (** Delete a storage volume. *)
1173   val free : [>`R] t -> unit
1174     (** Free a storage volume object in memory.
1175
1176         The storage volume object is automatically freed if it is garbage
1177         collected.  This function just forces it to be freed right
1178         away.
1179     *)
1180
1181   external const : [>`R] t -> ro t = "%identity"
1182     (** [const conn] turns a read/write storage volume into a read-only
1183         volume.  Note that the opposite operation is impossible.
1184       *)
1185 end
1186   (** Module dealing with storage volumes. *)
1187
1188 (** {3 Error handling and exceptions} *)
1189
1190 module Virterror :
1191 sig
1192   type code =
1193     | VIR_ERR_OK
1194     | VIR_ERR_INTERNAL_ERROR
1195     | VIR_ERR_NO_MEMORY
1196     | VIR_ERR_NO_SUPPORT
1197     | VIR_ERR_UNKNOWN_HOST
1198     | VIR_ERR_NO_CONNECT
1199     | VIR_ERR_INVALID_CONN
1200     | VIR_ERR_INVALID_DOMAIN
1201     | VIR_ERR_INVALID_ARG
1202     | VIR_ERR_OPERATION_FAILED
1203     | VIR_ERR_GET_FAILED
1204     | VIR_ERR_POST_FAILED
1205     | VIR_ERR_HTTP_ERROR
1206     | VIR_ERR_SEXPR_SERIAL
1207     | VIR_ERR_NO_XEN
1208     | VIR_ERR_XEN_CALL
1209     | VIR_ERR_OS_TYPE
1210     | VIR_ERR_NO_KERNEL
1211     | VIR_ERR_NO_ROOT
1212     | VIR_ERR_NO_SOURCE
1213     | VIR_ERR_NO_TARGET
1214     | VIR_ERR_NO_NAME
1215     | VIR_ERR_NO_OS
1216     | VIR_ERR_NO_DEVICE
1217     | VIR_ERR_NO_XENSTORE
1218     | VIR_ERR_DRIVER_FULL
1219     | VIR_ERR_CALL_FAILED
1220     | VIR_ERR_XML_ERROR
1221     | VIR_ERR_DOM_EXIST
1222     | VIR_ERR_OPERATION_DENIED
1223     | VIR_ERR_OPEN_FAILED
1224     | VIR_ERR_READ_FAILED
1225     | VIR_ERR_PARSE_FAILED
1226     | VIR_ERR_CONF_SYNTAX
1227     | VIR_ERR_WRITE_FAILED
1228     | VIR_ERR_XML_DETAIL
1229     | VIR_ERR_INVALID_NETWORK
1230     | VIR_ERR_NETWORK_EXIST
1231     | VIR_ERR_SYSTEM_ERROR
1232     | VIR_ERR_RPC
1233     | VIR_ERR_GNUTLS_ERROR
1234     | VIR_WAR_NO_NETWORK
1235     | VIR_ERR_NO_DOMAIN
1236     | VIR_ERR_NO_NETWORK
1237     | VIR_ERR_INVALID_MAC
1238     | VIR_ERR_AUTH_FAILED
1239     | VIR_ERR_INVALID_STORAGE_POOL
1240     | VIR_ERR_INVALID_STORAGE_VOL
1241     | VIR_WAR_NO_STORAGE
1242     | VIR_ERR_NO_STORAGE_POOL
1243     | VIR_ERR_NO_STORAGE_VOL
1244         (* ^^ NB: If you add a variant you MUST edit
1245            libvirt_c_epilogue.c:MAX_VIR_* *)
1246     | VIR_ERR_UNKNOWN of int
1247         (** See [<libvirt/virterror.h>] for meaning of these codes. *)
1248
1249   val string_of_code : code -> string
1250
1251   type domain =
1252     | VIR_FROM_NONE
1253     | VIR_FROM_XEN
1254     | VIR_FROM_XEND
1255     | VIR_FROM_XENSTORE
1256     | VIR_FROM_SEXPR
1257     | VIR_FROM_XML
1258     | VIR_FROM_DOM
1259     | VIR_FROM_RPC
1260     | VIR_FROM_PROXY
1261     | VIR_FROM_CONF
1262     | VIR_FROM_QEMU
1263     | VIR_FROM_NET
1264     | VIR_FROM_TEST
1265     | VIR_FROM_REMOTE
1266     | VIR_FROM_OPENVZ
1267     | VIR_FROM_XENXM
1268     | VIR_FROM_STATS_LINUX
1269     | VIR_FROM_STORAGE
1270         (* ^^ NB: If you add a variant you MUST edit
1271            libvirt_c_epilogue.c: MAX_VIR_* *)
1272     | VIR_FROM_UNKNOWN of int
1273         (** Subsystem / driver which produced the error. *)
1274
1275   val string_of_domain : domain -> string
1276
1277   type level =
1278     | VIR_ERR_NONE
1279     | VIR_ERR_WARNING
1280     | VIR_ERR_ERROR
1281         (* ^^ NB: If you add a variant you MUST edit libvirt_c.c: MAX_VIR_* *)
1282     | VIR_ERR_UNKNOWN_LEVEL of int
1283         (** No error, a warning or an error. *)
1284
1285   val string_of_level : level -> string
1286
1287   type t = {
1288     code : code;                        (** Error code. *)
1289     domain : domain;                    (** Origin of the error. *)
1290     message : string option;            (** Human-readable message. *)
1291     level : level;                      (** Error or warning. *)
1292     str1 : string option;               (** Informational string. *)
1293     str2 : string option;               (** Informational string. *)
1294     str3 : string option;               (** Informational string. *)
1295     int1 : int32;                       (** Informational integer. *)
1296     int2 : int32;                       (** Informational integer. *)
1297   }
1298     (** An error object. *)
1299
1300   val to_string : t -> string
1301     (** Turn the exception into a printable string. *)
1302
1303   val get_last_error : unit -> t option
1304   val get_last_conn_error : [>`R] Connect.t -> t option
1305     (** Get the last error at a global or connection level.
1306
1307         Normally you do not need to use these functions because
1308         the library automatically turns errors into exceptions.
1309     *)
1310
1311   val reset_last_error : unit -> unit
1312   val reset_last_conn_error : [>`R] Connect.t -> unit
1313     (** Reset the error at a global or connection level.
1314
1315         Normally you do not need to use these functions.
1316     *)
1317
1318   val no_error : unit -> t
1319     (** Creates an empty error message.
1320
1321         Normally you do not need to use this function.
1322     *)
1323 end
1324   (** Module dealing with errors. *)
1325
1326 exception Virterror of Virterror.t
1327 (** This exception can be raised by any library function that detects
1328     an error.  To get a printable error message, call
1329     {!Virterror.to_string} on the content of this exception.
1330 *)
1331
1332 exception Not_supported of string
1333 (**
1334     Functions may raise
1335     [Not_supported "virFoo"]
1336     (where [virFoo] is the libvirt function name) if a function is
1337     not supported at either compile or run time.  This applies to
1338     any libvirt function added after version 0.2.1.
1339
1340     See also {{:http://libvirt.org/hvsupport.html}http://libvirt.org/hvsupport.html}
1341 *)
1342
1343 (** {3 Utility functions} *)
1344
1345 val map_ignore_errors : ('a -> 'b) -> 'a list -> 'b list
1346 (** [map_ignore_errors f xs] calls function [f] for each element of [xs].
1347
1348     This is just like [List.map] except that if [f x] throws a
1349     {!Virterror.t} exception, the error is ignored and [f x]
1350     is not returned in the final list.
1351
1352     This function is primarily useful when dealing with domains which
1353     might 'disappear' asynchronously from the currently running
1354     program.
1355 *)