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/19aa7070b80e60a4cfd9104482...
+ *)
+ "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