68e7e07838
handleStorageRegister (the "Regisztrálás" action for an already-mounted, unregistered drive) registered the raw /mnt/<name> path verbatim, unlike runStorageInit/runStorageAttach which map to the stable /mnt/felhom-drives/<name> path the agent actually binds the drive at. The controller then watched an empty placeholder dir on the guest rootfs → "Rendszermeghajtón" + stuck "activation pending" banner after a re-provision. Fix: register stablePathForName(path.Base(req.Where)); attachIntoGuest still uses the raw path (the agent operates on raw). Test + red-proof added. Diagnosis: felhom.eu/documentation/audits/DIAGNOSE-drive-bind-after-reprovision-2026-06-23.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PsnU2ASocYrvzqE82YDYW
3.8 KiB
3.8 KiB
REPORT — controller v0.78.0: storage register uses the STABLE path (not the raw path)
Baseline
- felhom-controller
main@66d8462, v0.77.0 → v0.78.0. Trunk-based,main. - Fixes the diagnosis
felhom.eu/documentation/audits/DIAGNOSE-drive-bind-after-reprovision-2026-06-23.md(§4/§5). Agent untouched (it already binds drives at the stable path).
Problem
handleStorageRegister (the "Regisztrálás" action for an already-mounted, unregistered drive) registered
the raw /mnt/<name> path verbatim, while runStorageInit/runStorageAttach register the stable
intermediary path /mnt/felhom-drives/<name>. In the intermediary model the drive is live in the guest
only at the stable path, so the controller watched an empty placeholder dir on the guest rootfs →
"Rendszermeghajtón" badge (~31 GB), 0 connected / N disconnected, and a stuck "activation pending"
banner. The real drives were fine the whole time.
Fix (controller/internal/web/storage_handlers.go, handleStorageRegister)
stable := stablePathForName(path.Base(req.Where))→registerStoragePath(stable, …)(wasregisterStoragePath(req.Where, …)), mirroringrunStorageInit/runStorageAttach.attachIntoGuest(req.Where)unchanged — the agent still operates on the raw path.- Success
[INFO]log + thewriteDiskJSONpayload now report the stable registered path (+ raw). - No change to
runStorageInit/runStorageAttach/registerStoragePathor any other behavior.
Tests + red-proof
go build ./... && go vet ./... && go test ./...— all green before and after.- New
TestHandleStorageRegister_RegistersStablePath(storage_handlers_test.go): drives the HTTP handler withwhere=/mnt/felhom-flash, asserts the registry holds/mnt/felhom-drives/felhom-flashand the JSON reports stablewhere+ raw. PASS. - Red-proof: reverted the handler to
registerStoragePath(req.Where, …)→ the test FAILED (got "/mnt/felhom-flash") → re-applied the fix → green. ✅ - Existing
TestRunStorageInit_Success/TestRunStorageAttach_Success(which assert stable registration- raw guest-attach) kept green, unmodified.
internal/webtest count: +1 (the new register test). Full suite green.
Deploy (v0.78.0 → guest 9201)
- (filled at deploy) built+pushed
gitea.dooplex.hu/admin/felhom-controller:0.78.0on 192.168.0.180; deployed to 9201 (pull →/etc/felhom-controller-image→ restartfelhom-controller-bootstrap.service);docker ps→:0.78.0 Up (healthy).
9201 registry remediation (non-destructive)
- (filled at remediation) deregistered the two raw entries
/mnt/felhom-flash+/mnt/felhom-usb(deregister-only — NOT eject, the live drive stays mounted), removed the empty rootfs placeholder dirs, re-registered via the fixedPOST /api/storage/register→ both now at/mnt/felhom-drives/<name>.
Verification (§6-C)
- (filled at verify) registry holds the stable paths; controller selftest storage paths CONNECTED; storage UI shows real size/device, no "Rendszermeghajtón" badge, no activation banner.
Observations (recorded, NOT acted on)
pendingActivationDrives(storage_handlers.go) keysattachedby the agent's rawMountPathand compares to the registeredsp.Path. With stable registration the activation banner clears, but the function no longer detects a genuinely not-yet-propagated drive. The intermediary model activates LIVE (no reboot), so the "~30 mp újraindítás" banner copy is likely obsolete; activation detection should key offGuestPath/BoundUnderParentlikeplanDriveGates, or the banner be retired. Follow-up.- The free-form settings storage-add (
handlers.go) registers a user-typed path verbatim; a raw/mnt/<name>typed there would hit the same shape. Advanced manual flow, out of scope.