From a2d7513153e0027c2f5160cbb26c7bb6bf3dd733 Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Thu, 18 Jun 2026 19:07:51 +0300 Subject: [PATCH] Restructure nav to Load/Burn/Benchmark; fix SAA acpidump dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nav steps 3-5: Load (validate), Burn (burn-in), Benchmark (speed+endurance merged) - /load now renders validate mode; /burn renders burn-in; /benchmark replaces /speed+/endurance - Legacy redirects updated: /validate→/load, /burn-in→/burn, /speed+/endurance→/benchmark - Add acpica_bin/acpidump from SAA 1.5.0 package; required by saa GetDmiInfo (ExitCode 8) - build.sh copies acpica_bin/acpidump to /usr/local/bin/acpica_bin/ alongside saa Co-Authored-By: Claude Sonnet 4.6 --- audit/internal/webui/layout.go | 4 +-- audit/internal/webui/page_benchmark.go | 19 +++---------- audit/internal/webui/page_burn.go | 7 +---- audit/internal/webui/page_validate.go | 30 +++++++++++++++++---- audit/internal/webui/pages.go | 36 ++++++++++++------------- audit/internal/webui/server.go | 10 +++---- audit/internal/webui/server_test.go | 10 +++---- iso/builder/build.sh | 10 +++++++ iso/vendor/acpica_bin/acpidump | Bin 0 -> 65213 bytes 9 files changed, 69 insertions(+), 57 deletions(-) create mode 100755 iso/vendor/acpica_bin/acpidump diff --git a/audit/internal/webui/layout.go b/audit/internal/webui/layout.go index 246ef12..f9c6d68 100644 --- a/audit/internal/webui/layout.go +++ b/audit/internal/webui/layout.go @@ -106,8 +106,8 @@ func layoutNav(active string, buildLabel string) string { {id: "audit", label: "1. Audit", href: "/audit"}, {id: "check", label: "2. Check", href: "/check"}, {id: "load", label: "3. Load", href: "/load"}, - {id: "speed", label: "4. Speed", href: "/speed"}, - {id: "endurance", label: "5. Endurance", href: "/endurance"}, + {id: "burn", label: "4. Burn", href: "/burn"}, + {id: "benchmark", label: "5. Benchmark", href: "/benchmark"}, {sep: true}, {id: "tasks", label: "Tasks", href: "/tasks"}, {id: "tools", label: "Tools", href: "/tools"}, diff --git a/audit/internal/webui/page_benchmark.go b/audit/internal/webui/page_benchmark.go index 0a7dc71..aac0457 100644 --- a/audit/internal/webui/page_benchmark.go +++ b/audit/internal/webui/page_benchmark.go @@ -612,19 +612,6 @@ func renderPowerBenchmarkResultsCard(exportDir string) string { return b.String() } -// renderSpeed renders the Speed page (step 4): performance benchmarks. -// Uses the same benchmark infrastructure; defaults to Standard profile (throughput/bandwidth). -// For long-duration stability/overnight runs, see Endurance (step 5). -func renderSpeed(opts HandlerOptions) string { - base := renderBenchmark(opts) - return `
Speed: Measures GPU compute throughput and memory bandwidth. For overnight stability testing, go to 5. Endurance.
` + base -} - -// renderEndurance renders the Endurance page (step 5): long-duration reliability tests. -// Focuses on Stability and Overnight profiles for multi-hour burn validation. -// For short load tests, see Load (step 3). For throughput measurement, see Speed (step 4). -func renderEndurance(opts HandlerOptions) string { - base := renderBenchmark(opts) - return `
Endurance: Long-duration reliability tests — Stability (several hours) and Overnight (8+ h) profiles. These profiles run hardware at sustained load; results show whether the server holds its performance envelope over time.
-
Use the Stability or Overnight profile in the setup card below. The Standard profile is available too but is better suited for the 4. Speed page.
` + base -} +// renderSpeed and renderEndurance are legacy wrappers; canonical page is 5. Benchmark at /benchmark. +func renderSpeed(opts HandlerOptions) string { return renderBenchmark(opts) } +func renderEndurance(opts HandlerOptions) string { return renderBenchmark(opts) } diff --git a/audit/internal/webui/page_burn.go b/audit/internal/webui/page_burn.go index f6de5cc..fac65d4 100644 --- a/audit/internal/webui/page_burn.go +++ b/audit/internal/webui/page_burn.go @@ -1,13 +1,8 @@ package webui -// renderLoad renders the Load page (step 3): sustained stress tests. -// For non-destructive status checks, see Check (step 2). -// For DCGM targeted diagnostics (targeted_stress, targeted_power, pulse), see Check → Validate mode. -func renderLoad() string { return renderBurn() } - func renderBurn() string { return `
⚠ Warning: Stress tests on this page run hardware at high load. Repeated or prolonged use may reduce hardware lifespan. Use only when necessary.
-
Scope: Load runs sustained GPU compute and CPU/memory stress recipes. DCGM diagnostics (targeted_stress, targeted_power, pulse_test) and NCCL/NVBandwidth are on the 2. Check page. For overnight endurance runs, see 5. Endurance.
+
Scope: Burn runs sustained GPU compute and CPU/memory stress recipes. DCGM targeted diagnostics (targeted_stress, targeted_power, pulse_test) and NCCL/NVBandwidth are on the 3. Load page. For performance benchmarks, see 5. Benchmark.

Tasks continue in the background — view progress in Tasks.

diff --git a/audit/internal/webui/page_validate.go b/audit/internal/webui/page_validate.go index 9c0e1db..a6919c7 100644 --- a/audit/internal/webui/page_validate.go +++ b/audit/internal/webui/page_validate.go @@ -68,6 +68,14 @@ func validateTotalStressSec(n int) int { } func renderValidate(opts HandlerOptions) string { + return renderValidateMode(opts, false) +} + +func renderValidateStress(opts HandlerOptions) string { + return renderValidateMode(opts, true) +} + +func renderValidateMode(opts HandlerOptions, stressDefault bool) string { inv := loadValidateInventory(opts) n := inv.NvidiaGPUCount validateTotalStr := validateFmtDur(validateTotalValidateSec(n)) @@ -76,7 +84,19 @@ func renderValidate(opts HandlerOptions) string { if n > 0 { gpuNote = fmt.Sprintf(" (%d GPU)", n) } - return `
Non-destructive: Validate tests collect diagnostics only. They do not write to disks, do not run sustained load, and do not increment hardware wear counters.
+ validateChecked, stressChecked := "checked", "" + if stressDefault { + validateChecked, stressChecked = "", "checked" + } + alert := `
Non-destructive: Validate tests collect diagnostics only. They do not write to disks, do not run sustained load, and do not increment hardware wear counters.
` + if stressDefault { + alert = `
⚠ Stress mode: Runs extended load tests — CPU stress-ng, memory passes, DCGM targeted diagnostics. Higher wear than Validate.
` + } + onloadJS := "" + if stressDefault { + onloadJS = `` + } + return alert + `

Tasks continue in the background — view progress in Tasks.

@@ -84,8 +104,8 @@ func renderValidate(opts HandlerOptions) string {
- - + +

Runs validate modules sequentially. Validate: ` + validateTotalStr + gpuNote + `; Stress: ` + stressTotalStr + gpuNote + `. Estimates are based on real log data and scale with GPU count.

@@ -95,7 +115,7 @@ func renderValidate(opts HandlerOptions) string {
-
+ ` + onloadJS
` + renderSATCard("cpu", "CPU", "runSAT('cpu')", "", renderValidateCardBody( @@ -667,7 +687,7 @@ func renderCheck(opts HandlerOptions) string { if n > 0 { gpuNote = fmt.Sprintf(" (%d GPU)", n) } - return `
Non-destructive: Check tests collect diagnostics only — no writes to disks, no sustained load, no hardware wear counters incremented. For stress testing, go to 3. Load.
+ return `
Non-destructive: Check tests collect diagnostics only — no writes to disks, no sustained load, no hardware wear counters incremented. For stress testing, go to 4. Burn.
diff --git a/audit/internal/webui/pages.go b/audit/internal/webui/pages.go index a3f2b80..4aa4b5b 100644 --- a/audit/internal/webui/pages.go +++ b/audit/internal/webui/pages.go @@ -33,15 +33,15 @@ func renderPage(page string, opts HandlerOptions) string { case "load": pageID = "load" title = "3. Load" - body = renderLoad() - case "speed": - pageID = "speed" - title = "4. Speed" - body = renderSpeed(opts) - case "endurance": - pageID = "endurance" - title = "5. Endurance" - body = renderEndurance(opts) + body = renderValidateStress(opts) + case "burn": + pageID = "burn" + title = "4. Burn" + body = renderBurn() + case "benchmark": + pageID = "benchmark" + title = "5. Benchmark" + body = renderBenchmark(opts) case "tools": pageID = "tools" title = "Tools" @@ -52,17 +52,17 @@ func renderPage(page string, opts HandlerOptions) string { body = renderSettings(opts) // Legacy routes (redirected at HTTP level in handlePage; these are fallbacks) case "validate", "tests": - pageID = "check" - title = "2. Check" - body = renderCheck(opts) - case "burn", "burn-in": pageID = "load" title = "3. Load" - body = renderLoad() - case "benchmark": - pageID = "speed" - title = "4. Speed" - body = renderSpeed(opts) + body = renderValidate(opts) + case "burn-in": + pageID = "burn" + title = "4. Burn" + body = renderBurn() + case "speed", "endurance": + pageID = "benchmark" + title = "5. Benchmark" + body = renderBenchmark(opts) case "tasks": pageID = "tasks" title = "Tasks" diff --git a/audit/internal/webui/server.go b/audit/internal/webui/server.go index 6b26d78..58c1666 100644 --- a/audit/internal/webui/server.go +++ b/audit/internal/webui/server.go @@ -1424,13 +1424,13 @@ func (h *handler) handlePage(w http.ResponseWriter, r *http.Request) { // Redirect legacy routes to new named pages switch page { case "validate", "tests": - http.Redirect(w, r, "/check", http.StatusMovedPermanently) - return - case "burn", "burn-in": http.Redirect(w, r, "/load", http.StatusMovedPermanently) return - case "benchmark": - http.Redirect(w, r, "/speed", http.StatusMovedPermanently) + case "burn-in": + http.Redirect(w, r, "/burn", http.StatusMovedPermanently) + return + case "speed", "endurance": + http.Redirect(w, r, "/benchmark", http.StatusMovedPermanently) return } body := renderPage(page, h.opts) diff --git a/audit/internal/webui/server_test.go b/audit/internal/webui/server_test.go index ab6f746..7f21502 100644 --- a/audit/internal/webui/server_test.go +++ b/audit/internal/webui/server_test.go @@ -717,13 +717,13 @@ func TestToolsPageRendersNvidiaSelfHealSection(t *testing.T) { func TestBenchmarkPageRendersGPUSelectionControls(t *testing.T) { handler := NewHandler(HandlerOptions{}) rec := httptest.NewRecorder() - handler.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/speed", nil)) + handler.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/benchmark", nil)) if rec.Code != http.StatusOK { t.Fatalf("status=%d", rec.Code) } body := rec.Body.String() for _, needle := range []string{ - `href="/speed"`, + `href="/benchmark"`, `id="benchmark-gpu-list"`, `/api/gpu/nvidia`, `/api/bee-bench/nvidia/perf/run`, @@ -779,7 +779,7 @@ func TestBenchmarkPageRendersSavedResultsTable(t *testing.T) { handler := NewHandler(HandlerOptions{ExportDir: exportDir}) rec := httptest.NewRecorder() - handler.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/speed", nil)) + handler.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/benchmark", nil)) if rec.Code != http.StatusOK { t.Fatalf("status=%d", rec.Code) } @@ -844,10 +844,10 @@ func TestCheckPageRendersNvidiaFabricCards(t *testing.T) { } } -func TestLoadPageRendersGoalBasedNVIDIACards(t *testing.T) { +func TestBurnPageRendersGoalBasedNVIDIACards(t *testing.T) { handler := NewHandler(HandlerOptions{}) rec := httptest.NewRecorder() - handler.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/load", nil)) + handler.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/burn", nil)) if rec.Code != http.StatusOK { t.Fatalf("status=%d", rec.Code) } diff --git a/iso/builder/build.sh b/iso/builder/build.sh index 21ef4b8..d4f4abe 100755 --- a/iso/builder/build.sh +++ b/iso/builder/build.sh @@ -1483,6 +1483,16 @@ for tool in storcli64 sas2ircu sas3ircu arcconf ssacli saa; do fi done +# saa requires acpica_bin/acpidump relative to its own location +if [ -f "${VENDOR_DIR}/acpica_bin/acpidump" ]; then + mkdir -p "${OVERLAY_STAGE_DIR}/usr/local/bin/acpica_bin" + cp "${VENDOR_DIR}/acpica_bin/acpidump" "${OVERLAY_STAGE_DIR}/usr/local/bin/acpica_bin/acpidump" + chmod +x "${OVERLAY_STAGE_DIR}/usr/local/bin/acpica_bin/acpidump" || true + echo "vendor tool: acpica_bin/acpidump (included)" +else + echo "vendor tool: acpica_bin/acpidump (not found, skipped)" +fi + # --- NVIDIA kernel modules and userspace libs --- if [ "$BEE_GPU_VENDOR" = "nvidia" ]; then run_step "build NVIDIA ${NVIDIA_DRIVER_VERSION} modules" "40-nvidia-module" \ diff --git a/iso/vendor/acpica_bin/acpidump b/iso/vendor/acpica_bin/acpidump new file mode 100755 index 0000000000000000000000000000000000000000..ae492c4d9420d5e9d430c4f99ace2bfbf7e1a3c3 GIT binary patch literal 65213 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