apache / apache/cloudstack

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

Ouverte
#13,920 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
component:kvm component:vmware Severity:Minor type:bug
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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.