fix(api): GetSandboxesSandboxID omits VolumeMounts and sets empty string Alias for paused sandboxes
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
Direzione di ricerca
Inizia da packages/api/internal/handlers/sandbox_get.go, in particolare dal mapping dei sandbox in pausa intorno alle righe 235-265, e confronta la gestione di VolumeMounts e Alias con quella di sandboxes_list.go. Aggiungi la protezione per un orchestrator nil e copri il caso di uno snapshot in pausa in sandbox_get_test.go. Il lavoro è completo quando le risposte in pausa preservano i volume mounts, omettono un alias vuoto e non causano un panic con un orchestrator nil.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
When querying sandbox metadata via GET /sandboxes/{sandboxID} (packages/api/internal/handlers/sandbox_get.go), paused or stopped sandboxes loaded from lastSnapshot exhibit two payload inconsistencies with the OpenAPI specification and list endpoints:
-
Missing
VolumeMountsin Paused Sandbox Response:
When a sandbox is paused,lastSnapshot.Snapshot.Config.VolumeMountscontains all persistent volume mount mappings. However,GetSandboxesSandboxIDconstructsapi.SandboxDetailwithout populating theVolumeMountsfield, resulting in"volume_mounts": nullor omission in the JSON response. In contrast, the list endpointGET /v2/sandboxes(packages/api/internal/handlers/sandboxes_list.go:L292) correctly mapsVolumeMountsfor paused sandboxes viaconvertFromDBMountsToAPIMounts. -
Malformed
AliasSerialized as""(Empty String) instead ofnull/ Omission:
When a paused sandbox has no aliases,pausedAlias := firstAlias(lastSnapshot.Aliases)returns""(empty string).sandbox.Alias = &pausedAliasthen assigns a non-nil pointer to"". When serialized to JSON, this emits"alias": ""instead ofnullor omitting the property, violating the OpenAPI schema contract for optional string fields. -
Potential Nil Pointer Panic on
a.orchestrator:
GetSandboxesSandboxIDattempts to calla.orchestrator.GetSandboxwithout verifyinga.orchestrator != nil, causing panics in isolated unit tests and environments where the orchestrator client is nil.
Root Cause
In packages/api/internal/handlers/sandbox_get.go:L235-L265:
// Current implementation for paused sandboxes:
pausedAlias := firstAlias(lastSnapshot.Aliases)
sandbox = api.SandboxDetail{
// VolumeMounts is omitted completely
Alias: &pausedAlias, // Points to "" when len(Aliases) == 0
...
}
Comparison of metadata mapping across endpoints:
| Endpoint | Paused Sandbox VolumeMounts |
Empty Alias Representation |
|---|---|---|
GET /v2/sandboxes (sandboxes_list.go) |
Populated via convertFromDBMountsToAPIMounts |
nil (omitted) |
GET /sandboxes/{id} (Current) |
nil (omitted) |
&"" (serialized as "") |
GET /sandboxes/{id} (Expected) |
Populated from Config.VolumeMounts |
nil (omitted) |
Reproduction Steps
- Create a sandbox with persistent volume mounts:
POST /sandboxeswithvolume_mounts: [{"name": "my-vol", "path": "/mnt/data"}]. - Pause the sandbox:
POST /sandboxes/{id}/pause. - Query the paused sandbox:
GET /sandboxes/{id}. - Observed:
volume_mountsisnullor missing from the JSON payload.aliasis""(empty string) if no alias was assigned.
- Expected:
volume_mountscontains[{"name": "my-vol", "path": "/mnt/data"}].aliasisnullor omitted when no alias exists.
Technical Context
- File affected:
packages/api/internal/handlers/sandbox_get.go - Subsystem: Control Plane API / Sandboxes
- Impact: Medium (API Schema compliance, client SDK consistency, and paused sandbox metadata fidelity)
Proposed Changes
| # | Change | File(s) Affected | Complexity |
|---|---|---|---|
| 1 | Add nil check on a.orchestrator != nil before calling GetSandbox |
sandbox_get.go |
Trivial |
| 2 | Extract volumeMounts from lastSnapshot.Snapshot.Config.VolumeMounts and pass to api.SandboxDetail |
sandbox_get.go |
Low |
| 3 | Populate sandbox.Alias only when len(lastSnapshot.Aliases) > 0, leaving it nil otherwise |
sandbox_get.go |
Trivial |
| 4 | Add unit test asserting VolumeMounts and nil alias on paused snapshot |
sandbox_get_test.go |
Low |
- Lingua principale
- Go
- Stelle
- 1.6k
- Fork
- 438
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di e2b-dev/runtime
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
-
sandbox cache: StartRemoving state transition not broadcast, all allocations see stale Running state Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
Tutte le issue di e2b-dev/runtime
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
prometheus/procfs#872 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
bazel-contrib/rules_go#4726 · 1 commento ·
-
area/auto-scaling area/monitoring area/ops-productivity kind/enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100