1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
|
(** OCaml bindings for libvirt.
(C) Copyright 2007 Richard W.M. Jones, Red Hat Inc.
http://libvirt.org/
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*)
type uuid = string
(** This is a "raw" UUID, ie. a packed string of bytes. *)
type xml = string
(** Type of XML (an uninterpreted string of bytes). Use PXP, expat,
xml-light, etc. if you want to do anything useful with the XML.
*)
val get_version : ?driver:string -> unit -> int * int
(** [get_version ()] returns the library version in the first part
of the tuple, and [0] in the second part.
[get_version ~driver ()] returns the library version in the first
part of the tuple, and the version of the driver called [driver]
in the second part.
The version numbers are encoded as
1,000,000 * major + 1,000 * minor + release.
*)
val uuid_length : int
(** Length of packed UUIDs. *)
val uuid_string_length : int
(** Length of UUID strings. *)
(* These phantom types are used to ensure the type-safety of read-only
* versus read-write connections. For more information see:
* http://caml.inria.fr/pub/ml-archives/caml-list/2004/07/80683af867cce6bf8fff273973f70c95.en.html
*)
type rw = [`R|`W]
type ro = [`R]
module Connect :
sig
type 'rw t
(** Connection. Read-only connections have type [ro Connect.t] and
read-write connections have type [rw Connect.t].
*)
type node_info = {
model : string; (** CPU model *)
memory : int64; (** memory size in kilobytes *)
cpus : int; (** number of active CPUs *)
mhz : int; (** expected CPU frequency *)
nodes : int; (** number of NUMA nodes (1 = UMA) *)
sockets : int; (** number of CPU sockets per node *)
cores : int; (** number of cores per socket *)
threads : int; (** number of threads per core *)
}
val connect : ?name:string -> unit -> rw t
val connect_readonly : ?name:string -> unit -> ro t
(** [connect ~name ()] connects to the hypervisor with URI [name].
[connect ()] connects to the default hypervisor.
[connect_readonly] is the same but connects in read-only mode.
*)
val close : [>`R] t -> unit
(** [close conn] closes and frees the connection object in memory.
The connection is automatically closed if it is garbage
collected. This function just forces it to be closed
and freed right away.
*)
val get_type : [>`R] t -> string
val get_version : [>`R] t -> int
val get_hostname : [>`R] t -> string
val get_uri : [>`R] t -> string
val get_max_vcpus : [>`R] t -> ?type_:string -> unit -> int
val list_domains : [>`R] t -> int -> int array
val num_of_domains : [>`R] t -> int
val get_capabilities : [>`R] t -> string
val num_of_defined_domains : [>`R] t -> int
val list_defined_domains : [>`R] t -> int -> string array
val num_of_networks : [>`R] t -> int
val list_networks : [>`R] t -> int -> string array
val num_of_defined_networks : [>`R] t -> int
val list_defined_networks : [>`R] t -> int -> string array
(* The name of this function is inconsistent, but the inconsistency
* is really in libvirt itself.
*)
val get_node_info : [>`R] t -> node_info
val maxcpus_of_node_info : node_info -> int
(** Calculate the total number of CPUs supported (but not necessarily
active) in the host.
*)
val cpumaplen : int -> int
(** Calculate the length (in bytes) required to store the complete
CPU map between a single virtual and all physical CPUs of a domain.
*)
val use_cpu : string -> int -> unit
(** [use_cpu cpumap cpu] marks [cpu] as usable in [cpumap]. *)
val unuse_cpu : string -> int -> unit
(** [unuse_cpu cpumap cpu] marks [cpu] as not usable in [cpumap]. *)
val cpu_usable : string -> int -> int -> int -> bool
(** [cpu_usable cpumaps maplen vcpu cpu] checks returns true iff the
[cpu] is usable by [vcpu]. *)
external const : [>`R] t -> ro t = "%identity"
(** [const conn] turns a read/write connection into a read-only
connection. Note that the opposite operation is impossible.
*)
end
(** Module dealing with connections. [Connect.t] is the
connection object.
*)
module Domain :
sig
type 'rw t
(** Domain handle. Read-only handles have type [ro Domain.t] and
read-write handles have type [rw Domain.t].
*)
type state =
| InfoNoState | InfoRunning | InfoBlocked | InfoPaused
| InfoShutdown | InfoShutoff | InfoCrashed
type info = {
state : state; (** running state *)
max_mem : int64; (** maximum memory in kilobytes *)
memory : int64; (** memory used in kilobytes *)
nr_virt_cpu : int; (** number of virtual CPUs *)
cpu_time : int64; (** CPU time used in nanoseconds *)
}
type vcpu_state = VcpuOffline | VcpuRunning | VcpuBlocked
type vcpu_info = {
number : int; (** virtual CPU number *)
vcpu_state : vcpu_state; (** state *)
vcpu_time : int64; (** CPU time used in nanoseconds *)
cpu : int; (** real CPU number, -1 if offline *)
}
type sched_param = string * sched_param_value
and sched_param_value =
| SchedFieldInt32 of int32 | SchedFieldUInt32 of int32
| SchedFieldInt64 of int64 | SchedFieldUInt64 of int64
| SchedFieldFloat of float | SchedFieldBool of bool
type migrate_flag = Live
type block_stats = {
rd_req : int64;
rd_bytes : int64;
wr_req : int64;
wr_bytes : int64;
errs : int64;
}
type interface_stats = {
rx_bytes : int64;
rx_packets : int64;
rx_errs : int64;
rx_drop : int64;
tx_bytes : int64;
tx_packets : int64;
tx_errs : int64;
tx_drop : int64;
}
val create_linux : [>`W] Connect.t -> xml -> rw t
val lookup_by_id : 'a Connect.t -> int -> 'a t
val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
val lookup_by_name : 'a Connect.t -> string -> 'a t
val destroy : [>`W] t -> unit
val free : [>`R] t -> unit
(** [free domain] frees the domain object in memory.
The domain object is automatically freed if it is garbage
collected. This function just forces it to be freed right
away.
*)
val suspend : [>`W] t -> unit
val resume : [>`W] t -> unit
val save : [>`W] t -> string -> unit
val restore : [>`W] Connect.t -> string -> unit
val core_dump : [>`W] t -> string -> unit
val shutdown : [>`W] t -> unit
val reboot : [>`W] t -> unit
val get_name : [>`R] t -> string
val get_uuid : [>`R] t -> uuid
val get_uuid_string : [>`R] t -> string
val get_id : [>`R] t -> int
(** [getid dom] returns the ID of the domain.
Do not call this on a defined but not running domain. Those
domains don't have IDs, and you'll get an error here.
*)
val get_os_type : [>`R] t -> string
val get_max_memory : [>`R] t -> int64
val set_max_memory : [>`W] t -> int64 -> unit
val set_memory : [>`W] t -> int64 -> unit
val get_info : [>`R] t -> info
val get_xml_desc : [>`R] t -> xml
val get_scheduler_type : [>`R] t -> string * int
val get_scheduler_parameters : [>`R] t -> int -> sched_param array
val set_scheduler_parameters : [>`W] t -> sched_param array -> unit
val define_xml : [>`W] Connect.t -> xml -> rw t
val undefine : [>`W] t -> unit
val create : [>`W] t -> unit
val get_autostart : [>`R] t -> bool
val set_autostart : [>`W] t -> bool -> unit
val set_vcpus : [>`W] t -> int -> unit
val pin_vcpu : [>`W] t -> int -> string -> unit
val get_vcpus : [>`R] t -> int -> int -> int * vcpu_info array * string
val get_max_vcpus : [>`R] t -> int
val attach_device : [>`W] t -> xml -> unit
val detach_device : [>`W] t -> xml -> unit
val migrate : [>`W] t -> [>`W] Connect.t -> migrate_flag list ->
?dname:string -> ?uri:string -> ?bandwidth:int -> unit -> rw t
val block_stats : [>`R] t -> string -> block_stats
val interface_stats : [>`R] t -> string -> interface_stats
external const : [>`R] t -> ro t = "%identity"
(** [const dom] turns a read/write domain handle into a read-only
domain handle. Note that the opposite operation is impossible.
*)
end
(** Module dealing with domains. [Domain.t] is the
domain object.
*)
module Network :
sig
type 'rw t
(** Network handle. Read-only handles have type [ro Network.t] and
read-write handles have type [rw Network.t].
*)
val lookup_by_name : 'a Connect.t -> string -> 'a t
val lookup_by_uuid : 'a Connect.t -> uuid -> 'a t
val lookup_by_uuid_string : 'a Connect.t -> string -> 'a t
val create_xml : [>`W] Connect.t -> xml -> rw t
val define_xml : [>`W] Connect.t -> xml -> rw t
val undefine : [>`W] t -> unit
val create : [>`W] t -> unit
val destroy : [>`W] t -> unit
val free : [>`R] t -> unit
(** [free network] frees the network object in memory.
The network object is automatically freed if it is garbage
collected. This function just forces it to be freed right
away.
*)
val get_name : [>`R] t -> string
val get_uuid : [>`R] t -> uuid
val get_uuid_string : [>`R] t -> string
val get_xml_desc : [>`R] t -> xml
val get_bridge_name : [>`R] t -> string
val get_autostart : [>`R] t -> bool
val set_autostart : [>`W] t -> bool -> unit
external const : [>`R] t -> ro t = "%identity"
(** [const network] turns a read/write network handle into a read-only
network handle. Note that the opposite operation is impossible.
*)
end
(** Module dealing with networks. [Network.t] is the
network object.
*)
module Virterror :
sig
type code =
| VIR_ERR_OK
| VIR_ERR_INTERNAL_ERROR
| VIR_ERR_NO_MEMORY
| VIR_ERR_NO_SUPPORT
| VIR_ERR_UNKNOWN_HOST
| VIR_ERR_NO_CONNECT
| VIR_ERR_INVALID_CONN
| VIR_ERR_INVALID_DOMAIN
| VIR_ERR_INVALID_ARG
| VIR_ERR_OPERATION_FAILED
| VIR_ERR_GET_FAILED
| VIR_ERR_POST_FAILED
| VIR_ERR_HTTP_ERROR
| VIR_ERR_SEXPR_SERIAL
| VIR_ERR_NO_XEN
| VIR_ERR_XEN_CALL
| VIR_ERR_OS_TYPE
| VIR_ERR_NO_KERNEL
| VIR_ERR_NO_ROOT
| VIR_ERR_NO_SOURCE
| VIR_ERR_NO_TARGET
| VIR_ERR_NO_NAME
| VIR_ERR_NO_OS
| VIR_ERR_NO_DEVICE
| VIR_ERR_NO_XENSTORE
| VIR_ERR_DRIVER_FULL
| VIR_ERR_CALL_FAILED
| VIR_ERR_XML_ERROR
| VIR_ERR_DOM_EXIST
| VIR_ERR_OPERATION_DENIED
| VIR_ERR_OPEN_FAILED
| VIR_ERR_READ_FAILED
| VIR_ERR_PARSE_FAILED
| VIR_ERR_CONF_SYNTAX
| VIR_ERR_WRITE_FAILED
| VIR_ERR_XML_DETAIL
| VIR_ERR_INVALID_NETWORK
| VIR_ERR_NETWORK_EXIST
| VIR_ERR_SYSTEM_ERROR
| VIR_ERR_RPC
| VIR_ERR_GNUTLS_ERROR
| VIR_WAR_NO_NETWORK
| VIR_ERR_NO_DOMAIN
| VIR_ERR_NO_NETWORK
(** See [<libvirt/virterror.h>] for meaning of these codes. *)
val string_of_code : code -> string
type level =
| VIR_ERR_NONE
| VIR_ERR_WARNING
| VIR_ERR_ERROR
(** No error, a warning or an error. *)
val string_of_level : level -> string
type domain =
| VIR_FROM_NONE
| VIR_FROM_XEN
| VIR_FROM_XEND
| VIR_FROM_XENSTORE
| VIR_FROM_SEXPR
| VIR_FROM_XML
| VIR_FROM_DOM
| VIR_FROM_RPC
| VIR_FROM_PROXY
| VIR_FROM_CONF
| VIR_FROM_QEMU
| VIR_FROM_NET
| VIR_FROM_TEST
| VIR_FROM_REMOTE
(** Subsystem / driver which produced the error. *)
val string_of_domain : domain -> string
type t = {
code : code; (** Error code. *)
domain : domain; (** Origin of the error. *)
message : string option; (** Human-readable message. *)
level : level; (** Error or warning. *)
conn : ro Connect.t option; (** Associated connection. *)
dom : ro Domain.t option; (** Associated domain. *)
str1 : string option; (** Informational string. *)
str2 : string option; (** Informational string. *)
str3 : string option; (** Informational string. *)
int1 : int32; (** Informational integer. *)
int2 : int32; (** Informational integer. *)
net : ro Network.t option; (** Associated network. *)
}
(** An error object. *)
val to_string : t -> string
(** Turn the exception into a printable string. *)
val get_last_error : unit -> t option
val get_last_conn_error : [>`R] Connect.t -> t option
(** Get the last error at a global or connection level.
Normally you do not need to use these functions because
the library automatically turns errors into exceptions.
*)
val reset_last_error : unit -> unit
val reset_last_conn_error : [>`R] Connect.t -> unit
(** Reset the error at a global or connection level.
Normally you do not need to use these functions.
*)
val no_error : unit -> t
(** Creates an empty error message.
Normally you do not need to use this function.
*)
end
(** Module dealing with errors. *)
exception Virterror of Virterror.t
(** This exception can be raised by any library function that detects
an error. To get a printable error message, call
{!Virterror.to_string} on the content of this exception.
Note that functions may also raise
[Invalid_argument "virFoo not supported"]
(where virFoo is the libvirt function name) if a function is
not supported at either compile or runtime. This applies to
any libvirt function added after version 0.2.1.
See also [http://libvirt.org/hvsupport.html]
*)
|