Skip to content

Schema degli eventi di Launchpad

launchpad up --headless e launchpad down --headless inviano un evento JSON per riga su stdout. Questa è la superficie di automazione: verifica questi eventi da CI, script o da una TUI di controllo.

Tutti gli eventi condividono la stessa struttura di primo livello. Vengono popolati solo i campi rilevanti per il tipo di evento.

json
{
  "ev":       "<kind>",        // discriminante; vedi sotto
  "time":     "2026-07-02T16:05:14.089Z",
  "phase":    "<phase>",       // solo su ev=phase
  "vm_key":   "mssp",          // delimita gli eventi a livello di VM
  "step":     "install",       // sotto-fase all'interno di una VM
  "percent":  60,              // 0-100
  "message":  "...",           // leggibile dall'operatore
  "level":    "info",          // per vm_log
  "gate_id":  "...",           // per gate_open / gate_resolved
  "instructions": "...",       // per gate_open
  "copy_text":    "...",       // per gate_open
  "ipv4":     "100.x.x.x",     // per vm_ready
  "ipv6":     "...",
  "ssh_user": "ops",
  "ssh_port": 22,
  "fields":   { "capabilities": ["vm.plan"] },  // formato libero; usato da plugin_ready
  "error":    { "category":"...", "code":"...", "message":"...", "hint":"..." }
}

Tipi di evento

evEmesso quandoTerminale?
phaseL'orchestratore cambia fase.no
plugin_readyIl plugin di provisioning è stato avviato e ha restituito il proprio handshake hello.no
vm_planDescrizione in dry-run di ciò che il plugin creerebbe, per ogni VM.no
vm_progressAvanzamento dei sotto-step per VM (contiene step + percent).no
vm_readyIl plugin ha creato e verificato la VM.no
vm_logRiga di log dal plugin (relay di avanzamento) o da una shell di installazione pilotata da launchpad.no
gate_openRaggiunto un gate manuale; richiede la conferma dell'operatore.no
gate_resolvedL'operatore (o --auto-resolve-gates) ha chiuso il gate.no
errorErrore fatale. error.category + error.code sono identificatori stabili.
completeL'intero flusso è stato eseguito senza errori.

error e complete sono i due eventi terminali. Ogni esecuzione di launchpad ne emette esattamente uno.

Ordine delle fasi (up)

initializing → planning → provisioning → installing → complete

All'interno di provisioning, per ciascuna VM gli step lookup → prepare → image_cache|image_download → tailscale → cloud_init → disk → boot → wait_ready vengono emessi come vm_progress. Lo step install durante installing trasmette in streaming lo stdout dell'installer sottostante come vm_log.

Ordine delle fasi (down)

tearing_down → torn_down → complete

vm.destroy viene invocato per ciascuna VM nell'ordine inverso al provisioning (prima i tenant, per ultimo l'MSSP). Ogni emissione per VM è un vm_progress con step=destroy.

Tassonomia degli errori

error.category è uno dei dieci identificatori stabili a cui launchpad e tutti i plugin first-party si attengono:

CategoriaSignificatoRitentabile
authCredenziale mancante, non valida o priva di scope.no
validationConfigurazione o input malformati.no
not_foundL'entità referenziata non esiste.no
already_existsCreazione idempotente fallita perché l'entità è già presente.no
provider_unavailableIl provider upstream (Tailscale, Hetzner, ...) è irraggiungibile.
quotaQuota lato provider esaurita.no
timeoutL'attesa ha superato una scadenza di policy.
internalBug del plugin/orchestratore — percorso di errore inatteso.no
networkRete locale / TLS / DNS.
cancelledCtrl-C o SIGTERM.no

error.code è un identificatore con namespace di plugin all'interno della categoria (ad es. qemu.image.sha256_mismatch). Le categorie sono stabili; i codici possono essere aggiunti.

Consumo da bash

bash
launchpad up --config pilot.yaml --headless --auto-resolve-gates | \
  jq -c 'select(.ev == "phase" or .ev == "error" or .ev == "complete")'

Per subordinare un job CI al completamento:

bash
launchpad up --config pilot.yaml --headless --auto-resolve-gates > run.log
grep -q '"ev":"complete"' run.log || {
  jq -r 'select(.ev == "error") | "\(.error.category)/\(.error.code): \(.error.message)"' < run.log
  exit 1
}

Compatibilità tra versioni

  • Le aggiunte di campi non introducono modifiche incompatibili.
  • La rimozione di campi incrementa la major version di launchpad.
  • I valori di error.category sono permanenti. I valori di ev sono permanenti.
  • I valori di error.code possono essere rinominati all'interno della stessa categoria (hanno scope di plugin).

Rilasciato sotto la Licenza Apache 2.0.