F-S2 + F-S3: compose-derived appdata dir resolution (v0.131.0)
The controller assumed an app's HDD appdata dir is always appdata/<stackName>.
paperless-ngx writes appdata/paperless (stack paperless-ngx), so every consumer
keying by stack name silently missed it via a stat-and-skip. One canonical
resolver appbackup.AppDataDirNames derives the real dir name(s) from the app's
compose ${HDD_PATH} binds; all consumers use it.
- F-S2 (tier-2): RunTier2 mirrors the resolved appdata/<name> (paperless docs
got NO tier-2 copy before). Tier2Info size + RestoreTier2Files live dir use it.
WARN when a declared appdata dir is absent. New tier2Mirror seam.
- F-S3 (migrate, NEW): all six per-app appdata legs (collision/size/copy/verify/
cleanup/skip-set) now loop resolved names. scope="app" migration of paperless
previously copied nothing and left an empty media dir (scope="all" was saved by
the merge walk). WARN on missing declared dir in the copy leg.
- Multi-dir (N>1) refusal: tier-2 backup/info/restore refuse loudly (Hungarian);
migrate supports N. No catalog app hits it today; lifted by Task 3.
- Display: storage page sums resolved dirs.
- Truth repair: the v0.130.0 "tier-2 copies the namespace wholesale" claim is
false; corrected in CHANGELOG + main.go export-adapter comment.
+9 tests; red-proofs RP-1..RP-5 all confirmed. Controller-only, no agent/hub
coupling. Task 1 of the backup-classification-redesign arc.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A45Qop8YY8tS94bz63LFne
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
||||
// the NON-effect (never stopped) and the happy path asserts the stop→copy→start order.
|
||||
type t2rFakeProvider struct {
|
||||
hdd string
|
||||
mounts []string // F-S2: configurable compose-derived HDD mounts (drives appdata dir-name resolution)
|
||||
stopped []string
|
||||
started []string
|
||||
order []string // interleaved event log: "stop", "copy" (appended by the copier seam), "start"
|
||||
@@ -24,7 +25,7 @@ type t2rFakeProvider struct {
|
||||
|
||||
func (f *t2rFakeProvider) GetStackComposePath(string) (string, bool) { return "", false }
|
||||
func (f *t2rFakeProvider) ListDeployedStacks() []StackSummary { return nil }
|
||||
func (f *t2rFakeProvider) GetStackHDDMounts(string) []string { return nil }
|
||||
func (f *t2rFakeProvider) GetStackHDDMounts(string) []string { return f.mounts }
|
||||
func (f *t2rFakeProvider) GetStackHDDPath(string) string { return f.hdd }
|
||||
func (f *t2rFakeProvider) GetDockerVolumes(string) []string { return nil }
|
||||
func (f *t2rFakeProvider) StopStack(name string) error {
|
||||
|
||||
Reference in New Issue
Block a user