Skip to content

VMware import (importVm) fails when datacenter/cluster/host name contains a space #13920

Description

@sudo87

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

  1. Rename a vCenter Datacenter to include a space, e.g. "QA Lab".
  2. Import a VM from it via the CloudStack UI (Import Instance) or the importVm API.
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions