|
|
|
@@ -41,12 +41,6 @@ var createdAdvisory = regexp.MustCompile(`"\$JS\.EVENT\.ADVISORY\.STREAM\.CREATE
|
|
|
|
|
// write.
|
|
|
|
|
func beyondTheControllers(user string) map[string]bool {
|
|
|
|
|
out := map[string]bool{}
|
|
|
|
|
// The self-check's runtime asks who answers (D-root, D3).
|
|
|
|
|
if strings.HasSuffix(user, "."+SelfCheckModule) {
|
|
|
|
|
for _, s := range discovering() {
|
|
|
|
|
out[s] = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if strings.HasSuffix(user, "."+WatchmanModule) {
|
|
|
|
|
for _, s := range append(WatchmanDeadLetterGrants(nil), WatchmanHears()...) {
|
|
|
|
|
out[s] = true
|
|
|
|
@@ -620,7 +614,7 @@ func healthChecks(t *testing.T) {
|
|
|
|
|
users, err := Users(Records{Nodes: []string{"a"}, Assigned: map[string][]Declared{"a": {
|
|
|
|
|
{Module: "mesh-conditions", State: []Bucket{bucket("mesh-conditions", "conditions"), bucket("mesh-conditions", "takeover")},
|
|
|
|
|
Reads: []string{"mesh-self-check.findings", "mesh-healers.attempts", ControllerConditions}},
|
|
|
|
|
{Module: "mesh-self-check", State: []Bucket{bucket("mesh-self-check", "findings")}, Reads: []string{"restic.good", GrantsWithheldRead}},
|
|
|
|
|
{Module: "mesh-self-check", State: []Bucket{bucket("mesh-self-check", "findings")}, Reads: []string{"restic.good"}},
|
|
|
|
|
// Issue 1955 L7: the grants part keeps the hearings it withholds; the self-check reads them.
|
|
|
|
|
{Module: GrantsModule, State: []Bucket{bucket(GrantsModule, GrantsWithheldState)}},
|
|
|
|
|
{Module: "mesh-healers", State: []Bucket{bucket("mesh-healers", "findings"), bucket("mesh-healers", "attempts"), bucket("mesh-healers", "would")}},
|
|
|
|
@@ -665,9 +659,8 @@ func healthChecks(t *testing.T) {
|
|
|
|
|
"provisioner.a": {"$JS.API.DIRECT.GET.KV_mesh-provisioner_plans.$KV.mesh-provisioner_plans.a.keycloak",
|
|
|
|
|
"$JS.API.CONSUMER.CREATE.KV_mesh-provisioner_plans.c1.$KV.mesh-provisioner_plans.a.keycloak"},
|
|
|
|
|
// ADR 0571 clause 3: restic's bundle writes each item's last good night as its own state; the self-check reads it.
|
|
|
|
|
"a.mesh-self-check": {"$JS.API.DIRECT.GET.KV_restic_good.$KV.restic_good.a.pg.data", "$SRV.INFO.node-tools", "$SRV.PING",
|
|
|
|
|
"$JS.API.DIRECT.GET.KV_mesh-grants_withheld.$KV.mesh-grants_withheld." + WithheldKey(Withheld{Node: "a", Module: "reader", Stream: "MAIL"})},
|
|
|
|
|
"a.mesh-grants": {"$KV.mesh-grants_withheld.reader.mail.a"},
|
|
|
|
|
"a.mesh-self-check": {"$JS.API.DIRECT.GET.KV_restic_good.$KV.restic_good.a.pg.data"},
|
|
|
|
|
"a.mesh-grants": {"$KV.mesh-grants_withheld.reader.mail.a"},
|
|
|
|
|
"a.restic": {"$JS.API.DIRECT.GET.KV_disk-load_readings.$KV.disk-load_readings.a.pg.data", "$KV.restic_good.a.pg.data",
|
|
|
|
|
// ADR 0571 clause 7: its own membership from the grants part's state.
|
|
|
|
|
"$JS.API.DIRECT.GET.KV_mesh-grants_memberships.$KV.mesh-grants_memberships.a.restic"},
|
|
|
|
@@ -687,14 +680,15 @@ func healthChecks(t *testing.T) {
|
|
|
|
|
// The keeper writes no findings and no attempts; no observer writes the keeper's buckets (clause 2).
|
|
|
|
|
"a.mesh-conditions": {"$KV.mesh-self-check_findings.x", "$KV.mesh-healers_attempts.x", "$KV.mesh-controller_conditions.x"},
|
|
|
|
|
"a.mesh-self-check": {"$KV.mesh-conditions_conditions.x", "$KV.mesh-conditions_takeover.switch", "$KV.restic_good.a.pg.data",
|
|
|
|
|
"$KV.mesh-grants_withheld.reader.mail.a"},
|
|
|
|
|
"$KV.mesh-grants_withheld.reader.mail.a", "$SRV.INFO", "$SRV.PING.node-tools",
|
|
|
|
|
"$JS.API.DIRECT.GET.KV_mesh-grants_withheld.$KV.mesh-grants_withheld.reader.mail.a"},
|
|
|
|
|
// Only mesh-provisioner writes provisions and plans, and it writes none of the grants part's states (ADR 0570
|
|
|
|
|
// clauses 1, 8).
|
|
|
|
|
"a.mesh-provisioner": {"$KV.mesh-grants_accounts.a.m", "$KV.mesh-grants_user-list.sealed"},
|
|
|
|
|
"a.mesh-vault": {"$KV.mesh-provisioner_provisions.a.keycloak.postgres-database", "$KV.mesh-provisioner_plans.a.keycloak",
|
|
|
|
|
"mesh.seat.mesh-artifact-sweep.event.artifacts-gone"},
|
|
|
|
|
// Each writes its own state alone, and these users are composed.
|
|
|
|
|
"a.disk-load": {"$KV.restic_good.a.pg.data", "$SRV.INFO", "$SRV.PING.node-tools"},
|
|
|
|
|
"a.disk-load": {"$KV.restic_good.a.pg.data"},
|
|
|
|
|
"a.mesh-delivery-builder": {"$KV.disk-load_readings.a.pg.data"},
|
|
|
|
|
// Another machine's plans are not its to read; no client writes or reads the needs any more.
|
|
|
|
|
"provisioner.a": {"$JS.API.DIRECT.GET.KV_mesh-provisioner_plans.$KV.mesh-provisioner_plans.b.keycloak",
|
|
|
|
|