The night's backup of the bus takes each stream through JetStream's snapshot API, run by the nats module under its own account. The module holding mesh-broker is composed that account: stream names and info, the snapshot request, its flow-control acks, its own inbox — no write, which the writers table checks. A bus module declaring anything else to say on the bus is refused by module check rather than silently granted nothing. The genesis user list is unchanged: the controller's grants are.
68 lines
2.5 KiB
Go
68 lines
2.5 KiB
Go
package catalogue
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// The module holding mesh-broker is the bus, and its account is granted the bus's snapshot API and
|
|
// nothing else (novox/hq ADR 0235). Anything it declared to say or hear on the bus would be granted
|
|
// nothing, so it is refused at the parser rather than silently dropped.
|
|
func TestTheBussAccountSaysNothingOnTheBus(t *testing.T) {
|
|
raw := []byte(`{"module":"bus","version":"1","provides":[{"name":"mesh-bus","scope":"mesh"}],
|
|
"claims":[{"name":"mesh-broker","scope":"mesh"}],"own-secrets":{"broker":"/run/broker"},
|
|
"emits":["something.happened"]}`)
|
|
_, err := ParseManifest(raw)
|
|
if err == nil || !strings.Contains(err.Error(), "granted the bus's snapshot API and nothing else") {
|
|
t.Fatalf("a bus module declaring what it emits was not refused, or not for the reason: %v", err)
|
|
}
|
|
|
|
quiet := []byte(`{"module":"bus","version":"1","provides":[{"name":"mesh-bus","scope":"mesh"}],
|
|
"claims":[{"name":"mesh-broker","scope":"mesh"}],"own-secrets":{"broker":"/run/broker"},
|
|
"tools":["bus_streams"]}`)
|
|
m, err := ParseManifest(quiet)
|
|
if err != nil {
|
|
t.Fatalf("a bus module with an account and tools was refused: %v", err)
|
|
}
|
|
if !m.ClaimsSeat(BrokerSeat) {
|
|
t.Fatal("it does not read as holding the broker seat")
|
|
}
|
|
}
|
|
|
|
// The catalogue's bus protects its streams by the snapshot, not as live files: its streams' item is a
|
|
// dump into its snapshots, it has the account the dump runs as, and the dump runs the snapshot
|
|
// program in the bus's own container.
|
|
func TestTheCataloguesBusIsBackedUpBySnapshot(t *testing.T) {
|
|
raw, err := os.ReadFile("../../../mesh-catalog/modules/nats/module.json")
|
|
if err != nil {
|
|
t.Skip("the catalogue is not checked out beside this repository")
|
|
}
|
|
m, err := ParseManifest(raw)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, account := m.OwnSecrets["broker"]; !account {
|
|
t.Fatal("the bus declares no account, so its snapshot could not reach it")
|
|
}
|
|
var found bool
|
|
if m.Data == nil {
|
|
t.Fatal("the bus declares no data")
|
|
}
|
|
for _, it := range m.Data.Own {
|
|
if it.ID != "jetstream" {
|
|
continue
|
|
}
|
|
found = true
|
|
if !it.Backup.IsDump() || it.Backup.Into != "snapshots" {
|
|
t.Fatalf("the bus's streams are protected by %+v, not a snapshot into its snapshots", it.Backup)
|
|
}
|
|
if !strings.Contains(it.Backup.Dump, "mesh-nats-snapshot snapshot") {
|
|
t.Fatalf("the dump does not run the snapshot program: %s", it.Backup.Dump)
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatal("the bus declares no item for its streams")
|
|
}
|
|
}
|