Blob Blame History Raw
From 7566786efa4e67b64c4160baccbc5be136e485e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= <tgolembi@redhat.com>
Date: Thu, 22 Feb 2018 11:41:08 +0100
Subject: [PATCH] v2v: vdsm: add --vdsm-fixed-ovf option
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add option for -o vdsm that enables output of the modified OVF. oVirt
engine should already be able to consume the OVF, but let's not take any
chances and enable it only by command line argument. It can be made
default later when it receives proper testing.

Signed-off-by: Tomáš Golembiovský <tgolembi@redhat.com>
(cherry picked from commit 285014b290507865fd2020e44ea453af0262b624)
---
 v2v/cmdline.ml                 | 10 ++++++++++
 v2v/create_ovf.ml              |  7 +++++++
 v2v/create_ovf.mli             |  9 +++++++++
 v2v/output_vdsm.ml             |  9 +++++++--
 v2v/output_vdsm.mli            |  1 +
 v2v/test-v2v-o-vdsm-options.sh |  3 ++-
 v2v/virt-v2v.pod               | 20 ++++++++++++++++++++
 7 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
index 0bc5e9055..e80b0689b 100644
--- a/v2v/cmdline.ml
+++ b/v2v/cmdline.ml
@@ -79,6 +79,11 @@ let parse_cmdline () =
   let vdsm_compat = ref "0.10" in
   let set_vdsm_compat s = vdsm_compat := s in
 
+  let vdsm_ovf_flavour = ref Create_ovf.RHVExportStorageDomain in
+  let ovf_flavours_str = String.concat "|" Create_ovf.ovf_flavours in
+  let set_vdsm_ovf_flavour arg =
+    vdsm_ovf_flavour := Create_ovf.ovf_flavour_of_string arg in
+
   let set_string_option_once optname optref arg =
     match !optref with
     | Some _ ->
@@ -249,6 +254,8 @@ let parse_cmdline () =
                                     s_"Output VM UUID";
     [ L"vdsm-ovf-output" ], Getopt.String ("-", set_string_option_once "--vdsm-ovf-output" vdsm_ovf_output),
                                     s_"Output OVF file";
+    [ L"vdsm-ovf-flavour" ], Getopt.Symbol (ovf_flavours_str, Create_ovf.ovf_flavours, set_vdsm_ovf_flavour),
+                                    s_"Set the type of generated OVF (default rhvexp)";
     [ L"vmtype" ],   Getopt.String ("-", vmtype_warning),
                                     s_"Ignored for backwards compatibility";
   ] in
@@ -325,6 +332,7 @@ read the man page virt-v2v(1).
   let vdsm_vol_uuids = List.rev !vdsm_vol_uuids in
   let vdsm_vm_uuid = !vdsm_vm_uuid in
   let vdsm_ovf_output = Option.default "." !vdsm_ovf_output in
+  let vdsm_ovf_flavour = !vdsm_ovf_flavour in
 
   (* No arguments and machine-readable mode?  Print out some facts
    * about what this binary supports.
@@ -340,6 +348,7 @@ read the man page virt-v2v(1).
     List.iter (printf "input:%s\n") (Modules_list.input_modules ());
     List.iter (printf "output:%s\n") (Modules_list.output_modules ());
     List.iter (printf "convert:%s\n") (Modules_list.convert_modules ());
+    List.iter (printf "ovf:%s\n") Create_ovf.ovf_flavours;
     exit 0
   );
 
@@ -545,6 +554,7 @@ read the man page virt-v2v(1).
         vm_uuid = vdsm_vm_uuid;
         ovf_output = vdsm_ovf_output;
         compat = vdsm_compat;
+        ovf_flavour = vdsm_ovf_flavour;
       } in
       Output_vdsm.output_vdsm os vdsm_options output_alloc,
       output_format, output_alloc in
diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml
index b9858ff93..f1985ea86 100644
--- a/v2v/create_ovf.ml
+++ b/v2v/create_ovf.ml
@@ -33,6 +33,13 @@ type ovf_flavour =
   | OVirt
   | RHVExportStorageDomain
 
+let ovf_flavours = ["ovirt"; "rhvexp"]
+
+let ovf_flavour_of_string = function
+  | "ovirt" -> OVirt
+  | "rhvexp" -> RHVExportStorageDomain
+  | flav -> invalid_arg flav
+
 (* We set the creation time to be the same for all dates in
  * all metadata files.  All dates in OVF are UTC.
  *)
diff --git a/v2v/create_ovf.mli b/v2v/create_ovf.mli
index 8a8c7dd12..2d80660e3 100644
--- a/v2v/create_ovf.mli
+++ b/v2v/create_ovf.mli
@@ -20,6 +20,15 @@ type ovf_flavour =
   | OVirt
   | RHVExportStorageDomain
 
+(** The string representation of available OVF flavours. *)
+val ovf_flavours : string list
+
+(** Convert from a string to the corresponding OVF flavour.
+
+    Throw [Invalid_argument] if the string does not match any
+    valid flavour. *)
+val ovf_flavour_of_string : string -> ovf_flavour
+
 (** Create OVF and related files for RHV.
 
     The format for RHV export storage domain is described in:
diff --git a/v2v/output_vdsm.ml b/v2v/output_vdsm.ml
index ce286d327..b76a2e930 100644
--- a/v2v/output_vdsm.ml
+++ b/v2v/output_vdsm.ml
@@ -32,6 +32,7 @@ type vdsm_options = {
   vm_uuid : string;
   ovf_output : string;
   compat : string;
+  ovf_flavour : Create_ovf.ovf_flavour;
 }
 
 class output_vdsm os vdsm_options output_alloc =
@@ -39,7 +40,7 @@ object
   inherit output
 
   method as_options =
-    sprintf "-o vdsm -os %s%s%s --vdsm-vm-uuid %s --vdsm-ovf-output %s%s" os
+    sprintf "-o vdsm -os %s%s%s --vdsm-vm-uuid %s --vdsm-ovf-output %s%s%s" os
       (String.concat ""
          (List.map (sprintf " --vdsm-image-uuid %s") vdsm_options.image_uuids))
       (String.concat ""
@@ -49,6 +50,10 @@ object
       (match vdsm_options.compat with
        | "0.10" -> "" (* currently this is the default, so don't print it *)
        | s -> sprintf " --vdsm-compat=%s" s)
+      (match vdsm_options.ovf_flavour with
+       | Create_ovf.OVirt -> "--vdsm-ovf-flavour=ovf"
+       (* currently this is the default, so don't print it *)
+       | Create_ovf.RHVExportStorageDomain -> "")
 
   method supported_firmware = [ TargetBIOS ]
 
@@ -176,7 +181,7 @@ object
       vdsm_options.image_uuids
       vdsm_options.vol_uuids
       vdsm_options.vm_uuid
-      Create_ovf.RHVExportStorageDomain in
+      vdsm_options.ovf_flavour in
 
     (* Write it to the metadata file. *)
     let file = vdsm_options.ovf_output // vdsm_options.vm_uuid ^ ".ovf" in
diff --git a/v2v/output_vdsm.mli b/v2v/output_vdsm.mli
index 401a71ec4..6ed684638 100644
--- a/v2v/output_vdsm.mli
+++ b/v2v/output_vdsm.mli
@@ -24,6 +24,7 @@ type vdsm_options = {
   vm_uuid : string;                   (* --vdsm-vm-uuid *)
   ovf_output : string;                (* --vdsm-ovf-output *)
   compat : string;                    (* --vdsm-compat=0.10|1.1 *)
+  ovf_flavour : Create_ovf.ovf_flavour;
 }
 (** Miscellaneous extra command line parameters used by VDSM. *)
 
diff --git a/v2v/test-v2v-o-vdsm-options.sh b/v2v/test-v2v-o-vdsm-options.sh
index 753efc4e7..4ad5d4aad 100755
--- a/v2v/test-v2v-o-vdsm-options.sh
+++ b/v2v/test-v2v-o-vdsm-options.sh
@@ -55,7 +55,8 @@ $VG virt-v2v --debug-gc \
     --vdsm-vol-uuid VOL \
     --vdsm-vm-uuid VM \
     --vdsm-ovf-output $d/12345678-1234-1234-1234-123456789abc/master/vms/VM \
-    --vdsm-compat=1.1
+    --vdsm-compat=1.1 \
+    --vdsm-ovf-flavour=ovirt
 
 # Test the OVF metadata was created.
 test -f $d/12345678-1234-1234-1234-123456789abc/master/vms/VM/VM.ovf
diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod
index f8a937960..d81a2339c 100644
--- a/v2v/virt-v2v.pod
+++ b/v2v/virt-v2v.pod
@@ -627,6 +627,26 @@ hex digit can be C<0-9> or C<a-f>), conforming to S<OSF DCE 1.1>.
 
 These options can only be used with I<-o vdsm>.
 
+=item B<--vdsm-ovf-flavour> flavour
+
+This option controls the format of the OVF generated at the end of conversion.
+Currently there are two possible flavours:
+
+=over 4
+
+=item rhevexp
+
+The OVF format used in RHV export storage domain.
+
+=item ovirt
+
+The OVF format understood by oVirt REST API.
+
+=back
+
+For backward compatibility the default is I<rhevexp>, but this may change in
+the future.
+
 =item B<-v>
 
 =item B<--verbose>
-- 
2.20.1