A host that delivered its own successor stood aside before the report of that apply was published, so it failed with 'context canceled' and the release plan waited for a report that never came (novox/hq issue 264). Reports are now published on a context the stand-aside does not cancel, and the last apply's report is kept until the broker takes it and said again on the next link, so a crash between apply and report is covered too.
65 lines
2.2 KiB
Go
65 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-host/internal/link"
|
|
"github.com/novox/mesh-host/internal/store"
|
|
)
|
|
|
|
// The last apply's report, kept beside the state until the mesh takes it (novox/hq issue 264).
|
|
|
|
// What a host that died between applying and reporting kept is read back by the next one exactly —
|
|
// the digest and the outcome, never a new account of the machine.
|
|
func TestTheKeptReportSurvivesTheHost(t *testing.T) {
|
|
state := filepath.Join(t.TempDir(), "state.json")
|
|
made := link.Report{Declared: "sha256:d1", Applied: []string{"a"}, Failed: map[string]string{"b": "no room"},
|
|
Host: "v2"}
|
|
if err := unsaidBeside(state).Keep(made); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
kept, ok, err := unsaidBeside(state).Pending()
|
|
if err != nil || !ok {
|
|
t.Fatalf("nothing kept: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(kept, made) {
|
|
t.Fatalf("kept %+v, made %+v", kept, made)
|
|
}
|
|
|
|
// Taken about another declaration, it stays; taken about this one, it goes.
|
|
if err := unsaidBeside(state).Said("sha256:other"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, ok, _ := unsaidBeside(state).Pending(); !ok {
|
|
t.Fatal("a report about another declaration cleared this one")
|
|
}
|
|
if err := unsaidBeside(state).Said("sha256:d1"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := os.Stat(store.UnsaidPath(state)); !os.IsNotExist(err) {
|
|
t.Fatalf("the report was taken and is still kept: %v", err)
|
|
}
|
|
}
|
|
|
|
// A node that never applied anything has nothing to say again; and an apply refused before its
|
|
// declaration was read clears an older report, which would otherwise be re-said after it.
|
|
func TestNothingKeptWhenNothingWasApplied(t *testing.T) {
|
|
state := filepath.Join(t.TempDir(), "state.json")
|
|
if _, ok, err := unsaidBeside(state).Pending(); ok || err != nil {
|
|
t.Fatalf("a node that applied nothing has a report to say: %v %v", ok, err)
|
|
}
|
|
if err := unsaidBeside(state).Keep(link.Report{Declared: "sha256:d1"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := unsaidBeside(state).Keep(link.Report{Refused: "forged"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, ok, _ := unsaidBeside(state).Pending(); ok {
|
|
t.Fatal("an older report is kept after a later declaration was refused")
|
|
}
|
|
}
|