No client names the holder of the seat mesh-provisioner: each reader keeps its own constant, held to its manifest (ADR 0625 section 4, issue 1966)

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
This commit is contained in:
2026-11-05 19:36:21 +01:00
parent d630635229
commit 625d627794
21 changed files with 186 additions and 29 deletions
@@ -23,7 +23,7 @@ func main() {
if node == "" {
say("MESH_NODE is not set; answering no consumers")
} else {
p := newProvider(node, provider.StateBus(ModuleName), say)
p := newProvider(node, provider.StateBus(ModuleName, provisionerModule), say)
go func() {
if err := p.Run(context.Background()); err != nil {
say("the provider helper stopped: %v", err)
@@ -35,3 +35,7 @@ func main() {
os.Exit(1)
}
}
// provisionerModule is the holder of the seat mesh-provisioner, named from this module's manifest (its `reads` of plans and
// provisions; TestTheProvisionerIsTheManifests).
const provisionerModule = "mesh-provisioner"
@@ -25,7 +25,7 @@ const ModuleName = "route-adapter"
func newProvider(node string, bus provider.Bus, logf func(string, ...any)) *provider.Provider {
return provider.New(provider.Options{
Node: node,
Module: ModuleName,
Module: ModuleName, Provisioner: provisionerModule,
Offers: map[string]provider.Offer{ProvisionName: {
Credential: provider.NoCredential,
Serves: map[string]any{},
@@ -51,7 +51,7 @@ func TestAConsumerOfARouteIsToldItsNamesFromItsPlanEntry(t *testing.T) {
"provider-module": ModuleName, "at": "10.7.0.1", "from": "novox", "as": "mesh_g14_gitea",
"names": map[string]any{"name": "git.example.org", "internal-name": "git.novox.internal",
"name-web": "git.example.org"}}}}})
if err := bus.Put(context.Background(), meshprovisionerclient.PlansBucket, "g14.gitea", plan); err != nil {
if err := bus.Put(context.Background(), meshprovisionerclient.PlansBucketOf(provisionerModule), "g14.gitea", plan); err != nil {
t.Fatal(err)
}
// The key the seat composed for the entry, asked of route-adapter (novox/hq ADR 0570 clauses 1, 3).
@@ -61,7 +61,7 @@ func TestAConsumerOfARouteIsToldItsNamesFromItsPlanEntry(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if err := bus.Put(context.Background(), meshprovisionerclient.ProvisionsBucket, key, asked); err != nil {
if err := bus.Put(context.Background(), meshprovisionerclient.ProvisionsBucketOf(provisionerModule), key, asked); err != nil {
t.Fatal(err)
}
p := newProvider("novox", bus, t.Logf)
@@ -0,0 +1,28 @@
package main
import (
"encoding/json"
"os"
"slices"
"testing"
)
// The module holding the seat mesh-provisioner, which this provider reads the plans and provisions of, is the one its manifest's
// `reads` name: no client names a holder (novox/hq ADR 0625 §4).
func TestTheProvisionerIsTheManifests(t *testing.T) {
raw, err := os.ReadFile("../../module.json")
if err != nil {
t.Fatal(err)
}
var m struct {
Reads []string `json:"reads"`
}
if err := json.Unmarshal(raw, &m); err != nil {
t.Fatal(err)
}
for _, state := range []string{"plans", "provisions"} {
if !slices.Contains(m.Reads, provisionerModule+"."+state) {
t.Errorf("the provider reads %s.%s, its manifest's reads are %v", provisionerModule, state, m.Reads)
}
}
}