apache / apache/cloudstack

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

Offen
#13,920 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
component:kvm component:vmware Severity:Minor type:bug
Vorherrschende Sprache
Java
Sterne
3.1k
Forks
1.4k
Ø Merge
6 T. 19 Std.
Gemergte PRs (30 T.)
32

Beschreibung

## 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

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne in plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java und lies buildVpxUrl, getExportOVAUrlFromRemoteInstance und encodeUsername. Reproduziere den Import mit einem Leerzeichen im Namen eines Datacenters, Clusters, Hosts, Pfads oder einer VM und untersuche sowohl die OVA- als auch die VDDK-Pfade. Erledigt ist dies, wenn die generierten vpx://- und vi://-URIs erfolgreich geparst werden und die Ordnertrenner intakt bleiben.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
backend, infrastructure
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Aktiv
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
75/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.