Richard W.M. Jones
2015-Aug-28 11:23 UTC
[Libguestfs] [PATCH 0/2] v2v: vcenter: Calculate dcPath correctly (RHBZ#1256823).
Calculate dcPath correctly for vCenter conversions. Rich.
Richard W.M. Jones
2015-Aug-28 11:23 UTC
[Libguestfs] [PATCH 1/2] v2v: vcenter: Change function get_datacenter -> get_dcPath.
In vCenter, the datacenter is identified by a path, and the parameter used for this is called 'dcPath'. Rename the function to avoid any confusion about what we're getting here. This is just renaming function/variable names and has no other effect. --- v2v/input_libvirt_vcenter_https.ml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/v2v/input_libvirt_vcenter_https.ml b/v2v/input_libvirt_vcenter_https.ml index c6b9a1f..4e81216 100644 --- a/v2v/input_libvirt_vcenter_https.ml +++ b/v2v/input_libvirt_vcenter_https.ml @@ -170,14 +170,14 @@ and run_curl_get_lines curl_args Unix.unlink config_file; lines -(* Helper function to extract the datacenter from a URI. *) -let get_datacenter uri scheme +(* Helper function to extract the dcPath from a URI. *) +let get_dcPath uri scheme let default_dc = "ha-datacenter" in match scheme with | "vpx" -> (* Hopefully the first part of the path. *) (match uri.uri_path with | None -> - warning (f_"vcenter: URI (-ic parameter) contains no path, so we cannot determine the datacenter name"); + warning (f_"vcenter: URI (-ic parameter) contains no path, so we cannot determine the dcPath (datacenter name)"); default_dc | Some path -> let path @@ -217,8 +217,8 @@ let map_source_to_uri ?readahead password uri scheme server path let datastore = Str.matched_group 1 path and path = Str.matched_group 2 path in - (* Get the datacenter. *) - let datacenter = get_datacenter uri scheme in + (* Get the dcPath. *) + let dcPath = get_dcPath uri scheme in let port match uri.uri_port with @@ -230,7 +230,7 @@ let map_source_to_uri ?readahead password uri scheme server path sprintf "https://%s%s/folder/%s-flat.vmdk?dcPath=%s&dsName=%s" server port - (uri_quote path) (uri_quote datacenter) (uri_quote datastore) in + (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. -- 2.5.0
Richard W.M. Jones
2015-Aug-28 11:23 UTC
[Libguestfs] [PATCH 2/2] v2v: Calculate dcPath correctly (RHBZ#1256823).
Previously given a path such as: vpx://vcenter/Folder/Datacenter/esxi we calculated dcPath=Folder. However this is obviously wrong. We should chop the path at the final (esxi) element to give dcPath=Folder/Datacenter. --- v2v/input_libvirt_vcenter_https.ml | 18 ++++++++++++++---- v2v/virt-v2v.pod | 19 ++++++++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/v2v/input_libvirt_vcenter_https.ml b/v2v/input_libvirt_vcenter_https.ml index 4e81216..e44a289 100644 --- a/v2v/input_libvirt_vcenter_https.ml +++ b/v2v/input_libvirt_vcenter_https.ml @@ -174,19 +174,29 @@ and run_curl_get_lines curl_args let get_dcPath uri scheme let default_dc = "ha-datacenter" in match scheme with - | "vpx" -> (* Hopefully the first part of the path. *) + | "vpx" -> (match uri.uri_path with | None -> warning (f_"vcenter: URI (-ic parameter) contains no path, so we cannot determine the dcPath (datacenter name)"); default_dc | Some path -> - let path + (* vCenter: URIs are *usually* '/Folder/Datacenter/esxi' so we can + * just chop off the first '/' and final '/esxi' to get the dcPath. + * + * However if there is a cluster involved then the URI may be + * /Folder/Datacenter/Cluster/esxi but dcPath=Folder/Datacenter/Cluster + * won't work. In this case the user has to adjust the path to + * remove the Cluster name (which still works in libvirt). There + * should be a way to ask the libvirt vpx driver for the correct + * path, but there isn't. XXX See also RHBZ#1256823. + *) + let path = (* chop off the first '/' *) let len = String.length path in if len > 0 && path.[0] = '/' then String.sub path 1 (len-1) else path in - let len - try String.index path '/' with Not_found -> String.length path in + let len = (* chop off the final element (ESXi hostname) *) + try String.rindex path '/' with Not_found -> String.length path in String.sub path 0 len ); | "esx" -> (* Connecting to an ESXi hypervisor directly, so it's fixed. *) diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod index fa84b3b..b27f45a 100644 --- a/v2v/virt-v2v.pod +++ b/v2v/virt-v2v.pod @@ -966,10 +966,23 @@ is the name of the ESXi hypervisor running the guest. =back -If the VMware deployment is using clusters and/or folders, then these -may need to be added to the URI, eg: +If the VMware deployment is using folders, then these may need to be +added to the URI, eg: - vpx://user@server/Datacenter/cluster1/esxi + vpx://user@server/Folder/Datacenter/esxi + +If the deployment uses a cluster before the hostname, then you +may need to remove it, ie. change this: + + vpx://user@server/Folder/Datacenter/Cluster/esxi + +to this: + + vpx://user@server/Folder/Datacenter/esxi + +Virt-v2v needs to calculate the C<dcPath> parameter from the URI, and +it does this by removing the final C</esxi> element, so in the above +example C<dcPath=Folder/Datacenter>. For full details of libvirt URIs, see: L<http://libvirt.org/drvesx.html> -- 2.5.0
Apparently Analagous Threads
- [PATCH 0/4] v2v: Use libvirt-supplied <vmware:datacenterpath> if available.
- [PATCH 0/5] v2v: Handle disks with snapshots (RHBZ#1172425).
- [PATCH v2v 0/4] v2v: vcenter: Implement cookie scripts.
- [PATCH 0/2] v2v: Add --password-file parameter (RHBZ#1158526).
- [PATCH 0/3] v2v: Various refactorings.