From 179e2fe32705ecc34759630f72dcfdbcf076e526 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Mon, 20 Oct 2014 18:02:57 +0100 Subject: [PATCH] v2v: -i libvirt: Refactor map_source* functions. Get rid of the awkward map_source* functions, and replace it with equivalent code which modifies the source disks objects coming back from Input_libvirtxml.parse_libvirt_xml. This is just code refactoring. Apart from the order in which certain tests are done, this should be equivalent to the previous code. (cherry picked from commit 3596165282ccf2c5896894ec4e9a71c6da788463) --- v2v/input_libvirt.ml | 32 +++++++++++++++++++++++--------- v2v/input_libvirtxml.ml | 31 ++++++++++++------------------- v2v/input_libvirtxml.mli | 11 +---------- 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/v2v/input_libvirt.ml b/v2v/input_libvirt.ml index e8b1345..9d2869f 100644 --- a/v2v/input_libvirt.ml +++ b/v2v/input_libvirt.ml @@ -82,16 +82,23 @@ object method source () = if verbose then printf "input_libvirt_vcenter_https: source()\n%!"; + error_if_libvirt_backend (); + (* 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 (); + let { s_disks = disks } as source = + Input_libvirtxml.parse_libvirt_xml ~verbose xml in let mapf = VCenter.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 + let disks = List.map ( + fun ({ s_qemu_uri = uri; s_format = format } as disk) -> + let uri, format = mapf uri format in + { disk with s_qemu_uri = uri; s_format = format } + ) disks in + + { source with s_disks = disks } end (* Subclass specialized for handling Xen over SSH. *) @@ -103,17 +110,24 @@ object method source () = if verbose then printf "input_libvirt_xen_ssh: source()\n%!"; + error_if_libvirt_backend (); + error_if_no_ssh_agent (); + (* 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 { s_disks = disks } as source = + Input_libvirtxml.parse_libvirt_xml ~verbose xml in 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 + let disks = List.map ( + fun ({ s_qemu_uri = uri; s_format = format } as disk) -> + let uri, format = mapf uri format in + { disk with s_qemu_uri = uri; s_format = format } + ) disks in + + { source with s_disks = disks } end (* Choose the right subclass based on the URI. *) diff --git a/v2v/input_libvirtxml.ml b/v2v/input_libvirtxml.ml index 984db18..3b19685 100644 --- a/v2v/input_libvirtxml.ml +++ b/v2v/input_libvirtxml.ml @@ -24,13 +24,7 @@ open Common_utils open Types open Utils -type map_source = string -> string option -> string * string option - -let no_map : map_source = fun x y -> x, y - -let parse_libvirt_xml ~verbose - ?(map_source_file = no_map) ?(map_source_dev = no_map) - xml = +let parse_libvirt_xml ~verbose xml = if verbose then printf "libvirt xml is:\n%s\n" xml; @@ -144,16 +138,12 @@ let parse_libvirt_xml ~verbose match xpath_to_string "@type" "" with | "block" -> let path = xpath_to_string "source/@dev" "" in - if path <> "" then ( - let path, format = map_source_dev path format in + if path <> "" then add_disk path format target_dev - ) | "file" -> let path = xpath_to_string "source/@file" "" in - if path <> "" then ( - let path, format = map_source_file path format in + if path <> "" then add_disk path format target_dev - ) | "network" -> (* We only handle here, and that is * intended only for virt-p2v. Any other network disk is @@ -265,6 +255,8 @@ object method source () = let xml = read_whole_file file in + let { s_disks = disks } as source = parse_libvirt_xml ~verbose xml in + (* When reading libvirt XML from a file (-i libvirtxml) we allow * paths to disk images in the libvirt XML to be relative (to the XML * file). Relative paths are in fact not permitted in real libvirt @@ -272,13 +264,14 @@ object * when writing the XML by hand. *) let dir = Filename.dirname (absolute_path file) in - let map_source_file path format = - let path = - if not (Filename.is_relative path) then path else dir // path in - path, format - in + let disks = List.map ( + fun ({ s_qemu_uri = path } as disk) -> + let path = + if not (Filename.is_relative path) then path else dir // path in + { disk with s_qemu_uri = path } + ) disks in - parse_libvirt_xml ~verbose ~map_source_file xml + { source with s_disks = disks } end let input_libvirtxml = new input_libvirtxml diff --git a/v2v/input_libvirtxml.mli b/v2v/input_libvirtxml.mli index d673150..5c10df0 100644 --- a/v2v/input_libvirtxml.mli +++ b/v2v/input_libvirtxml.mli @@ -18,18 +18,9 @@ (** [-i libvirtxml] source. *) -type map_source = string -> string option -> string * string option -(** Map function that takes [path] and [format] parameters, and - returns the possibly rewritten [qemu_uri, format] pair. *) - -val parse_libvirt_xml : verbose:bool -> ?map_source_file:map_source -> ?map_source_dev:map_source -> string -> Types.source +val parse_libvirt_xml : verbose:bool -> string -> Types.source (** Take libvirt XML and parse it into a {!Types.source} structure. - The optional [?map_source_file] and [?map_source_dev] functions - are used to map [] and [] - from the XML into QEMU URIs. If not given, then an identity - mapping is used. - This function is also used by {!Input_libvirt}, hence it is exported. *) -- 1.8.3.1