diff --git a/audit/internal/webui/api_sat_runall.go b/audit/internal/webui/api_sat_runall.go index 871e9e0..21ce3c9 100644 --- a/audit/internal/webui/api_sat_runall.go +++ b/audit/internal/webui/api_sat_runall.go @@ -103,18 +103,21 @@ func (h *handler) planSATRunAll(ctx context.Context, req satRunAllRequest) ([]sa satRunAllSpec{target: "storage", params: taskParams{StressMode: req.StressMode}}, ) - if h.opts.App.TPMPresent() { - specs = append(specs, satRunAllSpec{target: "tpm", params: taskParams{}}) - } else { - skip("TPM: no TPM device on this host; check skipped") + if !req.StressMode { + if h.opts.App.TPMPresent() { + specs = append(specs, satRunAllSpec{target: "tpm", params: taskParams{}}) + } else { + skip("TPM: no TPM device on this host; check skipped") + } } gp := h.opts.App.DetectGPUPresence() if gp.Nvidia || gp.NvidiaInitializing { - // nvidia-config only collects inventory and NVLink state; safe to run - // even while the compute stack is still coming up. - specs = append(specs, satRunAllSpec{target: "nvidia-config", params: taskParams{}}) + // nvidia-config is a read-only Check task, not a load test. + if !req.StressMode { + specs = append(specs, satRunAllSpec{target: "nvidia-config", params: taskParams{}}) + } health, gpus, ready := h.waitForNvidiaReady(ctx) switch { @@ -138,10 +141,12 @@ func (h *handler) planSATRunAll(ctx context.Context, req satRunAllRequest) ([]sa if !health.CUDAReady { notes = append(notes, "NVIDIA: CUDA runtime not confirmed ready; GPU tests queued anyway") } - gpuTargets := []string{"nvidia", "nvidia-interconnect", "nvidia-bandwidth"} + gpuTargets := []string{"nvidia", "nvidia-bandwidth"} if req.StressMode { // Stress tier adds the targeted dcgmi diag load tests. gpuTargets = append(gpuTargets, "nvidia-targeted-stress", "nvidia-targeted-power", "nvidia-pulse") + } else { + gpuTargets = append(gpuTargets, "nvidia-interconnect") } for _, target := range gpuTargets { specs = append(specs, satRunAllSpec{ @@ -152,7 +157,7 @@ func (h *handler) planSATRunAll(ctx context.Context, req satRunAllRequest) ([]sa } } - if gp.AMD { + if gp.AMD && !req.StressMode { for _, target := range req.AMDTargets { switch target { case "amd", "amd-mem", "amd-bandwidth": diff --git a/audit/internal/webui/api_sat_runall_test.go b/audit/internal/webui/api_sat_runall_test.go index 2fc0136..8fcdd2b 100644 --- a/audit/internal/webui/api_sat_runall_test.go +++ b/audit/internal/webui/api_sat_runall_test.go @@ -3,6 +3,7 @@ package webui import ( "context" "reflect" + "strings" "testing" "time" @@ -88,3 +89,21 @@ func TestPlanSATRunAllNoAcceleratorNoTPM(t *testing.T) { t.Fatalf("expected a note about TPM being skipped") } } + +func TestPlanSATRunAllLoadOmitsReadOnlyTPMCheck(t *testing.T) { + h := &handler{opts: HandlerOptions{App: app.New(&platform.System{})}} + specs, notes := h.planSATRunAll(context.Background(), satRunAllRequest{StressMode: true}) + + var targets []string + for _, s := range specs { + targets = append(targets, s.target) + } + if want := []string{"cpu", "memory", "storage"}; !reflect.DeepEqual(targets, want) { + t.Fatalf("targets=%v want %v", targets, want) + } + for _, note := range notes { + if strings.Contains(note, "TPM") { + t.Fatalf("load plan must not inspect or report TPM: notes=%v", notes) + } + } +} diff --git a/audit/internal/webui/page_validate.go b/audit/internal/webui/page_validate.go index 80afa65..dd7f5f3 100644 --- a/audit/internal/webui/page_validate.go +++ b/audit/internal/webui/page_validate.go @@ -149,12 +149,12 @@ func renderValidateMode(opts HandlerOptions, stressDefault bool) string { `lsblk; NVMe: nvme id-ctrl, nvme smart-log, nvme device-self-test -s 1; SATA/SAS: smartctl -H -A, smartctl -t short`, `~2 min per device (NVMe short self-test; SATA/SAS short self-test — duration device-dependent).`, )) + - renderSATCard("tpm", "TPM", "runSAT('tpm')", "", renderValidateCardBody( + renderCheckOnlySATCard(stressDefault, renderSATCard("tpm", "TPM", "runSAT('tpm')", "", renderValidateCardBody( inv.TPM, `Checks TPM 2.0 communication and reports its fixed properties, allocated PCR banks, current PCR values, and the result of self-tests already performed by the TPM. It does not start a new self-test or change TPM state.`, `tpm2_getcap properties-fixed, tpm2_getcap pcrs, tpm2_pcrread, tpm2_gettestresult`, `Seconds - read-only queries; no ownership, NV, PCR, or key changes.`, - )) + + ))) + `
@@ -183,12 +183,12 @@ func renderValidateMode(opts HandlerOptions, stressDefault bool) string { validateFmtDur(platform.SATEstimatedNvidiaGPUStressSec)), )) + stressOnlyCards + - renderSATCard("nvidia-interconnect", "NVIDIA Interconnect (NCCL)", "runNvidiaFabricValidate('nvidia-interconnect')", "", renderValidateCardBody( + renderCheckOnlySATCard(stressDefault, renderSATCard("nvidia-interconnect", "NVIDIA Interconnect (NCCL)", "runNvidiaFabricValidate('nvidia-interconnect')", "", renderValidateCardBody( inv.NVIDIA, `Verifies NVLink/NVSwitch fabric bandwidth using NCCL all_reduce_perf across all selected GPUs. Pass/fail based on achieved bandwidth vs. theoretical.`, `all_reduce_perf (NCCL tests)`, validateFmtDur(platform.SATEstimatedNvidiaInterconnectSec)+` (all GPUs simultaneously, requires ≥2).`, - )) + + ))) + renderSATCard("nvidia-bandwidth", "NVIDIA Bandwidth + PCIe Link", "runNvidiaFabricValidate('nvidia-bandwidth')", "", renderValidateCardBody( inv.NVIDIA, `Validates GPU memory copy and peer-to-peer bandwidth paths, then samples each GPU's negotiated PCIe speed and width immediately after real traffic. Idle or forced-retrain Gen1 readings do not fail the test.`, @@ -197,12 +197,12 @@ func renderValidateMode(opts HandlerOptions, stressDefault bool) string { )) + `
-` + renderSATCard("amd", "AMD GPU", "runAMDValidateSet()", "", renderValidateCardBody( +` + renderCheckOnlySATCard(stressDefault, renderSATCard("amd", "AMD GPU", "runAMDValidateSet()", "", renderValidateCardBody( inv.AMD, `Runs the selected AMD checks only. GPU Validate collects inventory; MEM Integrity uses the RVS MEM module; MEM Bandwidth uses rocm-bandwidth-test and the RVS BABEL module.`, `GPU Validate: rocm-smi, dmidecode; MEM Integrity: rvs mem; MEM Bandwidth: rocm-bandwidth-test, rvs babel`, `
`, - )) + + ))) + `