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" <[email protected]> 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://[email protected]/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ý <[email protected]> _______________________________________________ Libguestfs mailing list [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
