Move this function to the VCenter module. This is easier since it
doesn't have to do dcPath calculation (see previous commit).
The readhead parameter is no longer labelled.
---
v2v/input_libvirt_vcenter_https.ml | 94 ++------------------------------------
v2v/vCenter.ml | 74 ++++++++++++++++++++++++++++++
v2v/vCenter.mli | 10 ++++
3 files changed, 89 insertions(+), 89 deletions(-)
diff --git a/v2v/input_libvirt_vcenter_https.ml b/v2v/input_libvirt_vcenter_https.ml
index a5b3c8b..8310dd5 100644
--- a/v2v/input_libvirt_vcenter_https.ml
+++ b/v2v/input_libvirt_vcenter_https.ml
@@ -33,89 +33,6 @@ open Printf
let readahead_for_conversion = None
let readahead_for_copying = Some (64 * 1024 * 1024)
-(* Map the <source/> string to a qemu URI using the cURL driver
- * in qemu. The 'path' will be something like
- *
- * "[datastore1] Fedora 20/Fedora 20.vmdk"
- *
- * including those literal spaces in the string.
- *
- * XXX Old virt-v2v could also handle snapshots, ie:
- *
- * "[datastore1] Fedora 20/Fedora 20-NNNNNN.vmdk"
- *
- * XXX Need to handle templates. The file is called "-delta.vmdk" in
- * place of "-flat.vmdk".
- *)
-let source_re = Str.regexp "^\\[\\(.*\\)\\] \\(.*\\)\\.vmdk$"
-
-let map_source_to_uri ?readahead dcPath password uri scheme server path =
- if not (Str.string_match source_re path 0) then
- path
- else (
- let datastore = Str.matched_group 1 path
- and path = Str.matched_group 2 path in
-
- let port =
- match uri.uri_port with
- | 443 -> ""
- | n when n >= 1 -> ":" ^ string_of_int n
- | _ -> "" in
-
- let url =
- sprintf
- "https://%s%s/folder/%s-flat.vmdk?dcPath=%s&dsName=%s"
- server port
- (uri_quote path) (uri_quote dcPath) (uri_quote datastore) in
-
- (* If no_verify=1 was passed in the libvirt URI, then we have to
- * turn off certificate verification here too.
- *)
- let sslverify =
- match uri.uri_query_raw with
- | None -> true
- | Some query ->
- (* XXX only works if the query string is not URI-quoted *)
- String.find query "no_verify=1" = -1 in
-
- (* Now we have to query the server to get the session cookie. *)
- let session_cookie =
- VCenter.get_session_cookie password scheme uri sslverify url in
-
- (* Construct the JSON parameters. *)
- let json_params = [
- "file.driver", JSON.String "https";
- "file.url", JSON.String url;
- (*
https://bugzilla.redhat.com/show_bug.cgi?id=1146007#c10 *)
- "file.timeout",
JSON.Int 2000;
- ] in
-
- let json_params =
- match readahead with
- | None -> json_params
- | Some readahead ->
- ("file.readahead",
JSON.Int readahead) :: json_params in
-
- let json_params =
- if sslverify then json_params
- else ("file.sslverify", JSON.String "off") :: json_params in
-
- let json_params =
- match session_cookie with
- | None -> json_params
- | Some cookie -> ("file.cookie", JSON.String cookie) :: json_params
in
-
- if verbose () then
- printf "vcenter: json parameters: %s\n" (JSON.string_of_doc
json_params);
-
- (* Turn the JSON parameters into a 'json:' protocol string.
- * Note this requires qemu-img >= 2.1.0.
- *)
- let qemu_uri = "json: " ^ JSON.string_of_doc json_params in
-
- qemu_uri
- )
-
(* Subclass specialized for handling VMware vCenter over https. *)
class input_libvirt_vcenter_https
cmdline_dcPath password libvirt_uri parsed_uri scheme server guest =
@@ -190,9 +107,9 @@ object
| { p_source = P_source_dev _ } -> assert false
| { p_source_disk = disk; p_source = P_dont_rewrite } -> disk
| { p_source_disk = disk; p_source = P_source_file path } ->
- let qemu_uri = map_source_to_uri ?readahead
- dcPath password
- parsed_uri scheme server path in
+ let qemu_uri =
+ VCenter.map_source_to_uri readahead dcPath password
+ parsed_uri scheme server path in
(* The libvirt ESX driver doesn't normally specify a format, but
* the format of the -flat file is *always* raw, so force it here.
@@ -212,9 +129,8 @@ object
| Some orig_path ->
let readahead = readahead_for_copying in
let backing_qemu_uri =
- map_source_to_uri ?readahead
- dcPath password
- parsed_uri scheme server orig_path in
+ VCenter.map_source_to_uri readahead dcPath password
+ parsed_uri scheme server orig_path in
(* Rebase the qcow2 overlay to adjust the readahead parameter. *)
let cmd =
diff --git a/v2v/vCenter.ml b/v2v/vCenter.ml
index 9ff9415..49b3f32 100644
--- a/v2v/vCenter.ml
+++ b/v2v/vCenter.ml
@@ -21,6 +21,7 @@ open Printf
open Common_utils
open Common_gettext.Gettext
+open Utils
open Xml
(* Memoized session cookie. *)
@@ -156,3 +157,76 @@ let guess_dcPath uri = function
default_dc
| _ -> (* Don't know, so guess. *)
default_dc
+
+let source_re = Str.regexp "^\\[\\(.*\\)\\] \\(.*\\)\\.vmdk$"
+
+let map_source_to_uri readahead dcPath password uri scheme server path =
+ if not (Str.string_match source_re path 0) then
+ path
+ else (
+ let datastore = Str.matched_group 1 path
+ and path = Str.matched_group 2 path in
+
+ let port =
+ match uri.uri_port with
+ | 443 -> ""
+ | n when n >= 1 -> ":" ^ string_of_int n
+ | _ -> "" in
+
+ (* XXX Old virt-v2v could also handle snapshots, ie:
+ * "[datastore1] Fedora 20/Fedora 20-NNNNNN.vmdk"
+ * XXX Need to handle templates. The file is called "-delta.vmdk" in
+ * place of "-flat.vmdk".
+ *)
+ let url =
+ sprintf
+ "https://%s%s/folder/%s-flat.vmdk?dcPath=%s&dsName=%s"
+ server port
+ (uri_quote path) (uri_quote dcPath) (uri_quote datastore) in
+
+ (* If no_verify=1 was passed in the libvirt URI, then we have to
+ * turn off certificate verification here too.
+ *)
+ let sslverify =
+ match uri.uri_query_raw with
+ | None -> true
+ | Some query ->
+ (* XXX only works if the query string is not URI-quoted *)
+ String.find query "no_verify=1" = -1 in
+
+ (* Now we have to query the server to get the session cookie. *)
+ let session_cookie = get_session_cookie password scheme uri sslverify url in
+
+ (* Construct the JSON parameters. *)
+ let json_params = [
+ "file.driver", JSON.String "https";
+ "file.url", JSON.String url;
+ (*
https://bugzilla.redhat.com/show_bug.cgi?id=1146007#c10 *)
+ "file.timeout",
JSON.Int 2000;
+ ] in
+
+ let json_params =
+ match readahead with
+ | None -> json_params
+ | Some readahead ->
+ ("file.readahead",
JSON.Int readahead) :: json_params in
+
+ let json_params =
+ if sslverify then json_params
+ else ("file.sslverify", JSON.String "off") :: json_params in
+
+ let json_params =
+ match session_cookie with
+ | None -> json_params
+ | Some cookie -> ("file.cookie", JSON.String cookie) :: json_params
in
+
+ if verbose () then
+ printf "vcenter: json parameters: %s\n" (JSON.string_of_doc
json_params);
+
+ (* Turn the JSON parameters into a 'json:' protocol string.
+ * Note this requires qemu-img >= 2.1.0.
+ *)
+ let qemu_uri = "json: " ^ JSON.string_of_doc json_params in
+
+ qemu_uri
+ )
diff --git a/v2v/vCenter.mli b/v2v/vCenter.mli
index 87583c0..15b5143 100644
--- a/v2v/vCenter.mli
+++ b/v2v/vCenter.mli
@@ -42,3 +42,13 @@ val guess_dcPath : Xml.uri -> string -> string
This function is only used with [libvirt < 1.2.20] because later
versions of libvirt provide the dcPath (see
https://bugzilla.redhat.com/1263574). *)
+
+val map_source_to_uri : int option -> string -> string option -> Xml.uri ->
string -> string -> string -> string
+(** [map_source_to_uri readahead dcPath password uri scheme server path]
+ maps the [<source path=...>] string to a qemu URI.
+
+ The [path] will be something like:
+
+ ["[datastore1] Fedora 20/Fedora 20.vmdk"]
+
+ including those literal spaces in the string. *)
--
2.5.0