review: a unit whose file the mesh wrote is stopped when undeclared, and what was found survives a failed first apply (hq ADR 0118)
Records written before Found existed left the adoption guard and the converge filter loaded on undeclare, then deleted their unit files from under them; a unit whose own file the mesh created is now the mesh's, whatever its record says. Found is kept apart the moment it is read, so a first apply that enabled and then failed is not read back as the machine's; boot is found the first time the mesh sets it; a service once stateless, or moved to another unit, is found afresh (the old unit given back). The unit is read after the reload that loads a file written in the same apply, and removal reports what it actually did.
This commit is contained in:
@@ -261,3 +261,42 @@ func TestAPlanSaysAContainerIsRecreatedWhenAFileItReadsChanged(t *testing.T) {
|
||||
t.Errorf("a container with no record of what it read is planned as %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAPlanSaysWhichUnitsAnUndeclareGivesBackAndWhichItLeaves(t *testing.T) {
|
||||
// novox/hq ADR 0118, said before it is done: "restore" only where removal may stop or disable
|
||||
// something, and a unit whose file the mesh wrote named as the mesh's.
|
||||
known := store.State{}
|
||||
known.Record(store.Applied{ID: "guard-unit", Type: "file", Target: "/etc/systemd/system/mesh-guard.service"})
|
||||
known.Record(store.Applied{ID: "guard", Type: "service", Target: "mesh-guard.service"})
|
||||
known.Record(store.Applied{ID: "filter", Type: "service", Target: "filter.service",
|
||||
Found: &store.FoundUnit{State: "stopped"}})
|
||||
known.Record(store.Applied{ID: "boot", Type: "service", Target: "boot.service",
|
||||
Found: &store.FoundUnit{State: "running", Boot: "disabled"}})
|
||||
known.Record(store.Applied{ID: "runtime", Type: "service", Target: "docker.service",
|
||||
Found: &store.FoundUnit{State: "running", Boot: "enabled"}})
|
||||
known.Record(store.Applied{ID: "old", Type: "service", Target: "sshd.service"})
|
||||
known.Record(store.Applied{ID: "nm", Type: "service", Target: "NetworkManager.service", Stateless: true})
|
||||
|
||||
steps := Plan(parse(t, nothingButA(t)), known, store.OriginCarried)
|
||||
got := verbs(steps)
|
||||
want := "forget nm, forget old, forget runtime, restore boot, restore filter, remove guard, remove guard-unit, create other"
|
||||
if got != want {
|
||||
t.Fatalf("planned %s\nwant %s", got, want)
|
||||
}
|
||||
for _, s := range steps {
|
||||
switch s.ID {
|
||||
case "guard":
|
||||
if !strings.Contains(s.Why, "unit file") {
|
||||
t.Errorf("the mesh's own unit was not named as the mesh's: %q", s.Why)
|
||||
}
|
||||
case "filter":
|
||||
if !strings.Contains(s.Why, "found it stopped") {
|
||||
t.Errorf("what the unit goes back to went unsaid: %q", s.Why)
|
||||
}
|
||||
case "old":
|
||||
if !strings.Contains(s.Why, "left as it is") {
|
||||
t.Errorf("a unit with nothing found was not said to be left: %q", s.Why)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user