Nothing has claimed node-dns-resolver since the mesh moved to one resolver (hq ADR 0194); seeding never removes a row, so a migration deletes it. resolv.conf stays the mesh's only while the network manager is told to keep off it, which the node-uplink holder does (ADR 0117). A seat's Needs makes that a dependency checked at assignment by the ADR 0207 mechanism (hq ADR 0220). The two-claimants test keeps its intent with a synthetic module now that resolved-split-dns leaves the catalogue.
58 lines
2.9 KiB
Go
58 lines
2.9 KiB
Go
package broker
|
|
|
|
import "testing"
|
|
|
|
// A node-scoped seat's tool carries the node (novox/hq ADR 0132, design 33 §4): two nodes holding one
|
|
// node-scoped seat derive two addresses, and a user of the seat may publish any node's.
|
|
func TestTwoNodesHoldingOneNodeSeatDeriveTwoToolAddresses(t *testing.T) {
|
|
seat := Seat{Name: "node-hosts-file", Scope: "node", Serves: []string{"entries"}}
|
|
one, _ := PermissionsFor(Principal{Kind: KindModule, Node: "one", Module: "hosts", Holds: []Seat{seat}, PasswordHash: "x"})
|
|
two, _ := PermissionsFor(Principal{Kind: KindModule, Node: "two", Module: "hosts", Holds: []Seat{seat}, PasswordHash: "x"})
|
|
has(t, one.Subscribe, "mesh.seat.node-hosts-file.tool.entries.one")
|
|
has(t, two.Subscribe, "mesh.seat.node-hosts-file.tool.entries.two")
|
|
hasNot(t, one.Subscribe, "mesh.seat.node-hosts-file.tool.entries")
|
|
hasNot(t, one.Subscribe, "mesh.seat.node-hosts-file.tool.entries.two")
|
|
|
|
user, _ := PermissionsFor(Principal{Kind: KindModule, Node: "three", Module: "asker", Uses: []Seat{seat}, PasswordHash: "x"})
|
|
has(t, user.Publish, "mesh.seat.node-hosts-file.tool.entries.*")
|
|
}
|
|
|
|
// A mesh-scoped seat's tool stays flat: nothing about it changes.
|
|
func TestAMeshSeatsToolIsAddressedToTheSeatAlone(t *testing.T) {
|
|
seat := Seat{Name: "git", Scope: "mesh", Serves: []string{"list_repos"}}
|
|
holder, _ := PermissionsFor(Principal{Kind: KindModule, Node: "one", Module: "gitea", Holds: []Seat{seat}, PasswordHash: "x"})
|
|
has(t, holder.Subscribe, "mesh.seat.git.tool.list_repos")
|
|
user, _ := PermissionsFor(Principal{Kind: KindModule, Node: "two", Module: "asker", Uses: []Seat{seat}, PasswordHash: "x"})
|
|
has(t, user.Publish, "mesh.seat.git.tool.list_repos")
|
|
}
|
|
|
|
// The controller serves its own seat's verbs and may answer them (novox/hq ADR 0154).
|
|
func TestTheControllerServesItsSeatsToolsAndMayAnswer(t *testing.T) {
|
|
perms, err := PermissionsFor(Principal{Kind: KindController, PasswordHash: "x"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
has(t, perms.Subscribe, "mesh.seat.mesh-controller.tool.>")
|
|
if !perms.AllowResponses {
|
|
t.Fatal("the controller serves tools and may not answer one")
|
|
}
|
|
}
|
|
|
|
// A grant to every tool reaches a role's tools too, and a role's tool is granted by name.
|
|
func TestAGrantReachesARolesTools(t *testing.T) {
|
|
all, _ := PermissionsFor(Principal{Kind: KindModule, Node: "desk", Module: "mesh-console", Invokes: []string{"*"}, PasswordHash: "x"})
|
|
has(t, all.Publish, "mesh.seat.*.tool.>")
|
|
|
|
one, err := PermissionsFor(Principal{Kind: KindPerson, Module: "jo", Invokes: []string{"seat:mesh-controller.status"}, PasswordHash: "x"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
has(t, one.Publish, "mesh.seat.mesh-controller.tool.status")
|
|
hasNot(t, one.Publish, "mesh.seat.mesh-controller.tool.push")
|
|
hasNot(t, one.Publish, "mesh.mod.*.tool.>")
|
|
|
|
if _, err := PermissionsFor(Principal{Kind: KindPerson, Module: "jo", Invokes: []string{"seat:mesh-controller"}, PasswordHash: "x"}); err == nil {
|
|
t.Fatal("a role grant naming no verb was accepted")
|
|
}
|
|
}
|