[Libguestfs] [PATCH v7 4/6] v2v: Add general mechanism for input and output options (-io/-oo).
Tomáš Golembiovský
tgolembi at redhat.com
Tue Mar 27 00:12:38 UTC 2018
I still have not found time to fully review the series, but I found out
that this patch breaks VDDK. See below.
On Thu, 22 Mar 2018 15:24:23 +0000
"Richard W.M. Jones" <rjones at redhat.com> wrote:
> Currently we have a bunch of ad hoc options like --vddk* and --vdsm*
> (and proposed to add --rhv*) to handle extra parameters for input and
> output modes/transports. This complicates the command line parsing
> and also the clarity of the command line (becauseit's not very obvious
> which options apply to which side of the conversion).
>
> Replace these with a general mechanism for handling input and output
> options.
>
> Thus (for example):
>
> --vddk-thumbprint=... becomes -io vddk-thumbprint=...
> --vdsm-compat=0.10 -oo vdsm-compat=0.10
>
> The responsibility for parsing input and output options moves into the
> input and output drivers.
>
> This improves error checking so it's harder now for wrong flags to be
> included on the command line when they don't apply to the current mode.
>
> The old option names are preserved for compatibility.
> ---
> v2v/Makefile.am | 4 +
> v2v/cmdline.ml | 229 +++++++++++++++++-----------------
> v2v/input_libvirt.ml | 4 +-
> v2v/input_libvirt.mli | 4 +-
> v2v/input_libvirt_vddk.ml | 105 +++++++++-------
> v2v/input_libvirt_vddk.mli | 16 +--
> v2v/output_vdsm.ml | 79 +++++++++++-
> v2v/output_vdsm.mli | 4 +
> v2v/test-v2v-docs.sh | 31 ++++-
> v2v/test-v2v-it-vddk-io-query.sh | 38 ++++++
> v2v/test-v2v-o-vdsm-oo-query.sh | 38 ++++++
> v2v/test-v2v-o-vdsm-options.sh | 16 +--
> v2v/virt-v2v.pod | 258 +++++++++++++++++++++------------------
> 13 files changed, 522 insertions(+), 304 deletions(-)
>
> diff --git a/v2v/Makefile.am b/v2v/Makefile.am
> index c2eb31097..6e71cae3c 100644
> --- a/v2v/Makefile.am
> +++ b/v2v/Makefile.am
> @@ -306,6 +306,8 @@ TESTS = \
> test-v2v-i-ova-tar.sh \
> test-v2v-i-ova-two-disks.sh \
> test-v2v-i-vmx.sh \
> + test-v2v-it-vddk-io-query.sh \
> + test-v2v-o-vdsm-oo-query.sh \
> test-v2v-bad-networks-and-bridges.sh
>
> if HAVE_LIBVIRT
> @@ -471,6 +473,7 @@ EXTRA_DIST += \
> test-v2v-i-vmx-4.vmx \
> test-v2v-i-vmx-5.vmx \
> test-v2v-in-place.sh \
> + test-v2v-it-vddk-io-query.sh \
> test-v2v-machine-readable.sh \
> test-v2v-networks-and-bridges-expected.xml \
> test-v2v-networks-and-bridges.sh \
> @@ -482,6 +485,7 @@ EXTRA_DIST += \
> test-v2v-o-qemu.sh \
> test-v2v-o-rhv.ovf.expected \
> test-v2v-o-rhv.sh \
> + test-v2v-o-vdsm-oo-query.sh \
> test-v2v-o-vdsm-options.ovf.expected \
> test-v2v-o-vdsm-options.sh \
> test-v2v-oa-option.sh \
> diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
> index 6aecd2aee..dc675fb42 100644
> --- a/v2v/cmdline.ml
> +++ b/v2v/cmdline.ml
> @@ -69,24 +69,6 @@ let parse_cmdline () =
> let output_password = ref None in
> let output_storage = ref None in
> let password_file = ref None in
> - let vddk_config = ref None in
> - let vddk_cookie = ref None in
> - let vddk_libdir = ref None in
> - let vddk_nfchostport = ref None in
> - let vddk_port = ref None in
> - let vddk_snapshot = ref None in
> - let vddk_thumbprint = ref None in
> - let vddk_transports = ref None in
> - let vddk_vimapiver = ref None in
> - let vdsm_vm_uuid = ref None in
> - let vdsm_ovf_output = ref None in (* default "." *)
> -
> - 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 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
> @@ -110,6 +92,15 @@ let parse_cmdline () =
> error (f_"unknown -i option: %s") s
> in
>
> + let input_options = ref [] in
> + let set_input_option_compat k v =
> + input_options := (k, v) :: !input_options
> + in
> + let set_input_option option =
> + let k, v = String.split "=" option in
> + set_input_option_compat k v
> + in
> +
> let network_map = ref NetworkMap.empty in
> let add_network, add_bridge =
> let add flag name t str =
> @@ -163,6 +154,15 @@ let parse_cmdline () =
> error (f_"unknown -oa option: %s") s
> in
>
> + let output_options = ref [] in
> + let set_output_option_compat k v =
> + output_options := (k, v) :: !output_options
> + in
> + let set_output_option option =
> + let k, v = String.split "=" option in
> + set_output_option_compat k v
> + in
> +
> let root_choice = ref AskRoot in
> let set_root_choice = function
> | "ask" -> root_choice := AskRoot
> @@ -173,12 +173,6 @@ let parse_cmdline () =
> error (f_"unknown --root option: %s") s
> in
>
> - let vdsm_image_uuids = ref [] in
> - let add_vdsm_image_uuid s = List.push_front s vdsm_image_uuids in
> -
> - let vdsm_vol_uuids = ref [] in
> - let add_vdsm_vol_uuid s = List.push_front s vdsm_vol_uuids in
> -
> let vmtype_warning _ =
> warning (f_"the --vmtype option has been removed and now does nothing")
> in
> @@ -201,6 +195,8 @@ let parse_cmdline () =
> s_"Libvirt URI";
> [ M"if" ], Getopt.String ("format", set_string_option_once "-if" input_format),
> s_"Input format (for -i disk)";
> + [ M"io" ], Getopt.String ("option[=value]", set_input_option),
> + s_"Set option for input mode";
> [ M"it" ], Getopt.String ("transport", set_string_option_once "-it" input_transport),
> s_"Input transport";
> [ L"in-place" ], Getopt.Set in_place,
> @@ -223,6 +219,8 @@ let parse_cmdline () =
> s_"Set output format";
> [ M"on" ], Getopt.String ("name", set_string_option_once "-on" output_name),
> s_"Rename guest when converting";
> + [ M"oo" ], Getopt.String ("option[=value]", set_output_option),
> + s_"Set option for output mode";
> [ M"op" ], Getopt.String ("filename", set_string_option_once "-op" output_password),
> s_"Use password from file to connect to output hypervisor";
> [ M"os" ], Getopt.String ("storage", set_string_option_once "-os" output_storage),
> @@ -236,36 +234,36 @@ let parse_cmdline () =
> [ L"qemu-boot" ], Getopt.Set qemu_boot, s_"Boot in qemu (-o qemu only)";
> [ L"root" ], Getopt.String ("ask|... ", set_root_choice),
> s_"How to choose root filesystem";
> - [ L"vddk-config" ], Getopt.String ("filename", set_string_option_once "--vddk-config" vddk_config),
> - s_"Set VDDK config file";
> - [ L"vddk-cookie" ], Getopt.String ("cookie", set_string_option_once "--vddk-cookie" vddk_cookie),
> - s_"Set VDDK cookie";
> - [ L"vddk-libdir" ], Getopt.String ("libdir", set_string_option_once "--vddk-libdir" vddk_libdir),
> - s_"Set VDDK library parent directory";
> - [ L"vddk-nfchostport" ], Getopt.String ("nfchostport", set_string_option_once "--vddk-nfchostport" vddk_nfchostport),
> - s_"Set VDDK nfchostport";
> - [ L"vddk-port" ], Getopt.String ("port", set_string_option_once "--vddk-port" vddk_port),
> - s_"Set VDDK port";
> - [ L"vddk-snapshot" ], Getopt.String ("snapshot-moref", set_string_option_once "--vddk-snapshot" vddk_snapshot),
> - s_"Set VDDK snapshot";
> - [ L"vddk-thumbprint" ], Getopt.String ("thumbprint", set_string_option_once "--vddk-thumbprint" vddk_thumbprint),
> - s_"Set VDDK thumbprint";
> - [ L"vddk-transports" ], Getopt.String ("transports", set_string_option_once "--vddk-transports" vddk_transports),
> - s_"Set VDDK transports";
> - [ L"vddk-vimapiver" ], Getopt.String ("apiver", set_string_option_once "--vddk-vimapiver" vddk_vimapiver),
> - s_"Set VDDK vimapiver";
> - [ L"vdsm-compat" ], Getopt.Symbol ("0.10|1.1", ["0.10"; "1.1"], set_vdsm_compat),
> - s_"Write qcow2 with compat=0.10|1.1";
> - [ L"vdsm-image-uuid" ], Getopt.String ("uuid", add_vdsm_image_uuid),
> - s_"Output image UUID(s)";
> - [ L"vdsm-vol-uuid" ], Getopt.String ("uuid", add_vdsm_vol_uuid),
> - s_"Output vol UUID(s)";
> - [ L"vdsm-vm-uuid" ], Getopt.String ("uuid", set_string_option_once "--vdsm-vm-uuid" vdsm_vm_uuid),
> - 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"vddk-config" ], Getopt.String ("filename", set_input_option_compat "vddk-config"),
> + s_"Same as ‘-io vddk-config=filename’";
> + [ L"vddk-cookie" ], Getopt.String ("cookie", set_input_option_compat "vddk-cookie"),
> + s_"Same as ‘-io vddk-cookie=filename’";
> + [ L"vddk-libdir" ], Getopt.String ("libdir", set_input_option_compat "vddk-libdir"),
> + s_"Same as ‘-io vddk-libdir=libdir’";
> + [ L"vddk-nfchostport" ], Getopt.String ("nfchostport", set_input_option_compat "vddk-nfchostport"),
> + s_"Same as ‘-io vddk-nfchostport=nfchostport’";
> + [ L"vddk-port" ], Getopt.String ("port", set_input_option_compat "vddk-port"),
> + s_"Same as ‘-io vddk-port=port’";
> + [ L"vddk-snapshot" ], Getopt.String ("snapshot-moref", set_input_option_compat "vddk-snapshot"),
> + s_"Same as ‘-io vddk-snapshot=snapshot-moref’";
> + [ L"vddk-thumbprint" ], Getopt.String ("thumbprint", set_input_option_compat "vddk-thumbprint"),
> + s_"Same as ‘-io vddk-thumbprint=thumbprint’";
> + [ L"vddk-transports" ], Getopt.String ("transports", set_input_option_compat "vddk-transports"),
> + s_"Same as ‘-io vddk-transports=transports’";
> + [ L"vddk-vimapiver" ], Getopt.String ("apiver", set_input_option_compat "vddk-vimapiver"),
> + s_"Same as ‘-io vddk-vimapiver=apiver’";
> + [ L"vdsm-compat" ], Getopt.String ("0.10|1.1", set_output_option_compat "vdsm-compat"),
> + s_"Same as ‘-oo vdsm-compat=0.10|1.1’";
> + [ L"vdsm-image-uuid" ], Getopt.String ("uuid", set_output_option_compat "vdsm-image-uuid"),
> + s_"Same as ‘-oo vdsm-image-uuid=uuid’";
> + [ L"vdsm-vol-uuid" ], Getopt.String ("uuid", set_output_option_compat "vdsm-vol-uuid"),
> + s_"Same as ‘-oo vdsm-vol-uuid=uuid’";
> + [ L"vdsm-vm-uuid" ], Getopt.String ("uuid", set_output_option_compat "vdsm-vm-uuid"),
> + s_"Same as ‘-oo vdsm-vm-uuid=uuid’";
> + [ L"vdsm-ovf-output" ], Getopt.String ("dir", set_output_option_compat "vdsm-ovf-output"),
> + s_"Same as ‘-oo vdsm-ovf-output=dir’";
> + [ L"vdsm-ovf-flavour" ], Getopt.String (ovf_flavours_str, set_output_option_compat "vdsm-ovf-flavour"),
> + s_"Same as ‘-oo vdsm-ovf-flavour=flavour’";
> [ L"vmtype" ], Getopt.String ("-", vmtype_warning),
> s_"Ignored for backwards compatibility";
> ] in
> @@ -304,6 +302,7 @@ read the man page virt-v2v(1).
> let input_conn = !input_conn in
> let input_format = !input_format in
> let input_mode = !input_mode in
> + let input_options = List.rev !input_options in
> let input_transport =
> match !input_transport with
> | None -> None
> @@ -322,6 +321,7 @@ read the man page virt-v2v(1).
> let output_format = !output_format in
> let output_mode = !output_mode in
> let output_name = !output_name in
> + let output_options = List.rev !output_options in
> let output_password = !output_password in
> let output_storage = !output_storage in
> let password_file = !password_file in
> @@ -329,22 +329,6 @@ read the man page virt-v2v(1).
> let print_target = !print_target in
> let qemu_boot = !qemu_boot in
> let root_choice = !root_choice in
> - let vddk_options =
> - { Input_libvirt_vddk.vddk_config = !vddk_config;
> - vddk_cookie = !vddk_cookie;
> - vddk_libdir = !vddk_libdir;
> - vddk_nfchostport = !vddk_nfchostport;
> - vddk_port = !vddk_port;
> - vddk_snapshot = !vddk_snapshot;
> - vddk_thumbprint = !vddk_thumbprint;
> - vddk_transports = !vddk_transports;
> - vddk_vimapiver = !vddk_vimapiver } in
> - let vdsm_compat = !vdsm_compat in
> - let vdsm_image_uuids = List.rev !vdsm_image_uuids in
> - 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.
> @@ -358,6 +342,7 @@ read the man page virt-v2v(1).
> printf "colours-option\n";
> printf "vdsm-compat-option\n";
> printf "in-place\n";
> + printf "io/oo\n";
> 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 ());
> @@ -365,6 +350,65 @@ read the man page virt-v2v(1).
> exit 0
> );
>
> + (* Input transport affects whether some input options should or
> + * should not be used.
> + *)
> + let input_transport =
> + let is_query = input_options = ["?", ""] in
> + let no_options () =
> + if is_query then (
> + printf (f_"No -io (input options) are supported with this input transport.\n");
> + exit 0
> + )
> + else if input_options <> [] then
> + error (f_"no -io (input options) are allowed here");
> + in
> + match input_transport with
> + | None -> no_options (); None
> + | Some `SSH -> no_options (); Some `SSH
> + | Some `VDDK ->
> + if is_query then (
> + Input_libvirt_vddk.print_vddk_input_options ();
> + exit 0
> + )
> + else (
> + let vddk_options =
> + Input_libvirt_vddk.parse_vddk_input_options input_options in
> + Some (`VDDK vddk_options)
> + ) in
> +
> + (* Output mode affects whether some output options should or
> + * should not be used.
> + *)
> + let output_mode =
> + let is_query = output_options = ["?", ""] in
> + let no_options () =
> + if is_query then (
> + printf (f_"No -oo (output options) are supported in this output mode.\n");
> + exit 0
> + )
> + else if output_options <> [] then
> + error (f_"no -oo (output options) are allowed here");
> + in
> + match output_mode with
> + | `Not_set -> no_options (); `Not_set
> + | `Glance -> no_options (); `Glance
> + | `Libvirt -> no_options (); `Libvirt
> + | `Local -> no_options (); `Local
> + | `Null -> no_options (); `Null
> + | `RHV -> no_options (); `RHV
> + | `QEmu -> no_options (); `QEmu
> + | `VDSM ->
> + if is_query then (
> + Output_vdsm.print_vdsm_output_options ();
> + exit 0
> + )
> + else (
> + let vdsm_options =
> + Output_vdsm.parse_vdsm_output_options output_options in
> + `VDSM vdsm_options
> + ) in
> +
> (* Some options cannot be used with --in-place. *)
> if in_place then (
> if print_target then
> @@ -379,27 +423,6 @@ read the man page virt-v2v(1).
> let password = read_first_line_from_file filename in
> Some password in
>
> - (* Input transport affects whether some parameters should or
> - * should not be used.
> - *)
> - (match input_transport with
> - | None
> - | Some `SSH ->
> - if !vddk_config <> None ||
> - !vddk_cookie <> None ||
> - !vddk_libdir <> None ||
> - !vddk_nfchostport <> None ||
> - !vddk_port <> None ||
> - !vddk_snapshot <> None ||
> - !vddk_thumbprint <> None ||
> - !vddk_transports <> None ||
> - !vddk_vimapiver <> None then
> - error (f_"‘--vddk-*’ options should only be used when conversion via the nbdkit VDDK plugin has been enabled, ie. using ‘-it vddk’.")
> - | Some `VDDK ->
> - if !vddk_thumbprint = None then
> - error (f_"‘--vddk-thumbprint’ is required when using ‘-it vddk’.")
> - );
> -
> (* Parsing of the argument(s) depends on the input mode. *)
> let input =
> match input_mode with
> @@ -425,11 +448,10 @@ read the man page virt-v2v(1).
> let input_transport =
> match input_transport with
> | None -> None
> - | Some `VDDK -> Some `VDDK
> + | (Some (`VDDK _) as vddk) -> vddk
> | Some `SSH ->
> error (f_"only ‘-it vddk’ can be used here") in
> - Input_libvirt.input_libvirt vddk_options password
> - input_conn input_transport guest
> + Input_libvirt.input_libvirt password input_conn input_transport guest
>
> | `LibvirtXML ->
> (* -i libvirtxml: Expecting a filename (XML file). *)
> @@ -460,7 +482,7 @@ read the man page virt-v2v(1).
> match input_transport with
> | None -> None
> | Some `SSH -> Some `SSH
> - | Some `VDDK ->
> + | Some (`VDDK _) ->
> error (f_"only ‘-it ssh’ can be used here") in
> Input_vmx.input_vmx input_transport arg in
>
> @@ -558,7 +580,7 @@ read the man page virt-v2v(1).
> Output_rhv.output_rhv os output_alloc,
> output_format, output_alloc
>
> - | `VDSM ->
> + | `VDSM vdsm_options ->
> if output_password <> None then
> error_option_cannot_be_used_in_output_mode "vdsm" "-op";
> let os =
> @@ -568,21 +590,6 @@ read the man page virt-v2v(1).
> | Some d -> d in
> if qemu_boot then
> error_option_cannot_be_used_in_output_mode "vdsm" "--qemu-boot";
> - let vdsm_vm_uuid =
> - match vdsm_vm_uuid with
> - | None ->
> - error (f_"-o vdsm: --vdsm-image-uuid was not specified")
> - | Some s -> s in
> - if vdsm_image_uuids = [] || vdsm_vol_uuids = [] then
> - error (f_"-o vdsm: either --vdsm-vol-uuid or --vdsm-vm-uuid was not specified");
> - let vdsm_options = {
> - Output_vdsm.image_uuids = vdsm_image_uuids;
> - vol_uuids = vdsm_vol_uuids;
> - 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/input_libvirt.ml b/v2v/input_libvirt.ml
> index 25c81b924..377257dc2 100644
> --- a/v2v/input_libvirt.ml
> +++ b/v2v/input_libvirt.ml
> @@ -27,7 +27,7 @@ open Types
> open Utils
>
> (* Choose the right subclass based on the URI. *)
> -let input_libvirt vddk_options password libvirt_uri input_transport guest =
> +let input_libvirt password libvirt_uri input_transport guest =
> match libvirt_uri with
> | None ->
> Input_libvirt_other.input_libvirt_other password libvirt_uri guest
> @@ -53,7 +53,7 @@ let input_libvirt vddk_options password libvirt_uri input_transport guest =
> password libvirt_uri parsed_uri server guest
>
> (* vCenter or ESXi using nbdkit vddk plugin *)
> - | Some server, Some ("esx"|"gsx"|"vpx"), Some `VDDK ->
> + | Some server, Some ("esx"|"gsx"|"vpx"), Some (`VDDK vddk_options) ->
> Input_libvirt_vddk.input_libvirt_vddk vddk_options password
> libvirt_uri parsed_uri guest
>
> diff --git a/v2v/input_libvirt.mli b/v2v/input_libvirt.mli
> index 6f9162482..08824bb67 100644
> --- a/v2v/input_libvirt.mli
> +++ b/v2v/input_libvirt.mli
> @@ -18,7 +18,7 @@
>
> (** [-i libvirt] source. *)
>
> -val input_libvirt : Input_libvirt_vddk.vddk_options -> string option -> string option -> [`VDDK] option -> string -> Types.input
> -(** [input_libvirt vddk_options password libvirt_uri input_transport guest]
> +val input_libvirt : string option -> string option -> [`VDDK of Input_libvirt_vddk.vddk_options] option -> string -> Types.input
> +(** [input_libvirt password libvirt_uri input_transport guest]
> creates and returns a new {!Types.input} object specialized for reading
> input from libvirt sources. *)
> diff --git a/v2v/input_libvirt_vddk.ml b/v2v/input_libvirt_vddk.ml
> index a53f3e71d..fa253d242 100644
> --- a/v2v/input_libvirt_vddk.ml
> +++ b/v2v/input_libvirt_vddk.ml
> @@ -33,22 +33,66 @@ open Xpath_helpers
>
> open Printf
>
> -type vddk_options = {
> - vddk_config : string option;
> - vddk_cookie : string option;
> - vddk_libdir : string option;
> - vddk_nfchostport : string option;
> - vddk_port : string option;
> - vddk_snapshot : string option;
> - vddk_thumbprint : string option;
> - vddk_transports : string option;
> - vddk_vimapiver : string option;
> -}
> +type vddk_options = (string * string) list
> +
> +(* List of vddk-* input options. *)
> +let vddk_option_keys =
> + [ "vddk-config";
> + "vddk-cookie";
> + "vddk-libdir";
> + "vddk-nfchostport";
> + "vddk-port";
> + "vddk-snapshot";
> + "vddk-thumbprint";
> + "vddk-transports";
> + "vddk-vimapiver" ]
Notice that the new code includes the 'vddk-' prefix in the option keys.
But...
> +
> +let print_vddk_input_options () =
> + printf (f_"Input options (-io) which can be used with -it vddk:
> +
> + -io vddk-thumbprint=xx:xx:xx:...
> + VDDK server thumbprint (required)
> +
> +All other settings are optional:
> +
> + -io vddk-config=FILE VDDK configuration file
> + -io vddk-cookie=COOKIE VDDK cookie
> + -io vddk-libdir=LIBDIR VDDK library parent directory
> + -io vddk-nfchostport=PORT VDDK nfchostport
> + -io vddk-port=PORT VDDK port
> + -io vddk-snapshot=SNAPSHOT-MOREF
> + VDDK snapshot moref
> + -io vddk-transports=MODE:MODE:..
> + VDDK transports
> + -io vddk-vimapiver=APIVER VDDK vimapiver
> +
> +Refer to nbdkit-vddk-plugin(1) and the VDDK documentation for further
> +information on these settings.
> +")
> +
> +let parse_vddk_input_options options =
> + let keys = List.map fst options in
> +
> + (* Check there are no options we don't understand. *)
> + List.iter (
> + fun key ->
> + if not (String.is_prefix key "vddk-") ||
> + not (List.mem key vddk_option_keys) then
> + error (f_"-it vddk: ‘-io %s’ is not a valid input option") key
> + ) keys;
> +
> + (* Check no option appears twice. *)
> + if List.length keys <> List.length (List.sort_uniq keys) then
> + error (f_"-it vddk: duplicate -io options on the command line");
> +
> + options
>
> (* Subclass specialized for handling VMware via nbdkit vddk plugin. *)
> class input_libvirt_vddk vddk_options password libvirt_uri parsed_uri guest =
> (* The VDDK path. *)
> - let libdir = vddk_options.vddk_libdir in
> + let libdir =
> + try Some (List.assoc "vddk-libdir" vddk_options)
> + with Not_found -> None in
>
> (* VDDK libraries are located under lib32/ or lib64/ relative to the
> * libdir. Note this is unrelated to Linux multilib or multiarch.
> @@ -68,7 +112,7 @@ class input_libvirt_vddk vddk_options password libvirt_uri parsed_uri guest =
> | None -> ()
> | Some libdir ->
> if not (is_directory libdir) then
> - error (f_"‘--vddk-libdir %s’ does not point to a directory. See \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libdir
> + error (f_"‘-io vddk-libdir=%s’ does not point to a directory. See \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libdir
> );
>
> (match library_path with
> @@ -122,15 +166,15 @@ See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.")
> else
> error (f_"nbdkit VDDK plugin is not installed or not working. It is required if you want to use VDDK.
>
> -It looks like you did not set the right path in the ‘--vddk-libdir’ option, or your copy of the VDDK directory is incomplete. There should be a library called ’<libdir>/%s/libvixDiskLib.so.?’.
> +It looks like you did not set the right path in the ‘-io vddk-libdir’ option, or your copy of the VDDK directory is incomplete. There should be a library called ’<libdir>/%s/libvixDiskLib.so.?’.
>
> See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libNN
> )
> in
>
> let error_unless_thumbprint () =
> - if vddk_options.vddk_thumbprint = None then
> - error (f_"You must pass the ‘--vddk-thumbprint’ option with the SSL thumbprint of the VMware server. To find the thumbprint, see the nbdkit-vddk-plugin(1) manual. See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.")
> + if not (List.mem_assoc "vddk-thumbprint" vddk_options) then
> + error (f_"You must pass the ‘-io vddk-thumbprint’ option with the SSL thumbprint of the VMware server. To find the thumbprint, see the nbdkit-vddk-plugin(1) manual. See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.")
> in
>
> (* Check that nbdkit was compiled with SELinux support (for the
> @@ -147,18 +191,6 @@ See also \"INPUT FROM VDDK\" in the virt-v2v(1) manual.") libNN
> error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.")
> in
>
> - (* List of passthrough parameters. *)
> - let vddk_passthrus =
> - [ "config", (fun { vddk_config } -> vddk_config);
> - "cookie", (fun { vddk_cookie } -> vddk_cookie);
> - "libdir", (fun { vddk_libdir } -> vddk_libdir);
> - "nfchostport", (fun { vddk_nfchostport } -> vddk_nfchostport);
> - "port", (fun { vddk_port } -> vddk_port);
> - "snapshot", (fun { vddk_snapshot } -> vddk_snapshot);
> - "thumbprint", (fun { vddk_thumbprint } -> vddk_thumbprint);
> - "transports", (fun { vddk_transports } -> vddk_transports);
> - "vimapiver", (fun { vddk_vimapiver } -> vddk_vimapiver) ] in
> -
... the old code did not use 'vddk-foo' keys, just 'foo'.
> object
> inherit input_libvirt password libvirt_uri guest as super
>
> @@ -172,14 +204,9 @@ object
>
> method as_options =
> let pt_options =
> - String.concat "" (
> - List.map (
> - fun (name, get_field) ->
> - match get_field vddk_options with
> - | None -> ""
> - | Some field -> sprintf " --vddk-%s %s" name field
> - ) vddk_passthrus
> - ) in
> + String.concat ""
> + (List.map (fun (k, v) ->
> + sprintf " -io vddk-%s=%s" k v) vddk_options) in
So here you will get the prefix twice. E.g. vddk-vddk-libdir.
> sprintf "%s -it vddk %s"
> super#as_options (* superclass prints "-i libvirt etc" *)
> pt_options
> @@ -284,11 +311,7 @@ object
> add_arg (sprintf "vm=moref=%s" moref);
>
> (* The passthrough parameters. *)
> - List.iter (
> - fun (name, get_field) ->
> - Option.may (fun field -> add_arg (sprintf "%s=%s" name field))
> - (get_field vddk_options)
> - ) vddk_passthrus;
> + List.iter (fun (k, v) -> add_arg (sprintf "%s=%s" k v)) vddk_options;
And here you pass the options with the prefix too. But the plugin does
not expect 'vddk-foo' options. It expects 'foo' and thus breaks.
Tomas
>
> get_args () in
>
> diff --git a/v2v/input_libvirt_vddk.mli b/v2v/input_libvirt_vddk.mli
> index c8606c72a..ee2d6651a 100644
> --- a/v2v/input_libvirt_vddk.mli
> +++ b/v2v/input_libvirt_vddk.mli
> @@ -18,19 +18,13 @@
>
> (** [-i libvirt] when the source is VMware via nbdkit vddk plugin *)
>
> -type vddk_options = {
> - vddk_config : string option;
> - vddk_cookie : string option;
> - vddk_libdir : string option;
> - vddk_nfchostport : string option;
> - vddk_port : string option;
> - vddk_snapshot : string option;
> - vddk_thumbprint : string option;
> - vddk_transports : string option;
> - vddk_vimapiver : string option;
> -}
> +type vddk_options = (string * string) list
> (** Various options passed through to the nbdkit vddk plugin unmodified. *)
>
> +val print_vddk_input_options : unit -> unit
> +val parse_vddk_input_options : (string * string) list -> vddk_options
> +(** Print and parse vddk -io options. *)
> +
> val input_libvirt_vddk : vddk_options -> string option -> string option -> Xml.uri -> string -> Types.input
> (** [input_libvirt_vddk vddk_options password libvirt_uri parsed_uri guest]
> creates and returns a {!Types.input} object specialized for reading
> diff --git a/v2v/output_vdsm.ml b/v2v/output_vdsm.ml
> index b76a2e930..e540f5ec8 100644
> --- a/v2v/output_vdsm.ml
> +++ b/v2v/output_vdsm.ml
> @@ -35,23 +35,90 @@ type vdsm_options = {
> ovf_flavour : Create_ovf.ovf_flavour;
> }
>
> +let ovf_flavours_str = String.concat "|" Create_ovf.ovf_flavours
> +
> +let print_vdsm_output_options () =
> + printf (f_"Output options (-oo) which can be used with -o vdsm:
> +
> + -oo vdsm-compat=0.10|1.1 Write qcow2 with compat=0.10|1.1
> + (default: 0.10)
> + -oo vdsm-vm-uuid=UUID VM UUID (required)
> + -oo vdsm-ovf-output=DIR OVF metadata directory (required)
> + -oo vdsm-ovf-flavour=%s
> + Set the type of generated OVF (default: rhvexp)
> +
> +For each disk you must supply one of each of these options:
> +
> + -oo vdsm-image-uuid=UUID Image directory UUID
> + -oo vdsm-vol-uuid=UUID Disk volume UUID
> +") ovf_flavours_str
> +
> +let parse_vdsm_output_options options =
> + let vm_uuid = ref None in
> + let ovf_output = ref None in (* default "." *)
> + let compat = ref "0.10" in
> + let ovf_flavour = ref Create_ovf.RHVExportStorageDomain in
> + let image_uuids = ref [] in
> + let vol_uuids = ref [] in
> +
> + List.iter (
> + function
> + | "vdsm-compat", "0.10" -> compat := "0.10"
> + | "vdsm-compat", "1.1" -> compat := "1.1"
> + | "vdsm-compat", v ->
> + error (f_"-o vdsm: unknown vdsm-compat level ‘%s’") v
> + | "vdsm-vm-uuid", v ->
> + if !vm_uuid <> None then
> + error (f_"-o vdsm: -oo vdsm-vm-uuid set twice");
> + vm_uuid := Some v;
> + | "vdsm-ovf-output", v ->
> + if !ovf_output <> None then
> + error (f_"-o vdsm: -oo vdsm-ovf-output set twice");
> + ovf_output := Some v;
> + | "vdsm-ovf-flavour", v ->
> + ovf_flavour := Create_ovf.ovf_flavour_of_string v
> + | "vdsm-image-uuid", v ->
> + List.push_front v image_uuids
> + | "vdsm-vol-uuid", v ->
> + List.push_front v vol_uuids
> + | k, _ ->
> + error (f_"-o vdsm: unknown output option ‘-oo %s’") k
> + ) options;
> +
> + let compat = !compat in
> + let image_uuids = List.rev !image_uuids in
> + let vol_uuids = List.rev !vol_uuids in
> + if image_uuids = [] || vol_uuids = [] then
> + error (f_"-o vdsm: either -oo vdsm-vol-uuid or -oo vdsm-vm-uuid was not specified");
> + let vm_uuid =
> + match !vm_uuid with
> + | None ->
> + error (f_"-o vdsm: -oo vdsm-image-uuid was not specified")
> + | Some uuid -> uuid in
> + let ovf_output = Option.default "." !ovf_output in
> + let ovf_flavour = !ovf_flavour in
> +
> + { image_uuids; vol_uuids; vm_uuid; ovf_output; compat; ovf_flavour }
> +
> class output_vdsm os vdsm_options output_alloc =
> object
> inherit output
>
> method as_options =
> - sprintf "-o vdsm -os %s%s%s --vdsm-vm-uuid %s --vdsm-ovf-output %s%s%s" os
> + sprintf "-o vdsm -os %s%s%s -oo vdsm-vm-uuid=%s -oo vdsm-ovf-output=%s%s%s" os
> (String.concat ""
> - (List.map (sprintf " --vdsm-image-uuid %s") vdsm_options.image_uuids))
> + (List.map (sprintf " -oo vdsm-image-uuid=%s")
> + vdsm_options.image_uuids))
> (String.concat ""
> - (List.map (sprintf " --vdsm-vol-uuid %s") vdsm_options.vol_uuids))
> + (List.map (sprintf " -oo vdsm-vol-uuid=%s")
> + vdsm_options.vol_uuids))
> vdsm_options.vm_uuid
> vdsm_options.ovf_output
> (match vdsm_options.compat with
> | "0.10" -> "" (* currently this is the default, so don't print it *)
> - | s -> sprintf " --vdsm-compat=%s" s)
> + | s -> sprintf " -oo vdsm-compat=%s" s)
> (match vdsm_options.ovf_flavour with
> - | Create_ovf.OVirt -> "--vdsm-ovf-flavour=ovf"
> + | Create_ovf.OVirt -> "-oo vdsm-ovf-flavour=ovf"
> (* currently this is the default, so don't print it *)
> | Create_ovf.RHVExportStorageDomain -> "")
>
> @@ -84,7 +151,7 @@ object
> method prepare_targets _ targets =
> if List.length vdsm_options.image_uuids <> List.length targets ||
> List.length vdsm_options.vol_uuids <> List.length targets then
> - error (f_"the number of ‘--vdsm-image-uuid’ and ‘--vdsm-vol-uuid’ parameters passed on the command line has to match the number of guest disk images (for this guest: %d)")
> + error (f_"the number of ‘-oo vdsm-image-uuid’ and ‘-oo vdsm-vol-uuid’ parameters passed on the command line has to match the number of guest disk images (for this guest: %d)")
> (List.length targets);
>
> let mp, uuid =
> diff --git a/v2v/output_vdsm.mli b/v2v/output_vdsm.mli
> index 6ed684638..90ce8736c 100644
> --- a/v2v/output_vdsm.mli
> +++ b/v2v/output_vdsm.mli
> @@ -28,6 +28,10 @@ type vdsm_options = {
> }
> (** Miscellaneous extra command line parameters used by VDSM. *)
>
> +val print_vdsm_output_options : unit -> unit
> +val parse_vdsm_output_options : (string * string) list -> vdsm_options
> +(** Print and parse vdsm -oo options. *)
> +
> val output_vdsm : string -> vdsm_options -> Types.output_allocation -> Types.output
> (** [output_vdsm os vdsm_options output_alloc] creates and
> returns a new {!Types.output} object specialized for writing
> diff --git a/v2v/test-v2v-docs.sh b/v2v/test-v2v-docs.sh
> index 0e3bd916a..e1e22b599 100755
> --- a/v2v/test-v2v-docs.sh
> +++ b/v2v/test-v2v-docs.sh
> @@ -22,4 +22,33 @@ $TEST_FUNCTIONS
> skip_if_skipped
>
> $top_srcdir/podcheck.pl virt-v2v.pod virt-v2v \
> - --ignore=--debug-overlay,--ic,--if,--it,--no-trim,--oa,--oc,--of,--on,--op,--os,--vmtype
> + --ignore=\
> +--debug-overlay,\
> +--ic,\
> +--if,\
> +--io,\
> +--it,\
> +--no-trim,\
> +--oa,\
> +--oc,\
> +--of,\
> +--on,\
> +--oo,\
> +--op,\
> +--os,\
> +--vddk-config,\
> +--vddk-cookie,\
> +--vddk-libdir,\
> +--vddk-nfchostport,\
> +--vddk-port,\
> +--vddk-snapshot,\
> +--vddk-thumbprint,\
> +--vddk-transports,\
> +--vddk-vimapiver,\
> +--vdsm-compat,\
> +--vdsm-image-uuid,\
> +--vdsm-ovf-flavour,\
> +--vdsm-ovf-output,\
> +--vdsm-vm-uuid,\
> +--vdsm-vol-uuid,\
> +--vmtype
> diff --git a/v2v/test-v2v-it-vddk-io-query.sh b/v2v/test-v2v-it-vddk-io-query.sh
> new file mode 100755
> index 000000000..014e30207
> --- /dev/null
> +++ b/v2v/test-v2v-it-vddk-io-query.sh
> @@ -0,0 +1,38 @@
> +#!/bin/bash -
> +# libguestfs virt-v2v test script
> +# Copyright (C) 2018 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.
> +
> +# Test -io "?" option.
> +
> +set -e
> +
> +$TEST_FUNCTIONS
> +skip_if_skipped
> +
> +export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools"
> +export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win"
> +
> +f=test-v2v-it-vddk-io-query.actual
> +rm -f $f
> +
> +$VG virt-v2v --debug-gc \
> + -it vddk -io "?" > $f
> +
> +grep -- "-io vddk-config" $f
> +grep -- "-io vddk-thumbprint" $f
> +
> +rm $f
> diff --git a/v2v/test-v2v-o-vdsm-oo-query.sh b/v2v/test-v2v-o-vdsm-oo-query.sh
> new file mode 100755
> index 000000000..5691446ea
> --- /dev/null
> +++ b/v2v/test-v2v-o-vdsm-oo-query.sh
> @@ -0,0 +1,38 @@
> +#!/bin/bash -
> +# libguestfs virt-v2v test script
> +# Copyright (C) 2018 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.
> +
> +# Test -oo "?" option.
> +
> +set -e
> +
> +$TEST_FUNCTIONS
> +skip_if_skipped
> +
> +export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools"
> +export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win"
> +
> +f=test-v2v-o-vdsm-oo-query.actual
> +rm -f $f
> +
> +$VG virt-v2v --debug-gc \
> + -o vdsm -oo "?" > $f
> +
> +grep -- "-oo vdsm-compat" $f
> +grep -- "-oo vdsm-image-uuid" $f
> +
> +rm $f
> diff --git a/v2v/test-v2v-o-vdsm-options.sh b/v2v/test-v2v-o-vdsm-options.sh
> index 106f8694e..ddecfe3a1 100755
> --- a/v2v/test-v2v-o-vdsm-options.sh
> +++ b/v2v/test-v2v-o-vdsm-options.sh
> @@ -16,7 +16,7 @@
> # along with this program; if not, write to the Free Software
> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>
> -# Test -o vdsm options --vdsm-*-uuid
> +# Test -o vdsm options -oo vdsm-*-uuid
>
> set -e
> set -x
> @@ -43,19 +43,19 @@ mkdir $d/12345678-1234-1234-1234-123456789abc/master
> mkdir $d/12345678-1234-1234-1234-123456789abc/master/vms
> mkdir $d/12345678-1234-1234-1234-123456789abc/master/vms/VM
>
> -# The --vdsm-*-uuid options don't actually check that the
> +# The -oo vdsm-*-uuid options don't actually check that the
> # parameter is a UUID, which is useful here.
>
> $VG virt-v2v --debug-gc \
> -i libvirt -ic "$libvirt_uri" windows \
> -o vdsm -os $d/12345678-1234-1234-1234-123456789abc \
> -of qcow2 \
> - --vdsm-image-uuid IMAGE \
> - --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-ovf-flavour=ovirt
> + -oo vdsm-image-uuid=IMAGE \
> + -oo vdsm-vol-uuid=VOL \
> + -oo vdsm-vm-uuid=VM \
> + -oo vdsm-ovf-output=$d/12345678-1234-1234-1234-123456789abc/master/vms/VM \
> + -oo vdsm-compat=1.1 \
> + -oo 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 db7ac5166..4e3daedf0 100644
> --- a/v2v/virt-v2v.pod
> +++ b/v2v/virt-v2v.pod
> @@ -397,6 +397,47 @@ See L</IN PLACE CONVERSION> below.
>
> Conflicts with all I<-o *> options.
>
> +=item B<-io> OPTION=VALUE
> +
> +Set input option(s) related to the current input mode or transport.
> +To display short help on what options are available you can use:
> +
> + virt-v2v -it vddk -io "?"
> +
> +=item B<-io vddk-libdir=>LIBDIR
> +
> +Set the VDDK library directory. This directory should I<contain>
> +subdirectories called F<include>, F<lib64> etc., but do not include
> +F<lib64> actually in the parameter.
> +
> +In most cases this parameter is required when using the I<-it vddk>
> +(VDDK) transport. See L</INPUT FROM VDDK> below for details.
> +
> +=item B<-io vddk-thumbprint=>xx:xx:xx:...
> +
> +Set the thumbprint of the remote VMware server.
> +
> +This parameter is required when using the I<-it vddk> (VDDK) transport.
> +See L</INPUT FROM VDDK> below for details.
> +
> +=item B<-io vddk-config=>FILENAME
> +
> +=item B<-io vddk-cookie=>COOKIE
> +
> +=item B<-io vddk-nfchostport=>PORT
> +
> +=item B<-io vddk-port=>PORT
> +
> +=item B<-io vddk-snapshot=>SNAPSHOT-MOREF
> +
> +=item B<-io vddk-transports=>MODE:MODE:...
> +
> +=item B<-io vddk-vimapiver=>APIVER
> +
> +When using VDDK mode, these options are passed unmodified to the
> +L<nbdkit(1)> VDDK plugin. Please refer to L<nbdkit-vddk-plugin(1)>.
> +These are all optional.
> +
> =item B<-it> B<ssh>
>
> When using I<-i vmx>, this enables the ssh transport.
> @@ -406,7 +447,7 @@ See L</INPUT FROM VMWARE VMX> below.
>
> Use VMware VDDK as a transport to copy the input disks. See
> L</INPUT FROM VDDK> below. If you use this parameter then you may
> -need to use other I<--vddk*> options to specify how to connect through
> +need to use other I<-io vddk*> options to specify how to connect through
> VDDK.
>
> =item B<--keys-from-stdin>
> @@ -569,6 +610,95 @@ If not specified, then the input format is used.
> Rename the guest when converting it. If this option is not used then
> the output name is the same as the input name.
>
> +=item B<-oo> OPTION=VALUE
> +
> +Set output option(s) related to the current output mode.
> +To display short help on what options are available you can use:
> +
> + virt-v2v -o vdsm -oo "?"
> +
> +=item B<-oo vdsm-compat=0.10>
> +
> +=item B<-oo vdsm-compat=1.1>
> +
> +If I<-o vdsm> and the output format is qcow2, then we add the qcow2
> +I<compat=0.10> option to the output file for compatibility with RHEL 6
> +(see L<https://bugzilla.redhat.com/1145582>).
> +
> +If I<-oo vdsm-compat=1.1> is used then modern qcow2 (I<compat=1.1>)
> +files are generated instead.
> +
> +Currently I<-oo vdsm-compat=0.10> is the default, but this will change
> +to I<-oo vdsm-compat=1.1> in a future version of virt-v2v (when we can
> +assume that everyone is using a modern version of qemu).
> +
> +B<Note this option only affects I<-o vdsm> output>. All other output
> +modes (including I<-o rhv>) generate modern qcow2 I<compat=1.1>
> +files, always.
> +
> +If this option is available, then C<vdsm-compat-option> will appear in
> +the I<--machine-readable> output.
> +
> +=item B<-oo vdsm-image-uuid=>UUID
> +
> +=item B<-oo vdsm-vol-uuid=>UUID
> +
> +=item B<-oo vdsm-vm-uuid=>UUID
> +
> +=item B<-oo vdsm-ovf-output=>DIR
> +
> +Normally the RHV output mode chooses random UUIDs for the target
> +guest. However VDSM needs to control the UUIDs and passes these
> +parameters when virt-v2v runs under VDSM control. The parameters
> +control:
> +
> +=over 4
> +
> +=item *
> +
> +the image directory of each guest disk (I<-oo vdsm-image-uuid>) (this
> +option is passed once for each guest disk)
> +
> +=item *
> +
> +UUIDs for each guest disk (I<-oo vdsm-vol-uuid>) (this option
> +is passed once for each guest disk)
> +
> +=item *
> +
> +the OVF file name (I<-oo vdsm-vm-uuid>).
> +
> +=item *
> +
> +the OVF output directory (default current directory) (I<-oo vdsm-ovf-output>).
> +
> +=back
> +
> +The format of UUIDs is: C<12345678-1234-1234-1234-123456789abc> (each
> +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<-oo 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<-op> file
>
> Supply a file containing a password to be used when connecting to the
> @@ -675,122 +805,6 @@ boot an operating system from the first virtio disk. Specifically,
> F</boot> must be on the first virtio disk, and it cannot chainload an
> OS which is not in the first virtio disk.
>
> -=item B<--vddk-libdir> LIBDIR
> -
> -Set the VDDK library directory. This directory should I<contain>
> -subdirectories called F<include>, F<lib64> etc., but do not include
> -F<lib64> actually in the parameter.
> -
> -In most cases this parameter is required when using the I<-it vddk>
> -(VDDK) transport. See L</INPUT FROM VDDK> below for details.
> -
> -=item B<--vddk-thumbprint> xx:xx:xx:...
> -
> -Set the thumbprint of the remote VMware server.
> -
> -This parameter is required when using the I<-it vddk> (VDDK) transport.
> -See L</INPUT FROM VDDK> below for details.
> -
> -=item B<--vddk-config> FILENAME
> -
> -=item B<--vddk-cookie> COOKIE
> -
> -=item B<--vddk-nfchostport> PORT
> -
> -=item B<--vddk-port> PORT
> -
> -=item B<--vddk-snapshot> SNAPSHOT-MOREF
> -
> -=item B<--vddk-transports> MODE:MODE:...
> -
> -=item B<--vddk-vimapiver> APIVER
> -
> -When using VDDK mode, these options are passed unmodified to the
> -L<nbdkit(1)> VDDK plugin. Please refer to L<nbdkit-vddk-plugin(1)>.
> -These are all optional.
> -
> -=item B<--vdsm-compat=0.10>
> -
> -=item B<--vdsm-compat=1.1>
> -
> -If I<-o vdsm> and the output format is qcow2, then we add the qcow2
> -I<compat=0.10> option to the output file for compatibility with RHEL 6
> -(see L<https://bugzilla.redhat.com/1145582>).
> -
> -If I<--vdsm-compat=1.1> is used then modern qcow2 (I<compat=1.1>)
> -files are generated instead.
> -
> -Currently I<--vdsm-compat=0.10> is the default, but this will change
> -to I<--vdsm-compat=1.1> in a future version of virt-v2v (when we can
> -assume that everyone is using a modern version of qemu).
> -
> -B<Note this option only affects I<-o vdsm> output>. All other output
> -modes (including I<-o rhv>) generate modern qcow2 I<compat=1.1>
> -files, always.
> -
> -If this option is available, then C<vdsm-compat-option> will appear in
> -the I<--machine-readable> output.
> -
> -=item B<--vdsm-image-uuid> UUID
> -
> -=item B<--vdsm-vol-uuid> UUID
> -
> -=item B<--vdsm-vm-uuid> UUID
> -
> -=item B<--vdsm-ovf-output>
> -
> -Normally the RHV output mode chooses random UUIDs for the target
> -guest. However VDSM needs to control the UUIDs and passes these
> -parameters when virt-v2v runs under VDSM control. The parameters
> -control:
> -
> -=over 4
> -
> -=item *
> -
> -the image directory of each guest disk (I<--vdsm-image-uuid>) (this
> -option is passed once for each guest disk)
> -
> -=item *
> -
> -UUIDs for each guest disk (I<--vdsm-vol-uuid>) (this option
> -is passed once for each guest disk)
> -
> -=item *
> -
> -the OVF file name (I<--vdsm-vm-uuid>).
> -
> -=item *
> -
> -the OVF output directory (default current directory) (I<--vdsm-ovf-output>).
> -
> -=back
> -
> -The format of UUIDs is: C<12345678-1234-1234-1234-123456789abc> (each
> -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>
> @@ -1667,15 +1681,15 @@ SSL thumbprint:
> $ virt-v2v \
> -ic 'vpx://root@vcenter.example.com/Datacenter/esxi?no_verify=1' \
> -it vddk \
> - --vddk-libdir /path/to/vmware-vix-disklib-distrib \
> - --vddk-thumbprint xx:xx:xx:... \
> + -io vddk-libdir=/path/to/vmware-vix-disklib-distrib \
> + -io vddk-thumbprint=xx:xx:xx:... \
> "Windows 2003" \
> -o local -os /var/tmp
>
> Other options that you might need to add in rare circumstances include
> -I<--vddk-config>, I<--vddk-cookie>, I<--vddk-nfchostport>,
> -I<--vddk-port>, I<--vddk-snapshot>, I<--vddk-transports> and
> -I<--vddk-vimapiver>, which are all explained in the
> +I<-io vddk-config>, I<-io vddk-cookie>, I<-io vddk-nfchostport>,
> +I<-io vddk-port>, I<-io vddk-snapshot>, I<-io vddk-transports> and
> +I<-io vddk-vimapiver>, which are all explained in the
> L<nbdkit-vddk-plugin(1)> documentation.
>
> =head2 VDDK: DEBUGGING VDDK FAILURES
> --
> 2.13.2
>
--
Tomáš Golembiovský <tgolembi at redhat.com>
More information about the Libguestfs
mailing list