hub v0.7.3: ingest agent backups + restore_tests (slice 6 Phase A)

Accept + persist the now-populated host-report backups/restore_tests. Mirror structs in
hostReportPayload; persisted via report_json (no schema change); a FAILED restore-test is
logged prominently (loudest DR signal). Shared golden updated byte-identical with
felhom-agent; bidirectional key-set tests added. Build/deploy deferred (backward-compatible).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-09 13:56:18 +02:00
parent 0c6ec27054
commit 41f2d2b5da
5 changed files with 169 additions and 33 deletions
+20 -29
View File
@@ -4,44 +4,35 @@
---
# REPORT — Hub: ingest agent `storage_targets` (v0.7.2) (2026-06-09)
# REPORT — Hub: ingest agent backups + restore_tests (v0.7.3) (2026-06-09)
## Outcome
**Code committed + pushed (changelogged as `v0.7.2`); image build/deploy deferred.** The
felhom-agent slice-5 Phase A work populates the host-report's `storage_targets` (previously a
defined-but-empty stub). This change is the hub half: accept and persist them. Deliberately
minimal — the authoritative storage manifest (desired class/role/policy/creds) is hub-owned and
arrives at slice 10; this slice only mirrors what the agent observes.
> **Deploy note:** the live hub is **v0.6.3**, behind the changelog (v0.7.0/v0.7.1 were
> committed but appear undeployed). Building+deploying v0.7.2 would also ship those intervening
> versions, so the deploy is deferred to an operator decision — flagged, not silently done. The
> change is backward-compatible (an agent sending `storage_targets: []` is accepted unchanged),
> so the live hub keeps ingesting host-reports fine until then.
**Code committed + pushed (changelogged as `v0.7.3`); image build/deploy deferred to an
operator decision.** The felhom-agent slice-6 Phase A work populates the host-report's
`backups` + `restore_tests`. This change is the hub half: accept + persist them. Minimal —
the authoritative backup policy is hub-owned (slice 10); this mirrors what the agent reports.
## What landed (`hub/internal/api/handler.go`, `host_test.go`, golden)
- `hostReportPayload` now parses `storage_targets` via a `hostStorageTarget` mirror struct that
matches the agent's `hub.StorageTarget` wire contract field-for-field (name/type/durable_id/
state/reachable/usage/content/mount/class_hint/role/`thin_pool`/`smart`).
- Persistence: the targets are stored verbatim in the existing `report_json` column (no schema
change / no migration). The handler counts them and logs a `[WARN]` listing disconnected
targets — the storage analog of host-down visibility.
- The shared `testdata/host-report.golden.json` now carries two populated targets (an lvmthin
with `thin_pool`, a usb) and is **byte-identical** with felhom-agent's copy.
- Tests: `TestHostStorageTarget_GoldenContract` is the hub half of the bidirectional key-set
test (round-trips the golden through the mirror, asserts exact key match);
`TestHostReport_GoldenContract` also asserts the targets persist + parse back. `go test
./internal/api/ ./internal/store/` is green.
- `hostReportPayload` gains `hostBackup` / `hostRestoreTest` mirror structs matching the
agent's `hub.Backup` / `hub.RestoreTest` field-for-field.
- Persistence via the existing `report_json` column (no schema change). The handler logs a
**FAILED restore-test prominently** (`[WARN]` — the loudest DR signal) and a failed backup;
the host-report info line counts backups + restore-tests.
- The shared `testdata/host-report.golden.json` now carries a populated `backups[0]` /
`restore_tests[0]`, **byte-identical** with felhom-agent's copy.
- `TestHostBackup_GoldenContract` / `TestHostRestoreTest_GoldenContract` are the hub half of
the bidirectional key-set test. `go test ./internal/api/ ./internal/store/` is green.
## Backward compatibility
An older agent that sends `storage_targets: []` (or omits the field) is accepted unchanged.
The legacy controller report path is untouched (frozen until the slice-10 cutover).
An agent that omits/empties `backups`/`restore_tests` is accepted unchanged. The legacy
controller report path is untouched (frozen until the slice-10 cutover).
## Deploy
Standard hub flow (build server 192.168.0.180): `./build.sh v0.7.2 --push` then deploy. If the
hub deployment is ArgoCD-managed, update the image tag via the managed path rather than a bare
`kubectl set image` (drift-correction would revert it).
> Per the GitOps flow (`CLAUDE.md`): build+push `gitea.dooplex.hu/admin/felhom-hub:v0.7.3`,
> bump `manifests/hub.yaml`, commit, then sync the `felhom` ArgoCD app. **Deferred** at this
> checkpoint — the change is backward-compatible, so the live hub (v0.7.2) keeps ingesting
> host-reports fine until then.