File: libvirt_utils.ml

package info (click to toggle)
virt-v2v 2.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 27,132 kB
  • sloc: ml: 19,674; sh: 7,631; ansic: 6,897; makefile: 3,261; python: 1,114; perl: 852; xml: 114
file content (118 lines) | stat: -rw-r--r-- 4,018 bytes parent folder | download | duplicates (2)
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
(* virt-v2v
 * Copyright (C) 2009-2020 Red Hat Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *)

open Std_utils
open Tools_utils
open Common_gettext.Gettext

(* This module provides helper methods on top of the Libvirt
    module. *)

let auth_for_password_file ?password_file () =
  let password = Option.map read_first_line_from_file password_file in
  let auth_fn creds =
    List.map (
      function
      | { Libvirt.Connect.typ = Libvirt.Connect.CredentialPassphrase } ->
         password
      | _ -> None
    ) creds
  in

  let base_auth = Libvirt.Connect.get_auth_default () in

  if password_file = None then
    base_auth
  else
    { base_auth with
      cb = auth_fn;
    }

let get_domain conn name =
  let dom =
    try
      Libvirt.Domain.lookup_by_uuid_string conn name
    with
    (* No such domain. *)
    | Libvirt.Virterror { code = VIR_ERR_NO_DOMAIN }
    (* Invalid UUID string. *)
    | Libvirt.Virterror { code = VIR_ERR_INVALID_ARG; domain = VIR_FROM_DOMAIN } ->
      (try
        Libvirt.Domain.lookup_by_name conn name
      with
        Libvirt.Virterror { code = VIR_ERR_NO_DOMAIN; message } ->
          error (f_"cannot find libvirt domain ‘%s’: %s")
            name (Option.value ~default:"" message)
      ) in
  let uri = Libvirt.Connect.get_uri conn in
  (* As a side-effect we check that the domain is shut down.  Of course
   * this is only appropriate for virt-v2v.  (RHBZ#1138586)
   *)
  if not (String.is_prefix uri "test:") then (
    (match (Libvirt.Domain.get_info dom).Libvirt.Domain.state with
    | InfoRunning | InfoBlocked | InfoPaused ->
      error (f_"libvirt domain ‘%s’ is running or paused.  It must be \
                shut down in order to perform virt-v2v conversion")
        (Libvirt.Domain.get_name dom)
    | InfoNoState | InfoShutdown | InfoShutoff | InfoCrashed | InfoPMSuspended ->
      ()
    )
  );
  dom

let get_pool conn name =
  try
    Libvirt.Pool.lookup_by_uuid_string conn name
  with
  (* No such pool. *)
  | Libvirt.Virterror { code = VIR_ERR_NO_STORAGE_POOL }
  (* Invalid UUID string. *)
  | Libvirt.Virterror { code = VIR_ERR_INVALID_ARG; domain = VIR_FROM_STORAGE } ->
    (try
      Libvirt.Pool.lookup_by_name conn name
    with Libvirt.Virterror { code = VIR_ERR_NO_STORAGE_POOL; message } ->
      error (f_"cannot find libvirt pool ‘%s’: %s\n\nUse \
                ‘virsh pool-list --all’ to list all available pools, \
                and ‘virsh pool-dumpxml <pool>’ to display details \
                about a particular pool.\n\nTo set the pool which \
                virt-v2v uses, add the ‘-os <pool>’ option.")
        name (Option.value ~default:"" message)
    )

let get_volume pool name =
  try
    Libvirt.Volume.lookup_by_name pool name
  with
  (* No such volume. *)
  | Libvirt.Virterror { code = VIR_ERR_NO_STORAGE_VOL; message } ->
    error (f_"cannot find libvirt volume ‘%s’: %s")
      name (Option.value ~default:"" message)

let domain_exists conn dom =
  try
    ignore (Libvirt.Domain.lookup_by_name conn dom);
    true
  with
    Libvirt.Virterror { code = VIR_ERR_NO_DOMAIN } -> false

let libvirt_get_version () =
  let v, _ = Libvirt.get_version () in
  let v_major = v / 1000000 in
  let v_minor = (v / 1000) mod 1000 in
  let v_micro = v mod 1000 in
  (v_major, v_minor, v_micro)