[Libguestfs] [PATCH] v2v: Make the interface between cmdline.ml and v2v.ml explicit.

Richard W.M. Jones rjones at redhat.com
Tue Nov 10 20:00:57 UTC 2015


---
 v2v/Makefile.am |  1 +
 v2v/cmdline.ml  | 27 +++++++++++++++++++++++----
 v2v/cmdline.mli | 35 +++++++++++++++++++++++++++++++++++
 v2v/v2v.ml      | 57 ++++++++++++++++++++++++++++-----------------------------
 4 files changed, 87 insertions(+), 33 deletions(-)
 create mode 100644 v2v/cmdline.mli

diff --git a/v2v/Makefile.am b/v2v/Makefile.am
index 49eeedc..5dfef6e 100644
--- a/v2v/Makefile.am
+++ b/v2v/Makefile.am
@@ -40,6 +40,7 @@ EXTRA_DIST = \
 CLEANFILES = *~ *.annot *.cmi *.cmo *.cmx *.cmxa *.o virt-v2v
 
 SOURCES_MLI = \
+	cmdline.mli \
 	convert_linux.mli \
 	convert_windows.mli \
 	curl.mli \
diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
index f6e75ce..100c2a4 100644
--- a/v2v/cmdline.ml
+++ b/v2v/cmdline.ml
@@ -26,6 +26,20 @@ open Common_utils
 open Types
 open Utils
 
+type cmdline = {
+  compressed : bool;
+  debug_overlays : bool;
+  do_copy : bool;
+  in_place : bool;
+  network_map : ((vnet_type * string) * string) list;
+  no_trim : string list;
+  output_alloc : output_allocation;
+  output_format : string option;
+  output_name : string option;
+  print_source : bool;
+  root_choice : [`Ask|`Single|`First|`Dev of string];
+}
+
 let parse_cmdline () =
   let compressed = ref false in
   let debug_overlays = ref false in
@@ -416,7 +430,12 @@ read the man page virt-v2v(1).
       } in
       Output_vdsm.output_vdsm os vdsm_params vmtype output_alloc in
 
-  input, output,
-  compressed, debug_overlays, do_copy, in_place, network_map, no_trim,
-  output_alloc, output_format, output_name,
-  print_source, root_choice
+  {
+    compressed = compressed; debug_overlays = debug_overlays;
+    do_copy = do_copy; in_place = in_place; network_map = network_map;
+    no_trim = no_trim;
+    output_alloc = output_alloc; output_format = output_format;
+    output_name = output_name;
+    print_source = print_source; root_choice = root_choice;
+  },
+  input, output
diff --git a/v2v/cmdline.mli b/v2v/cmdline.mli
new file mode 100644
index 0000000..f7c3753
--- /dev/null
+++ b/v2v/cmdline.mli
@@ -0,0 +1,35 @@
+(* virt-v2v
+ * Copyright (C) 2009-2015 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.
+ *)
+
+(** Command line argument parsing. *)
+
+type cmdline = {
+  compressed : bool;
+  debug_overlays : bool;
+  do_copy : bool;
+  in_place : bool;
+  network_map : ((Types.vnet_type * string) * string) list;
+  no_trim : string list;
+  output_alloc : Types.output_allocation;
+  output_format : string option;
+  output_name : string option;
+  print_source : bool;
+  root_choice : [`Ask|`Single|`First|`Dev of string];
+}
+
+val parse_cmdline : unit -> cmdline * Types.input * Types.output
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
index a4f35ce..7e8b459 100644
--- a/v2v/v2v.ml
+++ b/v2v/v2v.ml
@@ -27,6 +27,8 @@ open Common_utils
 open Types
 open Utils
 
+open Cmdline
+
 (* Mountpoint stats, used for free space estimation. *)
 type mpstat = {
   mp_dev : string;                      (* Filesystem device (eg. /dev/sda1) *)
@@ -49,24 +51,20 @@ let () = Random.self_init ()
 
 let rec main () =
   (* Handle the command line. *)
-  let input, output,
-    compressed, debug_overlays, do_copy, in_place, network_map, no_trim,
-    output_alloc, output_format, output_name, print_source, root_choice =
-    Cmdline.parse_cmdline () in
+  let cmdline, input, output = parse_cmdline () in
 
   (* Print the version, easier than asking users to tell us. *)
   if verbose () then
     printf "%s: %s %s (%s)\n%!"
       prog Guestfs_config.package_name Guestfs_config.package_version Guestfs_config.host_cpu;
 
-  let source = open_source input print_source in
-  let source = amend_source source output_name network_map in
+  let source = open_source cmdline input in
+  let source = amend_source cmdline source in
 
   let conversion_mode =
-    if not in_place then (
+    if not cmdline.in_place then (
       let overlays = create_overlays source.s_disks in
-      let targets =
-        init_targets overlays source output output_format compressed in
+      let targets = init_targets cmdline output source overlays in
       Copying (overlays, targets)
     )
     else In_place in
@@ -88,7 +86,7 @@ let rec main () =
 
   (* Inspection - this also mounts up the filesystems. *)
   message (f_"Inspecting the overlay");
-  let inspect = inspect_source g root_choice in
+  let inspect = inspect_source cmdline g in
 
   let mpstats = get_mpstats g in
   check_free_space mpstats;
@@ -103,13 +101,14 @@ let rec main () =
 
   g#umount_all ();
 
-  if no_trim <> ["*"] && (do_copy || debug_overlays) then (
+  if cmdline.no_trim <> ["*"] &&
+       (cmdline.do_copy || cmdline.debug_overlays) then (
     (* Doing fstrim on all the filesystems reduces the transfer size
      * because unused blocks are marked in the overlay and thus do
      * not have to be copied.
      *)
     message (f_"Mapping filesystem data to avoid copying unused and blank areas");
-    do_fstrim g no_trim inspect;
+    do_fstrim g cmdline.no_trim inspect;
   );
 
   (match conversion_mode with
@@ -132,26 +131,26 @@ let rec main () =
          printf "%s%!" (string_of_target_buses target_buses);
 
        let targets =
-         if not do_copy then targets
-         else copy_targets targets input output output_alloc compressed in
+         if not cmdline.do_copy then targets
+         else copy_targets cmdline targets input output in
 
        (* Create output metadata. *)
        message (f_"Creating output metadata");
        output#create_metadata source targets target_buses guestcaps inspect
                              target_firmware;
 
-       if debug_overlays then preserve_overlays overlays source.s_name;
+       if cmdline.debug_overlays then preserve_overlays overlays source.s_name;
 
        delete_target_on_exit := false  (* Don't delete target on exit. *)
   );
   message (f_"Finishing off")
 
-and open_source input print_source =
+and open_source cmdline input =
   message (f_"Opening the source %s") input#as_options;
   let source = input#source () in
 
   (* Print source and stop. *)
-  if print_source then (
+  if cmdline.print_source then (
     printf (f_"Source guest information (--print-source option):\n");
     printf "\n";
     printf "%s\n" (string_of_source source);
@@ -178,10 +177,10 @@ and open_source input print_source =
 
   source
 
-and amend_source source output_name network_map =
+and amend_source cmdline source =
   (* Map source name. *)
   let source =
-    match output_name with
+    match cmdline.output_name with
     | None -> source
     (* Note the s_orig_name field retains the original name in case we
      * need it for some reason.
@@ -195,12 +194,12 @@ and amend_source source output_name network_map =
         (* Look for a --network or --bridge parameter which names this
          * network/bridge (eg. --network in:out).
          *)
-        let new_name = List.assoc (t, vnet) network_map in
+        let new_name = List.assoc (t, vnet) cmdline.network_map in
         { nic with s_vnet = new_name }
       with Not_found ->
         try
           (* Not found, so look for a default mapping (eg. --network out). *)
-          let new_name = List.assoc (t, "") network_map in
+          let new_name = List.assoc (t, "") cmdline.network_map in
           { nic with s_vnet = new_name }
         with Not_found ->
           (* Not found, so return the original NIC unchanged. *)
@@ -248,7 +247,7 @@ and create_overlays src_disks =
         ov_virtual_size = vsize; ov_source = source }
   ) src_disks
 
-and init_targets overlays source output output_format compressed =
+and init_targets cmdline output source overlays =
   (* Work out where we will write the final output.  Do this early
    * just so we can display errors to the user before doing too much
    * work.
@@ -259,7 +258,7 @@ and init_targets overlays source output output_format compressed =
       fun ov ->
         (* What output format should we use? *)
         let format =
-          match output_format, ov.ov_source.s_format with
+          match cmdline.output_format, ov.ov_source.s_format with
           | Some format, _ -> format    (* -of overrides everything *)
           | None, Some format -> format (* same as backing format *)
           | None, None ->
@@ -276,7 +275,7 @@ and init_targets overlays source output output_format compressed =
           error (f_"output format should be 'raw' or 'qcow2'.\n\nUse the '-of <format>' option to select a different output format for the converted guest.\n\nOther output formats are not supported at the moment, although might be considered in future.");
 
         (* Only allow compressed with qcow2. *)
-        if compressed && format <> "qcow2" then
+        if cmdline.compressed && format <> "qcow2" then
           error (f_"the --compressed flag is only allowed when the output format is qcow2 (-of qcow2)");
 
         (* output#prepare_targets will fill in the target_file field.
@@ -307,7 +306,7 @@ and populate_disks g src_disks =
                           ~discard:"besteffort"
   ) src_disks
 
-and inspect_source g root_choice =
+and inspect_source cmdline g =
   let roots = g#inspect_os () in
   let roots = Array.to_list roots in
 
@@ -317,7 +316,7 @@ and inspect_source g root_choice =
        error (f_"inspection could not detect the source guest (or physical machine).\n\nAssuming that you are running virt-v2v/virt-p2v on a source which is supported (and not, for example, a blank disk), then this should not happen.  You should run 'virt-v2v -v -x ... >& log' and attach the complete log to a new bug report (see http://libguestfs.org).\n\nNo root device found in this operating system image.");
     | [root] -> root
     | roots ->
-      match root_choice with
+      match cmdline.root_choice with
       | `Ask ->
         (* List out the roots and ask the user to choose. *)
         printf "\n***\n";
@@ -762,7 +761,7 @@ and get_target_firmware inspect guestcaps source output =
 
 and delete_target_on_exit = ref true
 
-and copy_targets targets input output output_alloc compressed =
+and copy_targets cmdline targets input output =
   (* Copy the source to the output. *)
   at_exit (fun () ->
     if !delete_target_on_exit then (
@@ -807,7 +806,7 @@ and copy_targets targets input output output_alloc compressed =
        *)
       (* What output preallocation mode should we use? *)
       let preallocation =
-        match t.target_format, output_alloc with
+        match t.target_format, cmdline.output_alloc with
         | ("raw"|"qcow2"), Sparse -> Some "sparse"
         | ("raw"|"qcow2"), Preallocated -> Some "full"
         | _ -> None (* ignore -oa flag for other formats *) in
@@ -821,7 +820,7 @@ and copy_targets targets input output output_alloc compressed =
         sprintf "qemu-img convert%s -n -f qcow2 -O %s%s %s %s"
           (if not (quiet ()) then " -p" else "")
           (quote t.target_format)
-          (if compressed then " -c" else "")
+          (if cmdline.compressed then " -c" else "")
           (quote overlay_file)
           (quote t.target_file) in
       if verbose () then printf "%s\n%!" cmd;
-- 
2.5.0




More information about the Libguestfs mailing list