The installer lets the first node onto the bus it raised
At genesis the bus's users reach it in no declaration, because the machine running it has not enrolled. The installer, which raised the bus from its bundle, places the control plane's composed list beside it and makes it re-read it: before the machine enrols, for the token's account, and after, for the node's own (novox/hq issue 146).
This commit is contained in:
@@ -261,3 +261,56 @@ func TestAListingIsMatchedByNameAndNotBySubstring(t *testing.T) {
|
||||
t.Error("registry-mirror was not found")
|
||||
}
|
||||
}
|
||||
|
||||
// **Genesis places the bus's users, before the machine enrols and again after** (novox/hq
|
||||
// 04-ISSUES/146). The enrolment account exists only in the mesh's records until somebody writes it
|
||||
// beside the bus; so does the node's own, minted as it enrols. Without the first, the machine is
|
||||
// refused by the bus it just raised; without the second, its agent is.
|
||||
func TestAFirstNodeIsLetOntoTheBusItRaised(t *testing.T) {
|
||||
enrolled := false
|
||||
runtime := &asked{answer: func(name string, args []string) (string, error) {
|
||||
joined := strings.Join(args, " ")
|
||||
switch {
|
||||
case strings.Contains(joined, "node list"):
|
||||
if enrolled {
|
||||
return "anchor here 01J0\n", nil
|
||||
}
|
||||
return "", nil
|
||||
case strings.Contains(joined, "node add"):
|
||||
return "added anchor\n", nil
|
||||
case strings.Contains(joined, "token issue"):
|
||||
return "a token for anchor, good once:\n\n " + strings.Repeat("t", 240) + "\n\n", nil
|
||||
case strings.Contains(joined, "broker accounts"):
|
||||
return "accounts {\n MESH { users = [] }\n}\n", nil
|
||||
case name == "/usr/local/bin/mesh-host":
|
||||
enrolled = true
|
||||
return "enrolled as anchor\n", nil
|
||||
case name == "pgrep", name == "sh":
|
||||
return "", nil
|
||||
}
|
||||
return "", fmt.Errorf("unexpected: %s %v", name, args)
|
||||
}}
|
||||
|
||||
if _, err := Enrol(context.Background(), Options{
|
||||
Node: "anchor", State: filepath.Join(t.TempDir(), "state.json"), Timeout: time.Second,
|
||||
Host: "/usr/local/bin/mesh-host", HostInBackground: true,
|
||||
}, arch(t), controlPlane{container: "temp-mesh-controller", run: runtime.run, timeout: time.Second},
|
||||
func(string) {}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
placed, enrol := []int{}, -1
|
||||
for i, c := range runtime.commands {
|
||||
if strings.HasPrefix(c, "sh -c") && strings.Contains(c, "kill -s HUP mesh-broker") &&
|
||||
strings.Contains(c, "/var/lib/mesh-bus-conf/accounts.conf") {
|
||||
placed = append(placed, i)
|
||||
}
|
||||
if strings.HasPrefix(c, "/usr/local/bin/mesh-host enrol") {
|
||||
enrol = i
|
||||
}
|
||||
}
|
||||
if enrol < 0 || len(placed) != 2 || placed[0] > enrol || placed[1] < enrol {
|
||||
t.Fatalf("the bus's users were not placed before the machine enrolled and again after "+
|
||||
"(placed at %v, enrolled at %d):\n%s", placed, enrol, strings.Join(runtime.commands, "\n"))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user