Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

fix(api): GetSandboxesSandboxID omits VolumeMounts and sets empty string Alias for paused sandboxes

Abierto Apto para principiantes
#3,575 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Tranquilo
Stack tecnológico
go
Área
api

Línea de trabajo

Comienza en packages/api/internal/handlers/sandbox_get.go, especialmente en el mapeo de sandboxes pausados alrededor de las líneas 235-265, y compara su manejo de VolumeMounts y Alias con sandboxes_list.go. Añade la protección frente a un orchestrator nil y cubre el caso de un snapshot pausado en sandbox_get_test.go. Se considera terminado cuando las respuestas pausadas conservan los volume mounts, omiten un alias vacío y no provocan un panic con un orchestrator nil.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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:

  1. Missing VolumeMounts in Paused Sandbox Response:
    When a sandbox is paused, lastSnapshot.Snapshot.Config.VolumeMounts contains all persistent volume mount mappings. However, GetSandboxesSandboxID constructs api.SandboxDetail without populating the VolumeMounts field, resulting in "volume_mounts": null or omission in the JSON response. In contrast, the list endpoint GET /v2/sandboxes (packages/api/internal/handlers/sandboxes_list.go:L292) correctly maps VolumeMounts for paused sandboxes via convertFromDBMountsToAPIMounts.

  2. Malformed Alias Serialized as "" (Empty String) instead of null / Omission:
    When a paused sandbox has no aliases, pausedAlias := firstAlias(lastSnapshot.Aliases) returns "" (empty string). sandbox.Alias = &pausedAlias then assigns a non-nil pointer to "". When serialized to JSON, this emits "alias": "" instead of null or omitting the property, violating the OpenAPI schema contract for optional string fields.

  3. Potential Nil Pointer Panic on a.orchestrator:
    GetSandboxesSandboxID attempts to call a.orchestrator.GetSandbox without verifying a.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

  1. Create a sandbox with persistent volume mounts: POST /sandboxes with volume_mounts: [{"name": "my-vol", "path": "/mnt/data"}].
  2. Pause the sandbox: POST /sandboxes/{id}/pause.
  3. Query the paused sandbox: GET /sandboxes/{id}.
  4. Observed:
    • volume_mounts is null or missing from the JSON payload.
    • alias is "" (empty string) if no alias was assigned.
  5. Expected:
    • volume_mounts contains [{"name": "my-vol", "path": "/mnt/data"}].
    • alias is null or 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
Lenguaje dominante
Go
Estrellas
1.6k
Forks
438
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de e2b-dev/runtime

Todos los issues de e2b-dev/runtime

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.