sig
  type uuid = string
  type xml = string
  type filename = string
  val get_version : ?driver:string -> unit -> int * int
  val uuid_length : int
  val uuid_string_length : int
  type rw = [ `R | `W ]
  type ro = [ `R ]
  module Connect :
    sig
      type 'rw t
      type node_info = {
        model : string;
        memory : int64;
        cpus : int;
        mhz : int;
        nodes : int;
        sockets : int;
        cores : int;
        threads : int;
      }
      type credential_type =
          CredentialUsername
        | CredentialAuthname
        | CredentialLanguage
        | CredentialCnonce
        | CredentialPassphrase
        | CredentialEchoprompt
        | CredentialNoechoprompt
        | CredentialRealm
        | CredentialExternal
      type credential = {
        typ : Libvirt.Connect.credential_type;
        prompt : string;
        challenge : string option;
        defresult : string option;
      }
      type auth = {
        credtype : Libvirt.Connect.credential_type list;
        cb : Libvirt.Connect.credential list -> string option list;
      }
      val connect : ?name:string -> unit -> Libvirt.rw Libvirt.Connect.t
      val connect_readonly :
        ?name:string -> unit -> Libvirt.ro Libvirt.Connect.t
      val connect_auth :
        ?name:string -> Libvirt.Connect.auth -> Libvirt.rw Libvirt.Connect.t
      val connect_auth_readonly :
        ?name:string -> Libvirt.Connect.auth -> Libvirt.ro Libvirt.Connect.t
      val close : [> `R ] Libvirt.Connect.t -> unit
      val get_type : [> `R ] Libvirt.Connect.t -> string
      val get_version : [> `R ] Libvirt.Connect.t -> int
      val get_hostname : [> `R ] Libvirt.Connect.t -> string
      val get_uri : [> `R ] Libvirt.Connect.t -> string
      val get_max_vcpus :
        [> `R ] Libvirt.Connect.t -> ?type_:string -> unit -> int
      val list_domains : [> `R ] Libvirt.Connect.t -> int -> int array
      val num_of_domains : [> `R ] Libvirt.Connect.t -> int
      val get_capabilities : [> `R ] Libvirt.Connect.t -> Libvirt.xml
      val num_of_defined_domains : [> `R ] Libvirt.Connect.t -> int
      val list_defined_domains :
        [> `R ] Libvirt.Connect.t -> int -> string array
      val num_of_networks : [> `R ] Libvirt.Connect.t -> int
      val list_networks : [> `R ] Libvirt.Connect.t -> int -> string array
      val num_of_defined_networks : [> `R ] Libvirt.Connect.t -> int
      val list_defined_networks :
        [> `R ] Libvirt.Connect.t -> int -> string array
      val num_of_pools : [> `R ] Libvirt.Connect.t -> int
      val list_pools : [> `R ] Libvirt.Connect.t -> int -> string array
      val num_of_defined_pools : [> `R ] Libvirt.Connect.t -> int
      val list_defined_pools :
        [> `R ] Libvirt.Connect.t -> int -> string array
      val num_of_secrets : [> `R ] Libvirt.Connect.t -> int
      val list_secrets : [> `R ] Libvirt.Connect.t -> int -> string array
      val get_node_info :
        [> `R ] Libvirt.Connect.t -> Libvirt.Connect.node_info
      val node_get_free_memory : [> `R ] Libvirt.Connect.t -> int64
      val node_get_cells_free_memory :
        [> `R ] Libvirt.Connect.t -> int -> int -> int64 array
      val maxcpus_of_node_info : Libvirt.Connect.node_info -> int
      val cpumaplen : int -> int
      val use_cpu : bytes -> int -> unit
      val unuse_cpu : bytes -> int -> unit
      val cpu_usable : bytes -> int -> int -> int -> bool
      val set_keep_alive : [> `R ] Libvirt.Connect.t -> int -> int -> unit
      val get_auth_default : unit -> Libvirt.Connect.auth
      val get_domain_capabilities :
        ?emulatorbin:string ->
        ?arch:string ->
        ?machine:string ->
        ?virttype:string -> [> `R ] Libvirt.Connect.t -> string
      external const :
        [> `R ] Libvirt.Connect.t -> Libvirt.ro Libvirt.Connect.t
        = "%identity"
    end
  module Domain :
    sig
      type 'rw t
      type state =
          InfoNoState
        | InfoRunning
        | InfoBlocked
        | InfoPaused
        | InfoShutdown
        | InfoShutoff
        | InfoCrashed
        | InfoPMSuspended
      type info = {
        state : Libvirt.Domain.state;
        max_mem : int64;
        memory : int64;
        nr_virt_cpu : int;
        cpu_time : int64;
      }
      type vcpu_state = VcpuOffline | VcpuRunning | VcpuBlocked
      type vcpu_info = {
        number : int;
        vcpu_state : Libvirt.Domain.vcpu_state;
        vcpu_time : int64;
        cpu : int;
      }
      type domain_create_flag =
          START_PAUSED
        | START_AUTODESTROY
        | START_BYPASS_CACHE
        | START_FORCE_BOOT
        | START_VALIDATE
      type domain_device_modify_flag =
          DEVICE_MODIFY_LIVE
        | DEVICE_MODIFY_CONFIG
        | DEVICE_MODIFY_FORCE
      type sched_param = string * Libvirt.Domain.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 typed_param = string * Libvirt.Domain.typed_param_value
      and typed_param_value =
          TypedFieldInt32 of int32
        | TypedFieldUInt32 of int32
        | TypedFieldInt64 of int64
        | TypedFieldUInt64 of int64
        | TypedFieldFloat of float
        | TypedFieldBool of bool
        | TypedFieldString of string
      type migrate_flag = Live
      type memory_flag = Virtual
      type list_flag = ListActive | ListInactive | ListAll
      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;
      }
      type get_all_domain_stats_flag =
          GetAllDomainsStatsActive
        | GetAllDomainsStatsInactive
        | GetAllDomainsStatsOther
        | GetAllDomainsStatsPaused
        | GetAllDomainsStatsPersistent
        | GetAllDomainsStatsRunning
        | GetAllDomainsStatsShutoff
        | GetAllDomainsStatsTransient
        | GetAllDomainsStatsBacking
        | GetAllDomainsStatsEnforceStats
      type stats_type =
          StatsState
        | StatsCpuTotal
        | StatsBalloon
        | StatsVcpu
        | StatsInterface
        | StatsBlock
        | StatsPerf
      type domain_stats_record = {
        dom_uuid : Libvirt.uuid;
        params : Libvirt.Domain.typed_param array;
      }
      type xml_desc_flag =
          XmlSecure
        | XmlInactive
        | XmlUpdateCPU
        | XmlMigratable
      val max_peek : [> `R ] Libvirt.Domain.t -> int
      val create_linux :
        [> `W ] Libvirt.Connect.t ->
        Libvirt.xml -> Libvirt.rw Libvirt.Domain.t
      val create_xml :
        [> `W ] Libvirt.Connect.t ->
        Libvirt.xml ->
        Libvirt.Domain.domain_create_flag list -> Libvirt.rw Libvirt.Domain.t
      val lookup_by_id : 'Libvirt.Connect.t -> int -> 'Libvirt.Domain.t
      val lookup_by_uuid :
        'Libvirt.Connect.t -> Libvirt.uuid -> 'Libvirt.Domain.t
      val lookup_by_uuid_string :
        'Libvirt.Connect.t -> string -> 'Libvirt.Domain.t
      val lookup_by_name :
        'Libvirt.Connect.t -> string -> 'Libvirt.Domain.t
      val destroy : [> `W ] Libvirt.Domain.t -> unit
      val free : [> `R ] Libvirt.Domain.t -> unit
      val suspend : [> `W ] Libvirt.Domain.t -> unit
      val resume : [> `W ] Libvirt.Domain.t -> unit
      val save : [> `W ] Libvirt.Domain.t -> Libvirt.filename -> unit
      val restore : [> `W ] Libvirt.Connect.t -> Libvirt.filename -> unit
      val core_dump : [> `W ] Libvirt.Domain.t -> Libvirt.filename -> unit
      val shutdown : [> `W ] Libvirt.Domain.t -> unit
      val reboot : [> `W ] Libvirt.Domain.t -> unit
      val get_name : [> `R ] Libvirt.Domain.t -> string
      val get_uuid : [> `R ] Libvirt.Domain.t -> Libvirt.uuid
      val get_uuid_string : [> `R ] Libvirt.Domain.t -> string
      val get_id : [> `R ] Libvirt.Domain.t -> int
      val get_os_type : [> `R ] Libvirt.Domain.t -> string
      val get_max_memory : [> `R ] Libvirt.Domain.t -> int64
      val set_max_memory : [> `W ] Libvirt.Domain.t -> int64 -> unit
      val set_memory : [> `W ] Libvirt.Domain.t -> int64 -> unit
      val get_info : [> `R ] Libvirt.Domain.t -> Libvirt.Domain.info
      val get_xml_desc : [> `R ] Libvirt.Domain.t -> Libvirt.xml
      val get_xml_desc_flags :
        [> `W ] Libvirt.Domain.t ->
        Libvirt.Domain.xml_desc_flag list -> Libvirt.xml
      val get_scheduler_type : [> `R ] Libvirt.Domain.t -> string * int
      val get_scheduler_parameters :
        [> `R ] Libvirt.Domain.t -> int -> Libvirt.Domain.sched_param array
      val set_scheduler_parameters :
        [> `W ] Libvirt.Domain.t -> Libvirt.Domain.sched_param array -> unit
      val define_xml :
        [> `W ] Libvirt.Connect.t ->
        Libvirt.xml -> Libvirt.rw Libvirt.Domain.t
      val undefine : [> `W ] Libvirt.Domain.t -> unit
      val create : [> `W ] Libvirt.Domain.t -> unit
      val get_autostart : [> `R ] Libvirt.Domain.t -> bool
      val set_autostart : [> `W ] Libvirt.Domain.t -> bool -> unit
      val set_vcpus : [> `W ] Libvirt.Domain.t -> int -> unit
      val pin_vcpu : [> `W ] Libvirt.Domain.t -> int -> string -> unit
      val get_vcpus :
        [> `R ] Libvirt.Domain.t ->
        int -> int -> int * Libvirt.Domain.vcpu_info array * string
      val get_cpu_stats :
        [> `R ] Libvirt.Domain.t -> Libvirt.Domain.typed_param list array
      val get_max_vcpus : [> `R ] Libvirt.Domain.t -> int
      val attach_device : [> `W ] Libvirt.Domain.t -> Libvirt.xml -> unit
      val detach_device : [> `W ] Libvirt.Domain.t -> Libvirt.xml -> unit
      val detach_device_flags :
        [> `W ] Libvirt.Domain.t ->
        Libvirt.xml -> Libvirt.Domain.domain_device_modify_flag list -> unit
      val migrate :
        [> `W ] Libvirt.Domain.t ->
        [> `W ] Libvirt.Connect.t ->
        Libvirt.Domain.migrate_flag list ->
        ?dname:string ->
        ?uri:string -> ?bandwidth:int -> unit -> Libvirt.rw Libvirt.Domain.t
      val block_stats :
        [> `R ] Libvirt.Domain.t -> string -> Libvirt.Domain.block_stats
      val interface_stats :
        [> `R ] Libvirt.Domain.t -> string -> Libvirt.Domain.interface_stats
      val block_peek :
        [> `W ] Libvirt.Domain.t ->
        string -> int64 -> int -> bytes -> int -> unit
      val memory_peek :
        [> `W ] Libvirt.Domain.t ->
        Libvirt.Domain.memory_flag list ->
        int64 -> int -> bytes -> int -> unit
      external get_all_domain_stats :
        [> `R ] Libvirt.Connect.t ->
        Libvirt.Domain.stats_type list ->
        Libvirt.Domain.get_all_domain_stats_flag list ->
        Libvirt.Domain.domain_stats_record array
        = "ocaml_libvirt_domain_get_all_domain_stats"
      external const :
        [> `R ] Libvirt.Domain.t -> Libvirt.ro Libvirt.Domain.t = "%identity"
      val get_domains :
        ([> `R ] as 'a) Libvirt.Connect.t ->
        Libvirt.Domain.list_flag list -> 'Libvirt.Domain.t list
      val get_domains_and_infos :
        ([> `R ] as 'a) Libvirt.Connect.t ->
        Libvirt.Domain.list_flag list ->
        ('Libvirt.Domain.t * Libvirt.Domain.info) list
    end
  module Event :
    sig
      module Defined :
        sig
          type t = [ `Added | `Unknown of int | `Updated ]
          val to_string : Libvirt.Event.Defined.t -> string
        end
      module Undefined :
        sig
          type t = [ `Removed | `Unknown of int ]
          val to_string : Libvirt.Event.Undefined.t -> string
        end
      module Started :
        sig
          type t =
              [ `Booted
              | `FromSnapshot
              | `Migrated
              | `Restored
              | `Unknown of int
              | `Wakeup ]
          val to_string : Libvirt.Event.Started.t -> string
        end
      module Suspended :
        sig
          type t =
              [ `APIError
              | `FromSnapshot
              | `IOError
              | `Migrated
              | `Paused
              | `Restored
              | `Unknown of int
              | `Watchdog ]
          val to_string : Libvirt.Event.Suspended.t -> string
        end
      module Resumed :
        sig
          type t =
              [ `FromSnapshot | `Migrated | `Unknown of int | `Unpaused ]
          val to_string : Libvirt.Event.Resumed.t -> string
        end
      module Stopped :
        sig
          type t =
              [ `Crashed
              | `Destroyed
              | `Failed
              | `FromSnapshot
              | `Migrated
              | `Saved
              | `Shutdown
              | `Unknown of int ]
          val to_string : Libvirt.Event.Stopped.t -> string
        end
      module PM_suspended :
        sig
          type t = [ `Disk | `Memory | `Unknown of int ]
          val to_string : Libvirt.Event.PM_suspended.t -> string
        end
      module Lifecycle :
        sig
          type t =
              [ `Defined of Libvirt.Event.Defined.t
              | `PMSuspended of Libvirt.Event.PM_suspended.t
              | `Resumed of Libvirt.Event.Resumed.t
              | `Shutdown
              | `Started of Libvirt.Event.Started.t
              | `Stopped of Libvirt.Event.Stopped.t
              | `Suspended of Libvirt.Event.Suspended.t
              | `Undefined of Libvirt.Event.Undefined.t
              | `Unknown of int ]
          val to_string : Libvirt.Event.Lifecycle.t -> string
        end
      module Reboot :
        sig
          type t = unit
          val to_string : Libvirt.Event.Reboot.t -> string
        end
      module Rtc_change :
        sig
          type t = int64
          val to_string : Libvirt.Event.Rtc_change.t -> string
        end
      module Watchdog :
        sig
          type t =
              [ `Debug
              | `None
              | `Pause
              | `Poweroff
              | `Reset
              | `Shutdown
              | `Unknown of int ]
          val to_string : Libvirt.Event.Watchdog.t -> string
        end
      module Io_error :
        sig
          type action = [ `None | `Pause | `Report | `Unknown of int ]
          type t = {
            src_path : string option;
            dev_alias : string option;
            action : Libvirt.Event.Io_error.action;
            reason : string option;
          }
          val to_string : Libvirt.Event.Io_error.t -> string
        end
      module Graphics_address :
        sig
          type family = [ `Ipv4 | `Ipv6 | `Unix | `Unknown of int ]
          type t = {
            family : Libvirt.Event.Graphics_address.family;
            node : string option;
            service : string option;
          }
          val to_string : Libvirt.Event.Graphics_address.t -> string
        end
      module Graphics_subject :
        sig
          type identity = { ty : string option; name : string option; }
          type t = Libvirt.Event.Graphics_subject.identity list
          val to_string : Libvirt.Event.Graphics_subject.t -> string
        end
      module Graphics :
        sig
          type phase =
              [ `Connect | `Disconnect | `Initialize | `Unknown of int ]
          type t = {
            phase : Libvirt.Event.Graphics.phase;
            local : Libvirt.Event.Graphics_address.t;
            remote : Libvirt.Event.Graphics_address.t;
            auth_scheme : string option;
            subject : Libvirt.Event.Graphics_subject.t;
          }
          val to_string : Libvirt.Event.Graphics.t -> string
        end
      module Control_error :
        sig
          type t = unit
          val to_string : Libvirt.Event.Control_error.t -> string
        end
      module Block_job :
        sig
          type ty =
              [ `Commit | `Copy | `KnownUnknown | `Pull | `Unknown of int ]
          type status =
              [ `Cancelled | `Completed | `Failed | `Ready | `Unknown of int
              ]
          type t = {
            disk : string option;
            ty : Libvirt.Event.Block_job.ty;
            status : Libvirt.Event.Block_job.status;
          }
          val to_string : Libvirt.Event.Block_job.t -> string
        end
      module Disk_change :
        sig
          type reason = [ `MissingOnStart | `Unknown of int ]
          type t = {
            old_src_path : string option;
            new_src_path : string option;
            dev_alias : string option;
            reason : Libvirt.Event.Disk_change.reason;
          }
          val to_string : Libvirt.Event.Disk_change.t -> string
        end
      module Tray_change :
        sig
          type reason = [ `Close | `Open | `Unknown of int ]
          type t = {
            dev_alias : string option;
            reason : Libvirt.Event.Tray_change.reason;
          }
          val to_string : Libvirt.Event.Tray_change.t -> string
        end
      module PM_wakeup :
        sig
          type reason = [ `Unknown of int ]
          type t = Libvirt.Event.PM_wakeup.reason
          val to_string : Libvirt.Event.PM_wakeup.t -> string
        end
      module PM_suspend :
        sig
          type reason = [ `Unknown of int ]
          type t = Libvirt.Event.PM_suspend.reason
          val to_string : Libvirt.Event.PM_suspend.t -> string
        end
      module Balloon_change :
        sig
          type t = int64
          val to_string : Libvirt.Event.Balloon_change.t -> string
        end
      module PM_suspend_disk :
        sig
          type reason = [ `Unknown of int ]
          type t = Libvirt.Event.PM_suspend_disk.reason
          val to_string : Libvirt.Event.PM_suspend_disk.t -> string
        end
      module Device_removed :
        sig
          type t = string
          val to_string : Libvirt.Event.Device_removed.t -> string
        end
      type callback =
          Lifecycle of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Lifecycle.t -> unit)
        | Reboot of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Reboot.t -> unit)
        | RtcChange of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Rtc_change.t -> unit)
        | Watchdog of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Watchdog.t -> unit)
        | IOError of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Io_error.t -> unit)
        | Graphics of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Graphics.t -> unit)
        | IOErrorReason of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Io_error.t -> unit)
        | ControlError of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Control_error.t -> unit)
        | BlockJob of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Block_job.t -> unit)
        | DiskChange of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Disk_change.t -> unit)
        | TrayChange of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.Tray_change.t -> unit)
        | PMWakeUp of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.PM_wakeup.t -> unit)
        | PMSuspend of
            ([ `R ] Libvirt.Domain.t -> Libvirt.Event.PM_suspend.t -> unit)
        | BalloonChange of
            ([ `R ] Libvirt.Domain.t ->
             Libvirt.Event.Balloon_change.t -> unit)
        | PMSuspendDisk of
            ([ `R ] Libvirt.Domain.t ->
             Libvirt.Event.PM_suspend_disk.t -> unit)
        | DeviceRemoved of
            ([ `R ] Libvirt.Domain.t ->
             Libvirt.Event.Device_removed.t -> unit)
      val register_default_impl : unit -> unit
      val run_default_impl : unit -> unit
      type callback_id
      val register_any :
        'Libvirt.Connect.t ->
        ?dom:'Libvirt.Domain.t ->
        Libvirt.Event.callback -> Libvirt.Event.callback_id
      val deregister_any :
        'Libvirt.Connect.t -> Libvirt.Event.callback_id -> unit
      type timer_id
      val add_timeout :
        'Libvirt.Connect.t ->
        int -> (unit -> unit) -> Libvirt.Event.timer_id
      val remove_timeout :
        'Libvirt.Connect.t -> Libvirt.Event.timer_id -> unit
    end
  module Network :
    sig
      type 'rw t
      val lookup_by_name :
        'Libvirt.Connect.t -> string -> 'Libvirt.Network.t
      val lookup_by_uuid :
        'Libvirt.Connect.t -> Libvirt.uuid -> 'Libvirt.Network.t
      val lookup_by_uuid_string :
        'Libvirt.Connect.t -> string -> 'Libvirt.Network.t
      val create_xml :
        [> `W ] Libvirt.Connect.t ->
        Libvirt.xml -> Libvirt.rw Libvirt.Network.t
      val define_xml :
        [> `W ] Libvirt.Connect.t ->
        Libvirt.xml -> Libvirt.rw Libvirt.Network.t
      val undefine : [> `W ] Libvirt.Network.t -> unit
      val create : [> `W ] Libvirt.Network.t -> unit
      val destroy : [> `W ] Libvirt.Network.t -> unit
      val free : [> `R ] Libvirt.Network.t -> unit
      val get_name : [> `R ] Libvirt.Network.t -> string
      val get_uuid : [> `R ] Libvirt.Network.t -> Libvirt.uuid
      val get_uuid_string : [> `R ] Libvirt.Network.t -> string
      val get_xml_desc : [> `R ] Libvirt.Network.t -> Libvirt.xml
      val get_bridge_name : [> `R ] Libvirt.Network.t -> string
      val get_autostart : [> `R ] Libvirt.Network.t -> bool
      val set_autostart : [> `W ] Libvirt.Network.t -> bool -> unit
      external const :
        [> `R ] Libvirt.Network.t -> Libvirt.ro Libvirt.Network.t
        = "%identity"
    end
  module Pool :
    sig
      type 'rw t
      type pool_state =
          Inactive
        | Building
        | Running
        | Degraded
        | Inaccessible
      type pool_build_flags = New | Repair | Resize
      type pool_delete_flags = Normal | Zeroed
      type pool_info = {
        state : Libvirt.Pool.pool_state;
        capacity : int64;
        allocation : int64;
        available : int64;
      }
      val lookup_by_name :
        'Libvirt.Connect.t -> string -> 'Libvirt.Pool.t
      val lookup_by_uuid :
        'Libvirt.Connect.t -> Libvirt.uuid -> 'Libvirt.Pool.t
      val lookup_by_uuid_string :
        'Libvirt.Connect.t -> string -> 'Libvirt.Pool.t
      val create_xml :
        [> `W ] Libvirt.Connect.t -> Libvirt.xml -> Libvirt.rw Libvirt.Pool.t
      val define_xml :
        [> `W ] Libvirt.Connect.t -> Libvirt.xml -> Libvirt.rw Libvirt.Pool.t
      val build :
        [> `W ] Libvirt.Pool.t -> Libvirt.Pool.pool_build_flags -> unit
      val undefine : [> `W ] Libvirt.Pool.t -> unit
      val create : [> `W ] Libvirt.Pool.t -> unit
      val destroy : [> `W ] Libvirt.Pool.t -> unit
      val delete : [> `W ] Libvirt.Pool.t -> unit
      val free : [> `R ] Libvirt.Pool.t -> unit
      val refresh : [ `R ] Libvirt.Pool.t -> unit
      val get_name : [ `R ] Libvirt.Pool.t -> string
      val get_uuid : [ `R ] Libvirt.Pool.t -> Libvirt.uuid
      val get_uuid_string : [ `R ] Libvirt.Pool.t -> string
      val get_info : [ `R ] Libvirt.Pool.t -> Libvirt.Pool.pool_info
      val get_xml_desc : [ `R ] Libvirt.Pool.t -> Libvirt.xml
      val get_autostart : [ `R ] Libvirt.Pool.t -> bool
      val set_autostart : [> `W ] Libvirt.Pool.t -> bool -> unit
      val num_of_volumes : [ `R ] Libvirt.Pool.t -> int
      val list_volumes : [ `R ] Libvirt.Pool.t -> int -> string array
      external const : [> `R ] Libvirt.Pool.t -> Libvirt.ro Libvirt.Pool.t
        = "%identity"
    end
  module Volume :
    sig
      type 'rw t
      type vol_type = File | Block | Dir | Network | NetDir | Ploop
      type vol_delete_flags = Normal | Zeroed
      type vol_info = {
        typ : Libvirt.Volume.vol_type;
        capacity : int64;
        allocation : int64;
      }
      val lookup_by_name : 'Libvirt.Pool.t -> string -> 'Libvirt.Volume.t
      val lookup_by_key :
        'Libvirt.Connect.t -> string -> 'Libvirt.Volume.t
      val lookup_by_path :
        'Libvirt.Connect.t -> string -> 'Libvirt.Volume.t
      val pool_of_volume : 'Libvirt.Volume.t -> 'Libvirt.Pool.t
      val get_name : [ `R ] Libvirt.Volume.t -> string
      val get_key : [ `R ] Libvirt.Volume.t -> string
      val get_path : [ `R ] Libvirt.Volume.t -> string
      val get_info : [ `R ] Libvirt.Volume.t -> Libvirt.Volume.vol_info
      val get_xml_desc : [ `R ] Libvirt.Volume.t -> Libvirt.xml
      val create_xml : [> `W ] Libvirt.Pool.t -> Libvirt.xml -> unit
      val delete :
        [> `W ] Libvirt.Volume.t -> Libvirt.Volume.vol_delete_flags -> unit
      val free : [> `R ] Libvirt.Volume.t -> unit
      external const :
        [> `R ] Libvirt.Volume.t -> Libvirt.ro Libvirt.Volume.t = "%identity"
    end
  module Secret :
    sig
      type 'rw t
      type secret_usage_type = NoType | Volume | Ceph | ISCSI | TLS
      val lookup_by_uuid :
        'Libvirt.Connect.t -> Libvirt.uuid -> 'Libvirt.Secret.t
      val lookup_by_uuid_string :
        'Libvirt.Connect.t -> string -> 'Libvirt.Secret.t
      val lookup_by_usage :
        'Libvirt.Connect.t ->
        Libvirt.Secret.secret_usage_type -> string -> 'Libvirt.Secret.t
      val define_xml :
        [> `W ] Libvirt.Connect.t ->
        Libvirt.xml -> Libvirt.rw Libvirt.Secret.t
      val get_uuid : [> `R ] Libvirt.Secret.t -> Libvirt.uuid
      val get_uuid_string : [> `R ] Libvirt.Secret.t -> string
      val get_usage_type :
        [> `R ] Libvirt.Secret.t -> Libvirt.Secret.secret_usage_type
      val get_usage_id : [> `R ] Libvirt.Secret.t -> string
      val get_xml_desc : [> `R ] Libvirt.Secret.t -> Libvirt.xml
      val set_value : [> `W ] Libvirt.Secret.t -> bytes -> unit
      val get_value : [> `R ] Libvirt.Secret.t -> bytes
      val undefine : [> `W ] Libvirt.Secret.t -> unit
      val free : [> `R ] Libvirt.Secret.t -> unit
      external const :
        [> `R ] Libvirt.Secret.t -> Libvirt.ro Libvirt.Secret.t = "%identity"
    end
  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
        | VIR_ERR_INVALID_MAC
        | VIR_ERR_AUTH_FAILED
        | VIR_ERR_INVALID_STORAGE_POOL
        | VIR_ERR_INVALID_STORAGE_VOL
        | VIR_WAR_NO_STORAGE
        | VIR_ERR_NO_STORAGE_POOL
        | VIR_ERR_NO_STORAGE_VOL
        | VIR_WAR_NO_NODE
        | VIR_ERR_INVALID_NODE_DEVICE
        | VIR_ERR_NO_NODE_DEVICE
        | VIR_ERR_NO_SECURITY_MODEL
        | VIR_ERR_OPERATION_INVALID
        | VIR_WAR_NO_INTERFACE
        | VIR_ERR_NO_INTERFACE
        | VIR_ERR_INVALID_INTERFACE
        | VIR_ERR_MULTIPLE_INTERFACES
        | VIR_WAR_NO_NWFILTER
        | VIR_ERR_INVALID_NWFILTER
        | VIR_ERR_NO_NWFILTER
        | VIR_ERR_BUILD_FIREWALL
        | VIR_WAR_NO_SECRET
        | VIR_ERR_INVALID_SECRET
        | VIR_ERR_NO_SECRET
        | VIR_ERR_CONFIG_UNSUPPORTED
        | VIR_ERR_OPERATION_TIMEOUT
        | VIR_ERR_MIGRATE_PERSIST_FAILED
        | VIR_ERR_HOOK_SCRIPT_FAILED
        | VIR_ERR_INVALID_DOMAIN_SNAPSHOT
        | VIR_ERR_NO_DOMAIN_SNAPSHOT
        | VIR_ERR_INVALID_STREAM
        | VIR_ERR_ARGUMENT_UNSUPPORTED
        | VIR_ERR_STORAGE_PROBE_FAILED
        | VIR_ERR_STORAGE_POOL_BUILT
        | VIR_ERR_SNAPSHOT_REVERT_RISKY
        | VIR_ERR_OPERATION_ABORTED
        | VIR_ERR_AUTH_CANCELLED
        | VIR_ERR_NO_DOMAIN_METADATA
        | VIR_ERR_MIGRATE_UNSAFE
        | VIR_ERR_OVERFLOW
        | VIR_ERR_BLOCK_COPY_ACTIVE
        | VIR_ERR_OPERATION_UNSUPPORTED
        | VIR_ERR_SSH
        | VIR_ERR_AGENT_UNRESPONSIVE
        | VIR_ERR_RESOURCE_BUSY
        | VIR_ERR_ACCESS_DENIED
        | VIR_ERR_DBUS_SERVICE
        | VIR_ERR_STORAGE_VOL_EXIST
        | VIR_ERR_CPU_INCOMPATIBLE
        | VIR_ERR_XML_INVALID_SCHEMA
        | VIR_ERR_MIGRATE_FINISH_OK
        | VIR_ERR_AUTH_UNAVAILABLE
        | VIR_ERR_NO_SERVER
        | VIR_ERR_NO_CLIENT
        | VIR_ERR_AGENT_UNSYNCED
        | VIR_ERR_LIBSSH
        | VIR_ERR_DEVICE_MISSING
        | VIR_ERR_INVALID_NWFILTER_BINDING
        | VIR_ERR_NO_NWFILTER_BINDING
        | VIR_ERR_INVALID_DOMAIN_CHECKPOINT
        | VIR_ERR_NO_DOMAIN_CHECKPOINT
        | VIR_ERR_NO_DOMAIN_BACKUP
        | VIR_ERR_INVALID_NETWORK_PORT
        | VIR_ERR_NETWORK_PORT_EXIST
        | VIR_ERR_NO_NETWORK_PORT
        | VIR_ERR_NO_HOSTNAME
        | VIR_ERR_UNKNOWN of int
      val string_of_code : Libvirt.Virterror.code -> 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
        | VIR_FROM_OPENVZ
        | VIR_FROM_XENXM
        | VIR_FROM_STATS_LINUX
        | VIR_FROM_LXC
        | VIR_FROM_STORAGE
        | VIR_FROM_NETWORK
        | VIR_FROM_DOMAIN
        | VIR_FROM_UML
        | VIR_FROM_NODEDEV
        | VIR_FROM_XEN_INOTIFY
        | VIR_FROM_SECURITY
        | VIR_FROM_VBOX
        | VIR_FROM_INTERFACE
        | VIR_FROM_ONE
        | VIR_FROM_ESX
        | VIR_FROM_PHYP
        | VIR_FROM_SECRET
        | VIR_FROM_CPU
        | VIR_FROM_XENAPI
        | VIR_FROM_NWFILTER
        | VIR_FROM_HOOK
        | VIR_FROM_DOMAIN_SNAPSHOT
        | VIR_FROM_AUDIT
        | VIR_FROM_SYSINFO
        | VIR_FROM_STREAMS
        | VIR_FROM_VMWARE
        | VIR_FROM_EVENT
        | VIR_FROM_LIBXL
        | VIR_FROM_LOCKING
        | VIR_FROM_HYPERV
        | VIR_FROM_CAPABILITIES
        | VIR_FROM_URI
        | VIR_FROM_AUTH
        | VIR_FROM_DBUS
        | VIR_FROM_PARALLELS
        | VIR_FROM_DEVICE
        | VIR_FROM_SSH
        | VIR_FROM_LOCKSPACE
        | VIR_FROM_INITCTL
        | VIR_FROM_IDENTITY
        | VIR_FROM_CGROUP
        | VIR_FROM_ACCESS
        | VIR_FROM_SYSTEMD
        | VIR_FROM_BHYVE
        | VIR_FROM_CRYPTO
        | VIR_FROM_FIREWALL
        | VIR_FROM_POLKIT
        | VIR_FROM_THREAD
        | VIR_FROM_ADMIN
        | VIR_FROM_LOGGING
        | VIR_FROM_XENXL
        | VIR_FROM_PERF
        | VIR_FROM_LIBSSH
        | VIR_FROM_RESCTRL
        | VIR_FROM_FIREWALLD
        | VIR_FROM_DOMAIN_CHECKPOINT
        | VIR_FROM_TPM
        | VIR_FROM_BPF
        | VIR_FROM_UNKNOWN of int
      val string_of_domain : Libvirt.Virterror.domain -> string
      type level =
          VIR_ERR_NONE
        | VIR_ERR_WARNING
        | VIR_ERR_ERROR
        | VIR_ERR_UNKNOWN_LEVEL of int
      val string_of_level : Libvirt.Virterror.level -> string
      type t = {
        code : Libvirt.Virterror.code;
        domain : Libvirt.Virterror.domain;
        message : string option;
        level : Libvirt.Virterror.level;
        str1 : string option;
        str2 : string option;
        str3 : string option;
        int1 : int32;
        int2 : int32;
      }
      val to_string : Libvirt.Virterror.t -> string
      val get_last_error : unit -> Libvirt.Virterror.t option
      val get_last_conn_error :
        [> `R ] Libvirt.Connect.t -> Libvirt.Virterror.t option
      val reset_last_error : unit -> unit
      val reset_last_conn_error : [> `R ] Libvirt.Connect.t -> unit
      val no_error : unit -> Libvirt.Virterror.t
    end
  exception Virterror of Libvirt.Virterror.t
  exception Not_supported of string
  val map_ignore_errors : ('-> 'b) -> 'a list -> 'b list
end