[Libguestfs] [PATCH v7 6/6] v2v: Add -o rhv-upload output mode (RHBZ#1557273).
Pino Toscano
ptoscano at redhat.com
Fri Mar 23 16:19:54 UTC 2018
On Thursday, 22 March 2018 16:24:25 CET Richard W.M. Jones wrote:
> PROBLEMS:
> - -of qcow2 does not work, with multiple problems
> * needs to set NBD size to something larger than virtual size
> - Cannot choose the datacenter.
> - Not tested against imageio which supports zero/trim/flush.
>
> This adds a new output mode to virt-v2v. virt-v2v -o rhv-upload
> streams images directly to an oVirt or RHV >= 4 Data Domain using the
> oVirt SDK v4. It is more efficient than -o rhv because it does not
> need to go via the Export Storage Domain, and is possible for humans
> to use unlike -o vdsm.
>
> The implementation uses the Python SDK (‘ovirtsdk4’ module). An
> nbdkit Python 3 plugin translates NBD calls from qemu into HTTPS
> requests to oVirt via the SDK.
> ---
Regarding the Python scripts: wouldn't it be easier to install them
in $datadir, and run them from that location? This would avoid the
effort of embedding them at build time, and save them in a temporary
location at runtime. IIRC we do something similar already for p2v,
see VIRT_P2V_DATA_DIR.
Also, I'd run pep8 on them (python2-pep8 / python3-pep8 in Fedora),
to make sure their coding style follows PEP8.
> diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
> index dc675fb42..bdd3127f8 100644
> --- a/v2v/cmdline.ml
> +++ b/v2v/cmdline.ml
> @@ -137,6 +137,8 @@ let parse_cmdline () =
> | "disk" | "local" -> output_mode := `Local
> | "null" -> output_mode := `Null
> | "ovirt" | "rhv" | "rhev" -> output_mode := `RHV
> + | "ovirt-upload" | "ovirt_upload" | "rhv-upload" | "rhv_upload" ->
> + output_mode := `RHV_Upload
I'd not use the variants with underscores, simply to not have too many
options possible.
> diff --git a/v2v/embed.sh b/v2v/embed.sh
> new file mode 100755
> index 000000000..0a65cd428
> --- /dev/null
> +++ b/v2v/embed.sh
> @@ -0,0 +1,45 @@
> +#!/bin/bash -
> +# Embed code or other content into an OCaml file.
> +# 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.
> +
> +# Embed code or other content into an OCaml file.
> +#
> +# It is embedded into a string. As OCaml string literals have virtually
> +# no restrictions on length or content we only have to escape double
> +# quotes for backslash characters.
This scripts needs set -eu, so it fails in case of any failure of its
commands.
> + (* JSON parameters which are invariant between disks. *)
> + let json_params = [
> + "output_conn", JSON.String output_conn;
> + "output_password", JSON.String output_password;
> + "output_storage", JSON.String output_storage;
> + "output_sparse", JSON.Bool (match output_alloc with
> + | Sparse -> true
> + | Preallocated -> false);
> + "rhv_cafile", JSON.String rhv_options.rhv_cafile;
> + "rhv_cluster",
> + JSON.String (Option.default "Default" rhv_options.rhv_cluster);
> + "rhv_direct", JSON.Bool rhv_options.rhv_direct;
> +
> + (* The 'Insecure' flag seems to be a number with various possible
> + * meanings, however we just set it to True/False.
> + *
> + * https://github.com/oVirt/ovirt-engine-sdk/blob/19aa7070b80e60a4cfd910448287aecf9083acbe/sdk/lib/ovirtsdk4/__init__.py#L395
> + *)
> + "insecure", JSON.Bool (not rhv_options.rhv_verifypeer);
I'd make the comment match the name of the key, so it is easier to find
if needed.
> +object
> + inherit output
> +
> + method precheck () =
Considering python3 is directly run by this output mode, it'd be fair
to check for an installed python3 here, using Std_utils.which.
> + (* Create an nbdkit instance for each disk and set the
> + * target URI to point to the NBD socket.
> + *)
> + List.map (
> + fun t ->
> + let id = t.target_overlay.ov_source.s_disk_id in
> + let disk_name = sprintf "%s-%03d" output_name id in
> + let json_params =
> + ("disk_name", JSON.String disk_name) :: json_params in
> +
> + let disk_format =
> + match t.target_format with
> + | ("raw" | "qcow2") as fmt -> fmt
> + | _ ->
> + error (f_"rhv-upload: -of %s: Only output format ‘raw’ or ‘qcow2’ is supported. If the input is in a different format then force one of these output formats by adding either ‘-of raw’ or ‘-of qcow2’ on the command line.")
> + t.target_format in
> + let json_params =
> + ("disk_format", JSON.String disk_format) :: json_params in
> +
> + let disk_size = t.target_overlay.ov_virtual_size in
> + let json_params =
> + ("disk_size", JSON.Int64 disk_size) :: json_params in
> +
> + (* Ask the plugin to write the disk ID to a special file. *)
> + let diskid_file = diskid_file_of_id id in
> + let json_params =
> + ("diskid_file", JSON.String diskid_file) :: json_params in
Maybe grouping these parameters in an array, e.g.:
let json_params = [
"disk_name", JSON.String disk_name;
"disk_format", JSON.String disk_format;
"disk_size", JSON.Int64 t.target_overlay.ov_virtual_size;
"diskid_file", JSON.String (diskid_file_of_id id);
] @ json_params in
> diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod
> index 4e3daedf0..caf9c983e 100644
> --- a/v2v/virt-v2v.pod
> +++ b/v2v/virt-v2v.pod
> - virt-v2v -o vdsm -oo "?"
> + virt-v2v -o rhv-upload -oo "?"
> +
> +=item B<-oo rhv-cafile=>F<ca.pem>
> +
> +For I<-o rhv-upload> (L<OUTPUT TO RHV>) only, the F<ca.pem> file
It must be L</OUTPUT TO RHV>, otherwise it is considered as man page.
(There are various occurrences of this in this patch.)
--
Pino Toscano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20180323/95ee06ad/attachment.sig>
More information about the Libguestfs
mailing list