Summary
LibvirtConvertInstanceCommandWrapper builds the vpx:///vi:// connection URIs for virt-v2v by concatenating the vCenter datacenter/cluster/host names without percent-encoding them. A datacenter (or cluster/host) name containing a space — valid in vSphere — produces an invalid URI, and VM import from VMware fails.
Environment
- CloudStack main (
659f675b059c1e5008deb3bb28793eadf377d687)
- KVM host,
virt-v2v 2.7.1, libvirt 9.0.0
- Import VM from VMware (UI: Import Instance, or the
importVm API with importsource=vmware), reproduced on both the OVA-conversion path and the VDDK path (-it vddk)
Steps to Reproduce
- Rename a vCenter Datacenter to include a space, e.g.
"QA Lab".
- Import a VM from it via the CloudStack UI (Import Instance) or the
importVm API.
- Conversion fails.
Actual Behavior
Using VPX URL: vpx://Administrator%40vsphere.local@203.0.113.10/QA Lab/cluster-a/203.0.113.20?no_verify=1
virt-v2v: error: could not parse '-ic vpx://...QA Lab/cluster-a/203.0.113.20?no_verify=1'. Original error message was: parse_uri: unable to parse URI
Also seen on the VDDK import path (-it vddk), same unencoded QA Lab segment, surfacing as java.io.IOException: Stream closed instead — a downstream symptom of virt-v2v exiting immediately on the same bad URI, not a separate defect.
The username is correctly percent-encoded (Administrator%40vsphere.local); datacenter/cluster/host are not.
Root Cause
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java
buildVpxUrl (~L463): appends datacenter, cluster, host raw after url.append("/").
getExportOVAUrlFromRemoteInstance (~L203): same pattern for datacenter/path/vm in the vi:// URL.
encodeUsername (~L298) uses URLEncoder.encode, which encodes space as + — wrong for a URI path/authority (libvirt only decodes %20). Not yet visible as a bug since vCenter usernames rarely have spaces, but worth fixing alongside the above with the same helper.
Suggested Fix
Percent-encode datacenter/cluster/host/path/vm per /-delimited sub-segment (not as one string) — datacenter/cluster names can be folder-nested (e.g. MyFolder/MyDC), and that / must stay literal.
versions
ACS 4.22.1
Summary
LibvirtConvertInstanceCommandWrapperbuilds thevpx:///vi://connection URIs for virt-v2v by concatenating the vCenter datacenter/cluster/host names without percent-encoding them. A datacenter (or cluster/host) name containing a space — valid in vSphere — produces an invalid URI, and VM import from VMware fails.Environment
659f675b059c1e5008deb3bb28793eadf377d687)virt-v2v 2.7.1,libvirt 9.0.0importVmAPI withimportsource=vmware), reproduced on both the OVA-conversion path and the VDDK path (-it vddk)Steps to Reproduce
"QA Lab".importVmAPI.Actual Behavior
Also seen on the VDDK import path (
-it vddk), same unencodedQA Labsegment, surfacing asjava.io.IOException: Stream closedinstead — a downstream symptom of virt-v2v exiting immediately on the same bad URI, not a separate defect.The username is correctly percent-encoded (
Administrator%40vsphere.local);datacenter/cluster/hostare not.Root Cause
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.javabuildVpxUrl(~L463): appendsdatacenter,cluster,hostraw afterurl.append("/").getExportOVAUrlFromRemoteInstance(~L203): same pattern fordatacenter/path/vmin thevi://URL.encodeUsername(~L298) usesURLEncoder.encode, which encodes space as+— wrong for a URI path/authority (libvirt only decodes%20). Not yet visible as a bug since vCenter usernames rarely have spaces, but worth fixing alongside the above with the same helper.Suggested Fix
Percent-encode
datacenter/cluster/host/path/vmper/-delimited sub-segment (not as one string) — datacenter/cluster names can be folder-nested (e.g.MyFolder/MyDC), and that/must stay literal.versions
ACS 4.22.1