mrc0mmand / rpms / libguestfs

Forked from rpms/libguestfs 3 years ago
Clone
Blob Blame History Raw
From 98cff1393866cf8df62c559bbc8abdaed515b91c Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 20 Oct 2014 17:37:04 +0100
Subject: [PATCH] v2v: -i libvirt: Create three specialized subclasses for
 handling vCenter/Xen/other.

Previously we had one class ('input_libvirt') which handled all three
cases.  Now we have one superclass ('input_libvirt') and three
subclasses of that ('input_libvirt_vcenter_https',
'input_libvirt_xen_ssh', 'input_libvirt_other') which handle the three
cases separately.

This is just code motion, and should be functionally equivalent to
what was here before.

(cherry picked from commit 9596fc44ff522f5f993a3c5ef9bb24a9a1b4a996)
---
 v2v/input_libvirt.ml | 138 ++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 92 insertions(+), 46 deletions(-)

diff --git a/v2v/input_libvirt.ml b/v2v/input_libvirt.ml
index def58bd..e8b1345 100644
--- a/v2v/input_libvirt.ml
+++ b/v2v/input_libvirt.ml
@@ -42,7 +42,8 @@ let error_if_no_ssh_agent () =
   with Not_found ->
     error (f_"ssh-agent authentication has not been set up ($SSH_AUTH_SOCK is not set).  Please read \"INPUT FROM RHEL 5 XEN\" in the virt-v2v(1) man page.")
 
-class input_libvirt verbose libvirt_uri guest =
+(* Superclass. *)
+class virtual input_libvirt verbose libvirt_uri guest =
 object
   inherit input verbose
 
@@ -52,61 +53,106 @@ object
       | None -> ""
       | Some uri -> " -ic " ^ uri)
       guest
+end
+
+(* Subclass specialized for handling anything that's *not* VMware vCenter
+ * or Xen.
+ *)
+class input_libvirt_other verbose libvirt_uri guest =
+object
+  inherit input_libvirt verbose libvirt_uri guest
 
   method source () =
+    if verbose then printf "input_libvirt_other: source()\n%!";
+
     (* Get the libvirt XML.  This also checks (as a side-effect)
      * that the domain is not running.  (RHBZ#1138586)
      *)
     let xml = Domainxml.dumpxml ?conn:libvirt_uri guest in
 
-    (* Depending on the libvirt URI we may need to convert <source/>
-     * paths so we can access them remotely (if that is possible).  This
-     * is only true for remote, non-NULL URIs.  (We assume the user
-     * doesn't try setting $LIBVIRT_URI.  If they do that then all bets
-     * are off).
+    Input_libvirtxml.parse_libvirt_xml ~verbose xml
+end
+
+(* Subclass specialized for handling VMware vCenter over https. *)
+class input_libvirt_vcenter_https
+  verbose libvirt_uri parsed_uri scheme server guest =
+object
+  inherit input_libvirt verbose libvirt_uri guest
+
+  method source () =
+    if verbose then printf "input_libvirt_vcenter_https: source()\n%!";
+
+    (* Get the libvirt XML.  This also checks (as a side-effect)
+     * that the domain is not running.  (RHBZ#1138586)
      *)
-    let map_source_file, map_source_dev =
-      match libvirt_uri with
-      | None -> None, None
-      | Some orig_uri ->
-        let { Xml.uri_server = server; uri_scheme = scheme } as uri =
-          try Xml.parse_uri orig_uri
-          with Invalid_argument msg ->
-            error (f_"could not parse '-ic %s'.  Original error message was: %s")
-              orig_uri msg in
-
-        match server, scheme with
-        | None, _
-        | Some "", _ ->                 (* Not a remote URI. *)
-          None, None
-
-        | Some _, None                  (* No scheme? *)
-        | Some _, Some "" ->
-          None, None
-
-        | Some server, Some ("esx"|"gsx"|"vpx" as scheme) -> (* ESX *)
-          error_if_libvirt_backend ();
-          let f = VCenter.map_path_to_uri verbose uri scheme server in
-          Some f, Some f
-
-        | Some server, Some ("xen+ssh" as scheme) -> (* Xen over SSH *)
-          error_if_libvirt_backend ();
-          error_if_no_ssh_agent ();
-          let f = Xen.map_path_to_uri verbose uri scheme server in
-          Some f, Some f
-
-        (* Old virt-v2v also supported qemu+ssh://.  However I am
-         * deliberately not supporting this in new virt-v2v.  Don't
-         * use virt-v2v if a guest already runs on KVM.
-         *)
-        | Some _, Some _ ->             (* Unknown remote scheme. *)
-          warning ~prog (f_"no support for remote libvirt connections to '-ic %s'.  The conversion may fail when it tries to read the source disks.")
-            orig_uri;
-          None, None in
+    let xml = Domainxml.dumpxml ?conn:libvirt_uri guest in
 
+    error_if_libvirt_backend ();
+
+    let mapf = VCenter.map_path_to_uri verbose parsed_uri scheme server in
     Input_libvirtxml.parse_libvirt_xml ~verbose
-      ?map_source_file ?map_source_dev xml
+      ~map_source_file:mapf ~map_source_dev:mapf xml
 end
 
-let input_libvirt = new input_libvirt
+(* Subclass specialized for handling Xen over SSH. *)
+class input_libvirt_xen_ssh
+  verbose libvirt_uri parsed_uri scheme server guest =
+object
+  inherit input_libvirt verbose libvirt_uri guest
+
+  method source () =
+    if verbose then printf "input_libvirt_xen_ssh: source()\n%!";
+
+    (* Get the libvirt XML.  This also checks (as a side-effect)
+     * that the domain is not running.  (RHBZ#1138586)
+     *)
+    let xml = Domainxml.dumpxml ?conn:libvirt_uri guest in
+
+    error_if_libvirt_backend ();
+    error_if_no_ssh_agent ();
+
+    let mapf = Xen.map_path_to_uri verbose parsed_uri scheme server in
+    Input_libvirtxml.parse_libvirt_xml ~verbose
+      ~map_source_file:mapf ~map_source_dev:mapf xml
+end
+
+(* Choose the right subclass based on the URI. *)
+let input_libvirt verbose libvirt_uri guest =
+  match libvirt_uri with
+  | None ->
+    new input_libvirt_other verbose libvirt_uri guest
+
+  | Some orig_uri ->
+    let { Xml.uri_server = server; uri_scheme = scheme } as parsed_uri =
+      try Xml.parse_uri orig_uri
+      with Invalid_argument msg ->
+        error (f_"could not parse '-ic %s'.  Original error message was: %s")
+          orig_uri msg in
+
+    match server, scheme with
+    | None, _
+    | Some "", _                        (* Not a remote URI. *)
+
+    | Some _, None                      (* No scheme? *)
+    | Some _, Some "" ->
+      new input_libvirt_other verbose libvirt_uri guest
+
+    | Some server, Some ("esx"|"gsx"|"vpx" as scheme) -> (* vCenter over https *)
+      new input_libvirt_vcenter_https
+        verbose libvirt_uri parsed_uri scheme server guest
+
+    | Some server, Some ("xen+ssh" as scheme) -> (* Xen over SSH *)
+      new input_libvirt_xen_ssh
+        verbose libvirt_uri parsed_uri scheme server guest
+
+    (* Old virt-v2v also supported qemu+ssh://.  However I am
+     * deliberately not supporting this in new virt-v2v.  Don't
+     * use virt-v2v if a guest already runs on KVM.
+     *)
+
+    | Some _, Some _ ->             (* Unknown remote scheme. *)
+      warning ~prog (f_"no support for remote libvirt connections to '-ic %s'.  The conversion may fail when it tries to read the source disks.")
+        orig_uri;
+      new input_libvirt_other verbose libvirt_uri guest
+
 let () = Modules_list.register_input_module "libvirt"
-- 
1.8.3.1