Skip to content

Commit 3acec8b

Browse files
committed
Expand System Health R2 validation
1 parent 9a6779f commit 3acec8b

16 files changed

Lines changed: 821 additions & 493 deletions

admin/system-health.html

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,16 +316,17 @@ <h3>Manual Health Actions</h3>
316316
<tr>
317317
<th scope="col">Check</th>
318318
<th scope="col">Target</th>
319+
<th scope="col">Timing</th>
319320
<th scope="col">Status</th>
320321
</tr>
321322
</thead>
322323
<tbody>
323-
<tr><td>Bucket connectivity</td><td data-admin-system-health-storage-value="bucket">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="bucket" title="Reason: R2 bucket connectivity has not loaded yet." aria-label="PENDING: R2 bucket connectivity has not loaded yet.">PENDING</td></tr>
324-
<tr><td>List</td><td data-admin-system-health-storage-value="list">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="list" title="Reason: R2 list check has not loaded yet." aria-label="PENDING: R2 list check has not loaded yet.">PENDING</td></tr>
325-
<tr><td>Upload</td><td data-admin-system-health-storage-value="upload">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="upload" title="Reason: R2 upload check has not loaded yet." aria-label="PENDING: R2 upload check has not loaded yet.">PENDING</td></tr>
326-
<tr><td>Read</td><td data-admin-system-health-storage-value="read">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="read" title="Reason: R2 read check has not loaded yet." aria-label="PENDING: R2 read check has not loaded yet.">PENDING</td></tr>
327-
<tr><td>Delete</td><td data-admin-system-health-storage-value="delete">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="delete" title="Reason: R2 delete check has not loaded yet." aria-label="PENDING: R2 delete check has not loaded yet.">PENDING</td></tr>
328-
<tr><td>Last checked</td><td data-admin-system-health-storage-value="lastChecked">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="lastChecked" title="Reason: R2 health has not loaded yet." aria-label="PENDING: R2 health has not loaded yet.">PENDING</td></tr>
324+
<tr><td>Bucket connectivity</td><td data-admin-system-health-storage-value="bucket">Loading</td><td data-admin-system-health-storage-timing="bucket">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="bucket" title="Reason: R2 bucket connectivity has not loaded yet." aria-label="PENDING: R2 bucket connectivity has not loaded yet.">PENDING</td></tr>
325+
<tr><td>List</td><td data-admin-system-health-storage-value="list">Loading</td><td data-admin-system-health-storage-timing="list">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="list" title="Reason: R2 list check has not loaded yet." aria-label="PENDING: R2 list check has not loaded yet.">PENDING</td></tr>
326+
<tr><td>Upload</td><td data-admin-system-health-storage-value="upload">Loading</td><td data-admin-system-health-storage-timing="upload">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="upload" title="Reason: R2 upload check has not loaded yet." aria-label="PENDING: R2 upload check has not loaded yet.">PENDING</td></tr>
327+
<tr><td>Read</td><td data-admin-system-health-storage-value="read">Loading</td><td data-admin-system-health-storage-timing="read">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="read" title="Reason: R2 read check has not loaded yet." aria-label="PENDING: R2 read check has not loaded yet.">PENDING</td></tr>
328+
<tr><td>Delete</td><td data-admin-system-health-storage-value="delete">Loading</td><td data-admin-system-health-storage-timing="delete">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="delete" title="Reason: R2 delete check has not loaded yet." aria-label="PENDING: R2 delete check has not loaded yet.">PENDING</td></tr>
329+
<tr><td>Last checked</td><td data-admin-system-health-storage-value="lastChecked">Loading</td><td data-admin-system-health-storage-timing="lastChecked">Loading</td><td data-health-status="PENDING" data-admin-system-health-storage-status="lastChecked" title="Reason: R2 health has not loaded yet." aria-label="PENDING: R2 health has not loaded yet.">PENDING</td></tr>
329330
</tbody>
330331
</table>
331332
</div>

assets/theme-v2/js/admin-system-health.js

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
readAdminSystemHealthStatus,
33
runAdminSystemHealthAction,
4-
runAdminSystemHealthStorageConnectivityAction,
4+
runAdminSystemHealthStorageExpandedValidation,
55
} from "../../../src/api/admin-system-health-api-client.js";
66
import {
77
applyStatusNode,
@@ -54,6 +54,10 @@ class AdminSystemHealthController {
5454
node.dataset.adminSystemHealthStorageStatus,
5555
node,
5656
]));
57+
this.storageTimings = new Map(Array.from(root.querySelectorAll("[data-admin-system-health-storage-timing]")).map((node) => [
58+
node.dataset.adminSystemHealthStorageTiming,
59+
node,
60+
]));
5761
this.runtimeHealthValues = new Map(Array.from(root.querySelectorAll("[data-admin-system-health-runtime-health-value]")).map((node) => [
5862
node.dataset.adminSystemHealthRuntimeHealthValue,
5963
node,
@@ -122,6 +126,13 @@ class AdminSystemHealthController {
122126
this.setStatusNode(node, status, reason);
123127
}
124128

129+
setStorageTiming(key, value, fallback) {
130+
const node = this.storageTimings.get(key);
131+
if (node) {
132+
node.textContent = asText(value, fallback);
133+
}
134+
}
135+
125136
setRuntimeHealthValue(key, value, fallback) {
126137
const node = this.runtimeHealthValues.get(key);
127138
if (node) {
@@ -195,6 +206,7 @@ class AdminSystemHealthController {
195206
renderStoragePending(reason) {
196207
["bucket", "list", "upload", "read", "delete", "lastChecked"].forEach((key) => {
197208
this.setStorageStatus(key, "PENDING", reason);
209+
this.setStorageTiming(key, "not available");
198210
});
199211
this.renderRuntimePending(reason);
200212
}
@@ -261,8 +273,10 @@ class AdminSystemHealthController {
261273
const reason = storageStatus.message || "Cloudflare R2 configuration status returned by the safe Admin System Health API.";
262274
this.setStorageValue("bucket", storageStatus.environmentFolder ? `${storageStatus.bucket || "not configured"} ${storageStatus.environmentFolder}` : storageStatus.bucket, "not configured");
263275
this.setStorageStatus("bucket", storageStatus.bucketStatus || storageStatus.status, reason);
276+
this.setStorageTiming("bucket", storageStatus.lastChecked ? "configuration status" : "not available");
264277
this.setStorageValue("lastChecked", storageStatus.lastChecked, "not available");
265278
this.setStorageStatus("lastChecked", storageStatus.lastChecked ? "PASS" : "WARN", reason);
279+
this.setStorageTiming("lastChecked", storageStatus.lastChecked ? "configuration status" : "not available");
266280
}
267281

268282
renderRuntimeHealthPending(reason) {
@@ -684,9 +698,11 @@ class AdminSystemHealthController {
684698
}
685699
this.setStorageValue(key, this.storageResultTarget(result));
686700
this.setStorageStatus(key, result.status, result.message || "R2 diagnostic returned without a message.");
701+
this.setStorageTiming(key, Number.isFinite(Number(result.durationMs)) ? `${result.durationMs} ms` : "not available");
687702
if (result.lastChecked) {
688703
this.setStorageValue("lastChecked", result.lastChecked);
689704
this.setStorageStatus("lastChecked", "PASS", "Most recent current-environment R2 health check timestamp.");
705+
this.setStorageTiming("lastChecked", Number.isFinite(Number(result.durationMs)) ? `${result.durationMs} ms` : "not available");
690706
}
691707
}
692708

@@ -732,15 +748,24 @@ class AdminSystemHealthController {
732748
runStorageDiagnostics() {
733749
STORAGE_DIAGNOSTIC_ACTIONS.forEach(({ key }) => {
734750
this.setStorageStatus(key, "PENDING", "R2 diagnostic is running through the safe Admin System Health API.");
751+
this.setStorageTiming(key, "running");
735752
});
736-
STORAGE_DIAGNOSTIC_ACTIONS.forEach(({ actionId, key }) => {
737-
try {
738-
this.renderStorageResult(key, runAdminSystemHealthStorageConnectivityAction(actionId));
739-
} catch (error) {
740-
const message = error instanceof Error ? error.message : "Safe R2 diagnostic API is unavailable.";
753+
try {
754+
const validation = runAdminSystemHealthStorageExpandedValidation();
755+
const diagnostics = Array.isArray(validation.storageDiagnostics) ? validation.storageDiagnostics : [];
756+
diagnostics.forEach((storageResult) => {
757+
const key = STORAGE_DIAGNOSTIC_ACTION_KEY_BY_ID.get(storageResult.actionId);
758+
if (key) {
759+
this.renderStorageResult(key, storageResult);
760+
}
761+
});
762+
} catch (error) {
763+
const message = error instanceof Error ? error.message : "Safe R2 diagnostic API is unavailable.";
764+
STORAGE_DIAGNOSTIC_ACTIONS.forEach(({ key }) => {
741765
this.setStorageStatus(key, "PENDING", message);
742-
}
743-
});
766+
this.setStorageTiming(key, "not available");
767+
});
768+
}
744769
}
745770

746771
createCell(text) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation
2+
3+
Team: Charlie
4+
Branch: pr/26177-CHARLIE-030-r2-storage-health-expanded-validation
5+
Base: pr/26177-CHARLIE-029-system-health-postgres-metrics-panel
6+
Lifecycle: Build / Validation
7+
8+
## Scope
9+
- Expanded System Health R2 validation into an API-owned current-environment validation run.
10+
- Added safe list/upload/read/delete diagnostics with duration, operation label, cleanup status, and permanent-object metadata.
11+
- Updated the System Health UI to show storage timing without adding inline styles, script blocks, or page-local CSS.
12+
13+
## Changed Files
14+
- admin/system-health.html
15+
- assets/theme-v2/js/admin-system-health.js
16+
- src/api/admin-system-health-api-client.js
17+
- src/dev-runtime/server/local-api-router.mjs
18+
- tests/api/admin-system-health/contract.test.mjs
19+
- tests/dev-runtime/AdminHealthOperations.test.mjs
20+
- tests/playwright/tools/AdminHealthOperationsPage.spec.mjs
21+
- docs_build/dev/reports/coverage_changed_js_guardrail.txt
22+
- docs_build/dev/reports/playwright_v8_coverage_report.txt
23+
24+
## Validation
25+
- PASS: node --check src/dev-runtime/server/local-api-router.mjs
26+
- PASS: node --check assets/theme-v2/js/admin-system-health.js
27+
- PASS: node --check src/api/admin-system-health-api-client.js
28+
- PASS: node --test tests/api/admin-system-health/contract.test.mjs
29+
- PASS: node --test tests/dev-runtime/AdminHealthOperations.test.mjs
30+
- PASS: npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line
31+
- PASS: git diff --check
32+
33+
## ZIP
34+
- Pending until commit: C:\Users\DavidQ\Documents\GitHub\HTML-JavaScript-Gaming\tmp\PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_delta.zip
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Branch Validation
2+
3+
Branch: pr/26177-CHARLIE-030-r2-storage-health-expanded-validation
4+
Expected stack base: pr/26177-CHARLIE-029-system-health-postgres-metrics-panel
5+
Current status at validation:
6+
## pr/26177-CHARLIE-030-r2-storage-health-expanded-validation
7+
M admin/system-health.html
8+
M assets/theme-v2/js/admin-system-health.js
9+
M docs_build/dev/reports/coverage_changed_js_guardrail.txt
10+
M docs_build/dev/reports/playwright_v8_coverage_report.txt
11+
M src/api/admin-system-health-api-client.js
12+
M src/dev-runtime/server/local-api-router.mjs
13+
M tests/api/admin-system-health/contract.test.mjs
14+
M tests/dev-runtime/AdminHealthOperations.test.mjs
15+
M tests/playwright/tools/AdminHealthOperationsPage.spec.mjs
16+
17+
Result: PASS
18+
19+
Checks:
20+
- PASS: Branch created from PR 029 branch for the approved stacked chain.
21+
- PASS: Active branch matches PR identity.
22+
- PASS: Worktree contained only scoped PR changes and generated validation reports.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Manual Validation Notes
2+
3+
- Confirmed the browser calls one expanded R2 validation action instead of owning the list/upload/read/delete sequence itself.
4+
- Confirmed Storage Health displays timing values for list, upload, read, and delete rows.
5+
- Confirmed storage validation payload includes cleanup status and permanent-object metadata.
6+
- Confirmed storage diagnostics stay scoped to the current environment folder.
7+
- Confirmed no storage credentials or secrets are displayed.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Requirement Checklist
2+
3+
- PASS: Expanded Cloud/R2 storage health validation.
4+
- PASS: Included safe bucket/list/write/read/delete validation through API-owned action contract.
5+
- PASS: Included timing/status fields where available.
6+
- PASS: Does not create browser-owned storage health state.
7+
- PASS: Test object cleanup is attempted in the same expanded validation run.
8+
- PASS: Does not expose secrets.
9+
- PASS: Current environment folder only.
10+
- PASS: No unrelated files modified.
11+
- PASS: No start_of_day files modified.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# PR_26177_CHARLIE_030-r2-storage-health-expanded-validation Validation Lane Report
2+
3+
Impacted lanes:
4+
- runtime: Local API Admin System Health R2 action contract.
5+
- contract: Admin System Health API contract tests.
6+
- UI: Admin System Health Theme V2 page controller and markup.
7+
- Playwright: targeted Admin System Health page spec.
8+
9+
Commands:
10+
- node --check src/dev-runtime/server/local-api-router.mjs
11+
- node --check assets/theme-v2/js/admin-system-health.js
12+
- node --check src/api/admin-system-health-api-client.js
13+
- node --test tests/api/admin-system-health/contract.test.mjs
14+
- node --test tests/dev-runtime/AdminHealthOperations.test.mjs
15+
- npx playwright test tests/playwright/tools/AdminHealthOperationsPage.spec.mjs --workers=1 --reporter=line
16+
- git diff --check
17+
18+
Skipped lanes:
19+
- Full samples smoke skipped; not impacted by System Health storage diagnostics.
20+
- Full Project Workspace suite skipped; targeted Admin/System Health coverage was sufficient for this scoped page/API change.
21+
22+
Result: PASS

docs_build/dev/reports/codex_changed_files.txt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,32 @@ M admin/system-health.html
33
M assets/theme-v2/js/admin-system-health.js
44
M docs_build/dev/reports/coverage_changed_js_guardrail.txt
55
M docs_build/dev/reports/playwright_v8_coverage_report.txt
6+
M src/api/admin-system-health-api-client.js
67
M src/dev-runtime/server/local-api-router.mjs
78
M tests/api/admin-system-health/contract.test.mjs
89
M tests/dev-runtime/AdminHealthOperations.test.mjs
910
M tests/playwright/tools/AdminHealthOperationsPage.spec.mjs
10-
?? docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel.md
11-
?? docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_branch-validation.md
12-
?? docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_manual-validation-notes.md
13-
?? docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_requirements-checklist.md
14-
?? docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_validation-lane.md
11+
?? docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation.md
12+
?? docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_branch-validation.md
13+
?? docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_manual-validation-notes.md
14+
?? docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_requirements-checklist.md
15+
?? docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_validation-lane.md
1516

1617
# git ls-files --others --exclude-standard
17-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel.md
18-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_branch-validation.md
19-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_manual-validation-notes.md
20-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_requirements-checklist.md
21-
docs_build/dev/reports/PR_26177_CHARLIE_029-system-health-postgres-metrics-panel_validation-lane.md
18+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation.md
19+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_branch-validation.md
20+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_manual-validation-notes.md
21+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_requirements-checklist.md
22+
docs_build/dev/reports/PR_26177_CHARLIE_030-r2-storage-health-expanded-validation_validation-lane.md
2223

2324
# git diff --stat
24-
admin/system-health.html | 16 +++
25-
assets/theme-v2/js/admin-system-health.js | 42 ++++++++
26-
.../dev/reports/coverage_changed_js_guardrail.txt | 5 +-
27-
.../dev/reports/playwright_v8_coverage_report.txt | 29 ++++--
28-
src/dev-runtime/server/local-api-router.mjs | 115 +++++++++++++++++++--
29-
tests/api/admin-system-health/contract.test.mjs | 15 +++
30-
tests/dev-runtime/AdminHealthOperations.test.mjs | 20 ++++
31-
.../tools/AdminHealthOperationsPage.spec.mjs | 11 ++
32-
8 files changed, 233 insertions(+), 20 deletions(-)
25+
admin/system-health.html | 13 +--
26+
assets/theme-v2/js/admin-system-health.js | 41 ++++++--
27+
.../dev/reports/coverage_changed_js_guardrail.txt | 3 +-
28+
.../dev/reports/playwright_v8_coverage_report.txt | 8 +-
29+
src/api/admin-system-health-api-client.js | 4 +
30+
src/dev-runtime/server/local-api-router.mjs | 105 +++++++++++++++++++--
31+
tests/api/admin-system-health/contract.test.mjs | 19 ++++
32+
tests/dev-runtime/AdminHealthOperations.test.mjs | 6 ++
33+
.../tools/AdminHealthOperationsPage.spec.mjs | 8 +-
34+
9 files changed, 180 insertions(+), 27 deletions(-)

0 commit comments

Comments
 (0)