Archived
Compose a bus user only for a module that can read an account
Every assigned module was composed as a bus user, though only one declaring a broker secret can ever be issued an account; the rest were named on every status, plan and push as credentials never minted (137 now), burying the real gaps. Their durable consumers are now derived from what the runtime carries, so nothing they hear changes. The composed file is unchanged: those users had no password and were already left out. Fixes hq issue 195.
This commit is contained in:
@@ -296,3 +296,57 @@ func TestTheRuntimeModuleBecomesTheMachinesRuntimePrincipal(t *testing.T) {
|
||||
t.Error("telegram lost its own principal when the runtime arrived on its node")
|
||||
}
|
||||
}
|
||||
|
||||
// A module that declares nowhere to read an account is no user: it could never be issued one, so it
|
||||
// was only ever named as a credential the mesh had not minted (novox/hq issue 195). Where the runtime
|
||||
// is, the runtime still carries it — its grants are the runtime's.
|
||||
func TestAModuleThatCannotReadAnAccountIsNoUser(t *testing.T) {
|
||||
r := someRecords()
|
||||
r.Assigned["one"] = append(r.Assigned["one"],
|
||||
Declared{Module: "packet-filter", NoAccount: true, Emits: []string{"rule.changed"}},
|
||||
Declared{Module: RuntimeModule})
|
||||
users, err := Users(r)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, u := range users {
|
||||
if u.Username() == "one.packet-filter" {
|
||||
t.Fatalf("packet-filter declares no broker secret and was composed as a user: %v", namesOf(t, r))
|
||||
}
|
||||
if u.Kind == KindNodeTools {
|
||||
carried := false
|
||||
for _, d := range u.Carries {
|
||||
carried = carried || d.Module == "packet-filter"
|
||||
}
|
||||
if !carried {
|
||||
t.Error("the runtime stopped carrying a module that has no account of its own")
|
||||
}
|
||||
}
|
||||
}
|
||||
if names := strings.Join(namesOf(t, r), ","); !strings.Contains(names, "one.telegram") {
|
||||
t.Errorf("a module that does read an account lost its user: %s", names)
|
||||
}
|
||||
}
|
||||
|
||||
// A carried module with no account still has its consumer made: the runtime reads it on the module's
|
||||
// behalf (ADR 0198), and the consumer was derived from the module's own user until issue 195 took
|
||||
// that user away.
|
||||
func TestACarriedModuleWithNoAccountStillHasItsConsumer(t *testing.T) {
|
||||
r := someRecords()
|
||||
r.Assigned["one"] = append(r.Assigned["one"],
|
||||
Declared{Module: "listener", NoAccount: true, Consumes: []string{"shop.order.placed"}},
|
||||
Declared{Module: RuntimeModule})
|
||||
r.Assigned["two"] = append(r.Assigned["two"],
|
||||
Declared{Module: "auditor", Consumes: []string{"shop.order.placed"}})
|
||||
users, err := Users(r)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
got := map[string]int{}
|
||||
for _, c := range ConsumersOf(users) {
|
||||
got[c.Node+"/"+c.Module]++
|
||||
}
|
||||
if got["one/listener"] != 1 || got["two/auditor"] != 1 || len(got) != 2 {
|
||||
t.Fatalf("consumers: %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user