Files
felhom-controller/REPORT.md
T
2026-06-14 17:40:04 +02:00

95 lines
6.2 KiB
Markdown

# REPORT — TASK A storage-lifecycle cleanups → controller v0.64.0 (2026-06-14)
Two settings-layer cleanups (A1, A2) + two doc-only changes (A3, A4) from the F9 storage-registration
diagnosis. Trunk-based, all on `main`, no branches. Each code change has a table-driven test that fails on
the pre-fix code. Built, pushed, and deployed to demo guest 9201; verified `:0.64.0 Up (healthy)` with a
clean startup (`controller_started (0.64.0)`, no errors).
> Verify against pushed source, not this report.
## Pre-flight
`main` is the only branch in felhom-controller; HEAD was `688ba0d v0.63.0` (CHANGELOG top + live container
both `:0.63.0`). Confirmed before starting.
## Per-item results
### A1 — `AutoDiscoverStoragePaths` made ADDITIVE
- **File:** `controller/internal/settings/settings.go` (the function previously at L584).
- **Change:** removed the `if len(s.StoragePaths) > 0 { return }` early-return. It now registers only
discovered paths NOT already present. Invariants enforced:
- Never removes/modifies a manually-added path.
- SKIPS any path already in the registry IN ANY STATE — including a `Decommissioned` soft-marked entry —
so it is never re-added or reactivated (`if existing[path] { continue }`, keyed on `filepath.Clean`).
- Never flips `IsDefault`: a newly-discovered path becomes default ONLY if the registry currently has no
default at all (and then only the first such new path) — `IsDefault: !hasDefault`, with `hasDefault`
seeded from existing entries and set true after the first new default.
- **Tests:** new `controller/internal/settings/storage_discovery_test.go`
(`TestAutoDiscoverStoragePaths_Additive`, table-driven, + `..._DecommissionedNotReactivated`):
- (a) non-empty registry + a deployed-app path missing from registry → exactly that path registered;
pre-existing entry byte-identical via `reflect.DeepEqual` (IsDefault asserted unchanged); new path not
promoted to default.
- (b) Decommissioned path present + a deployed app still pointing at it → NOT reactivated; entry
byte-identical; path count unchanged.
- extra cases: empty registry (first becomes default), registry-with-no-default (first new becomes
default), fallback path pickup.
- **Non-hollow proof:** temporarily removing the `if existing[path] { continue }` guard makes
`..._DecommissionedNotReactivated` FAIL (`path count changed: got 4 want 2`); restored → green.
- **Commit:** `2d4d432` (shared with A2). **Test result:** `ok internal/settings`.
### A2 — internal-SSD label disambiguation
- **File:** `controller/internal/settings/settings.go` (`InferStorageLabel`).
- **Change:** when `filepath.Base(path) == appbackup.FelhomDataDir` (the `"felhom-data"` namespace dir), the
label is now `Belső SSD (rendszer)` instead of the colliding `Tárhely (felhom-data)`. Imported
`internal/appbackup` for the constant (no import cycle — appbackup only depends on `internal/util`).
Still overridable via `SetStorageLabel`.
- **User-drive safety confirmation:** Model-A user drives register their MOUNT ROOT (e.g. `/mnt/felhom-usb`)
— confirmed live on 9201, where the user drive is registered as `/mnt/felhom-usb`, never
`.../felhom-data` — so the `base == felhom-data` match cannot mislabel a user drive.
- **Untouched:** the separate host-metrics label in `web/agent_host_metrics_handler.go:91` was left as-is
(display-only host-metrics path; A2 is the storage-registry label only).
- **Tests:** `TestInferStorageLabel` covers `/mnt/sys_drive/felhom-data``Belső SSD (rendszer)`, a
second felhom-data path, plus the existing hdd/ssd/usb/`Tárhely` branches (note: `felhom-usb` does NOT
start with `usb`, so it correctly labels `Tárhely (felhom-usb)` — pre-existing behavior).
- **Demo seeded-label update (before/after):** the seeded `settings.json` on 9201 had
`"/mnt/sys_drive/felhom-data" → "Tárhely (felhom-data)"`. Updated **through the real UI endpoint**
(`POST /settings/storage/label``SetStorageLabel`, the same handler the dashboard form posts to) to
`"Belső SSD (rendszer)"`; verified persisted in `settings.json`. (Note: the public URL
`https://felhom.demo-felhom.eu` returned 200 without applying the change — the Cloudflare/Traefik path
mangled the POST body; posting to the container's own `127.0.0.1:8080` returned 302 success and
persisted. Same handler either way.) Before: `Tárhely (felhom-data)`. After: `Belső SSD (rendszer)`.
- **Commit:** `2d4d432` (shared with A1). **Test result:** `ok internal/settings`.
### A3 — doc: reject auto-register-on-attach (no deploy)
- **File:** `felhom.eu/documentation/backlog/DIAGNOSIS-f9-storage-registration-gap-2026-06-14.md` (the doc
lives in `backlog/`, not `audits/` as the task said).
- **Change:** recommendation #1 annotated **REJECTED (2026-06-14)** — contradicts the new→enrolled
manual-enrollment model; manual enroll is by design. Noted that the "make discovery additive" sub-point
WAS adopted (v0.64.0 A1) but only for paths deployed apps reference, not auto-register of agent-attached
drives.
- **Commit:** `b5a9614` (felhom.eu repo).
### A4 — doc: live-validation rule (no deploy)
- **Files:** `felhom-controller/CLAUDE.md` and `felhom-agent/CLAUDE.md` — added the verbatim "Live
validation" paragraph to both.
- **Commits:** `e850402` (felhom-controller), `8e6d00a` (felhom-agent).
## Build / deploy / verify
- `go build ./... && go vet ./internal/settings/ && go test ./...` → all green locally.
- Built + pushed `gitea.dooplex.hu/admin/felhom-controller:0.64.0` on 192.168.0.180.
- Deployed to guest 9201 via the golden/bootstrap mechanism (`docker pull` → write
`/etc/felhom-controller-image` → restart `felhom-controller-bootstrap.service`).
- **Verify:** `docker ps``gitea.dooplex.hu/admin/felhom-controller:0.64.0 Up (healthy)`; logs show
`Event pushed: controller_started (info) — Controller elindult (0.64.0)` and no startup errors. No
rollback needed.
## Commit hashes (per item)
| Item | Repo | Commit |
|---|---|---|
| A1 + A2 (code + tests + CHANGELOG + README) | felhom-controller | `2d4d432` |
| A4 (CLAUDE.md) | felhom-controller | `e850402` |
| A4 (CLAUDE.md) | felhom-agent | `8e6d00a` |
| A3 (diagnosis annotation) | felhom.eu | `b5a9614` |