• v12.72 20cd317c87

    platform/cmd/webui: add a scriptable test-scenario engine, load scenarios from blackbox USB, GPU status detail inventory fallback

    mchus released this 2026-07-28 17:51:45 +03:00

    Investigating the CG480-S6053 reboot needed a way to run an ad-hoc load
    (nvbandwidth across a specific GPU set) while sampling IPMI/nvidia-smi
    telemetry in the background — without hardcoding a one-off test into the
    SAT pack code for a single investigation.

    • audit/internal/platform/scenario.go: ScenarioSpec/ScenarioJob (JSON,
      no new dependency) + System.RunScenario. "command" jobs run sequential
      or parallel (per-job "parallel" flag); "sampler" jobs run concurrently
      in the background on their own interval until every command job
      finishes or the scenario's timeout elapses. "{{gpus}}" in a command's
      cmd is substituted from that job's gpu_indices. Command jobs are wired
      through the same satJobBoundaryHook/satSyncBracketHook seams the SAT
      job runner uses, so a scenario run gets the same durability treatment
      (evidence that a risky command started/finished reaches blackbox before
      a possible crash, not just whatever streamed to the RAM-backed export
      dir).
    • export.go: ReadScenarioFromRemovableMedia mounts each removable target
      looking for scenarios/.json — an air-gapped engineer can author a
      scenario elsewhere, drop it under scenarios/ on the same USB stick
      already plugged in for blackbox, and run it with no network path onto
      the host.
    • cmd/bee: new bee run <file.json|name> (bare name = looked up on
      removable media); bee scenario run <arg> kept as a longer alias.
    • scenarios/nvbandwidth-all-gpu-power-watch.json: the scenario that
      reproduced the actual reboot (full nvbandwidth across all GPUs, which
      crashed, vs. clean per-socket passes), with IPMI sensor + GPU power/temp
      sampling for a power-delivery correlation check.

    Also: webui/page_topo.go — the /topo page's component-status-detail modal
    (GET /api/component-detail/{type}) showed "No status data recorded yet"
    for any component type ComponentStatusDB has no history for yet (e.g. GPU
    before a SAT run this boot), even though the topology card for the same
    component already showed "N OK" from the audit inventory snapshot.
    inventoryFallbackRecords now synthesizes records from that same inventory
    snapshot when StatusDB is empty, using the same device classifiers
    (isGPUDeviceClass etc.) and severity mapping (classifyTopoSeverity) the
    topology card itself uses, so the two views never disagree.

    Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

    Downloads