VMware import (importVm) fails when datacenter/cluster/host name contains a space
- Langage dominant
- Java
- Étoiles
- 3.1k
- Forks
- 1.4k
- Merge moyen
- 6 j 19 h
- PR mergées (30 j)
- 32
Description
## 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
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Commencez dans plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java en lisant buildVpxUrl, getExportOVAUrlFromRemoteInstance et encodeUsername. Reproduisez l’importation avec un espace dans le nom d’un datacenter, d’un cluster, d’un hôte, d’un chemin ou d’une VM, puis examinez les chemins OVA et VDDK. C’est terminé lorsque les URI vpx:// et vi:// générées sont analysées avec succès et que les séparateurs de dossiers restent intacts.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- java
- Domaine
- backend, infrastructure
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- Active
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 75/100