diff --git a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/catalog.go b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/catalog.go index 62df17fb..7248b5ab 100644 --- a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/catalog.go +++ b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/catalog.go @@ -4,7 +4,6 @@ import ( "fmt" stdio "git.novox.be/novox/mesh-sdk/go" - "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/delivery" "git.novox.be/novox/mesh-delivery/sdk/graph" @@ -12,30 +11,6 @@ import ( "mesh-delivery-indexer/internal/index" ) -// CatalogTools are the seat mesh-catalog's four verbs as tools named ., with the descriptions and inputs the -// seat's contract gives them (novox/hq ADR 0604 §1, §2), answered from the indexer's own states. They are served once the -// indexer's manifest claims the seat, in the release after L3's (the lead's decision): until then main serves them not. -func CatalogTools(c index.CatalogRead) []stdio.Tool { - seat, ok := catalogue.SeatNamed(catalogue.CatalogSeat) - if !ok { - return nil - } - str := func(args map[string]any, k string) string { s, _ := args[k].(string); return s } - runs := map[string]func(map[string]any) (any, error){ - "modules": func(map[string]any) (any, error) { return c.CatalogModulesAnswer() }, - "module": func(a map[string]any) (any, error) { return c.CatalogModuleAnswer(str(a, "module")) }, - "provides": func(a map[string]any) (any, error) { return c.CatalogProvidesAnswer(str(a, "provision")) }, - "dependents": func(a map[string]any) (any, error) { return c.CatalogDependentsAnswer(str(a, "module")) }, - } - var out []stdio.Tool - for _, v := range seat.Serves { - if run, ok := runs[v.Name]; ok { - out = append(out, stdio.Tool{Name: catalogue.CatalogSeat + "." + v.Name, Description: v.Description, Input: v.Input, Run: run}) - } - } - return out -} - // catalogRead reads the indexer's modules, manifests and graph states for the seat's verbs. func catalogRead(modules, manifests, nodes stdio.KeptState) index.CatalogRead { return index.CatalogRead{ @@ -97,7 +72,7 @@ func catalogRead(modules, manifests, nodes stdio.KeptState) index.CatalogRead { } } -// catalogTools are the seat's verbs over the indexer's own states, as main serves them once the indexer claims the seat. +// catalogTools are the seat's verbs over the indexer's own states, served beside the indexer's own tools, since the indexer's manifest claims the seat (ADR 0604 §2). func catalogTools() []stdio.Tool { - return CatalogTools(catalogRead(stdio.State("modules"), stdio.State("manifests"), stdio.State(graph.State))) + return index.CatalogTools(catalogRead(stdio.State("modules"), stdio.State("manifests"), stdio.State(graph.State))) } diff --git a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/main.go b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/main.go index cfc4ff71..d9cb1aa0 100644 --- a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/main.go +++ b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/main.go @@ -190,7 +190,7 @@ func heldCounts(s stdio.KeptState) func() (index.OldSectionsCount, error) { } func main() { - if err := stdio.Serve("", Tools(askTakeIn(stdio.State(index.TakeInsState), 25*time.Second), time.Now, stdio.State(index.VerdictsState), heldCounts(stdio.State(index.OldSectionsState)))); err != nil { + if err := stdio.Serve("", append(Tools(askTakeIn(stdio.State(index.TakeInsState), 25*time.Second), time.Now, stdio.State(index.VerdictsState), heldCounts(stdio.State(index.OldSectionsState))), catalogTools()...)); err != nil { fmt.Fprintf(os.Stderr, "[mesh-delivery-indexer-tools] %v\n", err) os.Exit(1) } diff --git a/modules/mesh-delivery-indexer/internal/index/catalog.go b/modules/mesh-delivery-indexer/internal/index/catalog.go index 33807d48..c9da450b 100644 --- a/modules/mesh-delivery-indexer/internal/index/catalog.go +++ b/modules/mesh-delivery-indexer/internal/index/catalog.go @@ -7,6 +7,7 @@ import ( "slices" "strings" + stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/delivery" @@ -147,3 +148,27 @@ func (c CatalogRead) graphAndModules() (graph.Graph, map[string]delivery.Module, } return g, mods, nil } + +// CatalogTools are the seat mesh-catalog's four verbs as tools named ., with the descriptions and inputs the +// seat's contract gives them (novox/hq ADR 0604 §1, §2), answered from the indexer's own states. They are served once the +// indexer's manifest claims the seat, in the release after L3's (the lead's decision): until then main serves them not. +func CatalogTools(c CatalogRead) []stdio.Tool { + seat, ok := catalogue.SeatNamed(catalogue.CatalogSeat) + if !ok { + return nil + } + str := func(args map[string]any, k string) string { s, _ := args[k].(string); return s } + runs := map[string]func(map[string]any) (any, error){ + "modules": func(map[string]any) (any, error) { return c.CatalogModulesAnswer() }, + "module": func(a map[string]any) (any, error) { return c.CatalogModuleAnswer(str(a, "module")) }, + "provides": func(a map[string]any) (any, error) { return c.CatalogProvidesAnswer(str(a, "provision")) }, + "dependents": func(a map[string]any) (any, error) { return c.CatalogDependentsAnswer(str(a, "module")) }, + } + var out []stdio.Tool + for _, v := range seat.Serves { + if run, ok := runs[v.Name]; ok { + out = append(out, stdio.Tool{Name: catalogue.CatalogSeat + "." + v.Name, Description: v.Description, Input: v.Input, Run: run}) + } + } + return out +} diff --git a/modules/mesh-delivery-indexer/internal/index/catalog_test.go b/modules/mesh-delivery-indexer/internal/index/catalog_test.go index 03c0b68c..dead2776 100644 --- a/modules/mesh-delivery-indexer/internal/index/catalog_test.go +++ b/modules/mesh-delivery-indexer/internal/index/catalog_test.go @@ -93,6 +93,19 @@ func catalogVerbsAnswerFromTheStates(t *testing.T) { } return true } + // The tools bundle serves the four verbs as mesh-catalog., answering from the same states. + var names []string + for _, tool := range CatalogTools(c) { + names = append(names, tool.Name) + if tool.Name == "mesh-catalog.modules" { + if got, err := tool.Run(nil); err != nil || !strings.Contains(string(answer(got, nil)), `"module":"avahi"`) { + t.Errorf("mesh-catalog.modules answered %v, %v", got, err) + } + } + } + if !slices.Equal(names, []string{"mesh-catalog.modules", "mesh-catalog.module", "mesh-catalog.provides", "mesh-catalog.dependents"}) { + t.Errorf("the tools bundle serves %v", names) + } raw := answer(c.CatalogModulesAnswer()) if got, want := keysAt(t, raw, "modules"), capturedKeys(t, "catalog_modules.json", "modules"); !contains(got, want) { t.Errorf("modules' fields %v, want the old catalog's %v", got, want) diff --git a/modules/mesh-delivery-indexer/judge/rules.go b/modules/mesh-delivery-indexer/judge/rules.go index b780e482..734c5730 100644 --- a/modules/mesh-delivery-indexer/judge/rules.go +++ b/modules/mesh-delivery-indexer/judge/rules.go @@ -10,7 +10,6 @@ import ( json "encoding/json" errors "errors" fmt "fmt" - toolrunner "git.novox.be/novox/mesh-delivery/sdk/toolrunner" catalogue "git.novox.be/novox/mesh-sdk/go/catalogue" math "math" net "net" @@ -137,7 +136,7 @@ func spokenSystems() string { // and was simply absent — seven modules' tools went missing that way on 2026-10-03. Refused here, // naming the field that would deliver it. func undeliveredBundles(m catalogue.Manifest) []string { - if m.Build == nil || toolrunner.Is(m) { + if m.Build == nil || catalogue.IsToolRunner(m) { return nil } named := runByAResource(m) @@ -3307,7 +3306,7 @@ func waitProblems(m catalogue.Manifest) []string { if len(m.Waits) == 0 { return nil } - if !toolrunner.Is(m) { + if !catalogue.IsToolRunner(m) { return []string{fmt.Sprintf("%s says what a session waits on; only the tool runner's module (it says "+ "\"tool-runner\": true) declares waits (novox/hq ADR 0367 §2)", m.Module)} } diff --git a/modules/mesh-delivery-indexer/judge/rules_test.go b/modules/mesh-delivery-indexer/judge/rules_test.go index 32d37b9c..5e3c4325 100644 --- a/modules/mesh-delivery-indexer/judge/rules_test.go +++ b/modules/mesh-delivery-indexer/judge/rules_test.go @@ -163,18 +163,11 @@ func TestABundleNothingDeliversIsRefused(t *testing.T) { t.Errorf("a bundle delivered by %s was refused: %v", name, p) } } - // The tool runner is what says it is one (issue 774), and, while node-tools' trunk manifest leaves `tool-runner` out - // for the running indexer, mesh-sdk's deprecated catalogue.RuntimeModule too (issue 1585 note 42): any other name alone - // exempts nothing. - kept := base() - kept.Module = catalogue.RuntimeModule - if p := undeliveredBundles(kept); len(p) != 0 { - t.Errorf("a bundle of the kept runtime module, which does not say it is the tool runner, was refused: %v", p) - } + // The tool runner is what says it is one (issue 774): its name alone exempts nothing. named := base() - named.Module = "agent-tools" + named.Module = "node-tools" if p := undeliveredBundles(named); len(p) != 1 { - t.Errorf("a bundle of a module that does not say it is the tool runner: %v", p) + t.Errorf("a bundle of a module named as the tool runner, which does not say it is one: %v", p) } } @@ -3122,7 +3115,7 @@ func TestAVerbWithAnUnknownKeyIsRefused(t *testing.T) { func TestAWaitIsRefusedUnlessItNamesOneFamilyOfTheToolRunner(t *testing.T) { for manifest, want := range map[string]string{ `{"module":"shop","version":"1","waits":["mesh-knowledge.reviewed"]}`: "only the tool runner's module", - `{"module":"agent-tools","version":"1","waits":["mesh-knowledge.reviewed"]}`: "only the tool runner's module", // its name says nothing (issue 774) + `{"module":"node-tools","version":"1","waits":["mesh-knowledge.reviewed"]}`: "only the tool runner's module", // its name says nothing (issue 774) `{"module":"node-tools","version":"1","tool-runner":true,"waits":["mesh-knowledge.*"]}`: "never a wildcard", `{"module":"node-tools","version":"1","tool-runner":true,"waits":["**"]}`: "never a wildcard", `{"module":"node-tools","version":"1","tool-runner":true,"waits":["mesh-knowledge.>"]}`: "never a wildcard", @@ -3141,11 +3134,6 @@ func TestAWaitIsRefusedUnlessItNamesOneFamilyOfTheToolRunner(t *testing.T) { t.Errorf("%s refused for the wrong reason (want %q): %v", manifest, want, err) } } - // mesh-sdk's deprecated catalogue.RuntimeModule waits without saying `tool-runner`, while node-tools' trunk manifest - // leaves the word out for the running indexer (issue 774, issue 1585 note 42). - if _, err := ParseManifest([]byte(`{"module":"` + catalogue.RuntimeModule + `","version":"1","waits":["mesh-knowledge.reviewed"]}`)); err != nil { - t.Errorf("the kept runtime module's waits were refused: %v", err) - } } // 1178/AC2: a work-queue stream is read by exactly one process of its module and by no other module's consumes: one diff --git a/modules/mesh-delivery-indexer/manifest_test.go b/modules/mesh-delivery-indexer/manifest_test.go index 7569b44c..4911041b 100644 --- a/modules/mesh-delivery-indexer/manifest_test.go +++ b/modules/mesh-delivery-indexer/manifest_test.go @@ -12,6 +12,7 @@ import ( "strings" "testing" + "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/delivery" "git.novox.be/novox/mesh-delivery/sdk/graph" @@ -38,9 +39,14 @@ type artifact struct { } type manifest struct { - Module string `json:"module"` - Version string `json:"version"` - Slug string `json:"slug"` + Module string `json:"module"` + Version string `json:"version"` + Slug string `json:"slug"` + Claims []struct { + Name string `json:"name"` + Scope string `json:"scope"` + Serves []string `json:"serves"` + } `json:"claims"` Tools []string `json:"tools"` Emits []string `json:"emits"` Consumes []string `json:"consumes"` @@ -122,8 +128,14 @@ func TestManifestDeclarations(t *testing.T) { // 1238/AC1, 1444 (reads the build if want := []string{"indexer_take_in", "indexer_old_sections", "indexer_verdicts", "indexer_judge"}; !reflect.DeepEqual(m.Tools, want) { t.Errorf("tools = %v, want %v", m.Tools, want) } - // No streams, no bus, no seat (ADR 0437 §4); it says no event. - for _, k := range []string{"streams", "logs", "claims", "provides", "requires", "uses", "defines-seats", "seat", "seats", "bus"} { + // ADR 0604 §2: it holds the seat mesh-catalog, serving its four verbs from its tools bundle (which stays without a + // request subject). + if len(m.Claims) != 1 || m.Claims[0].Name != catalogue.CatalogSeat || m.Claims[0].Scope != catalogue.ScopeMesh || + !slices.Equal(m.Claims[0].Serves, []string{"modules", "module", "provides", "dependents"}) { + t.Errorf("claims = %+v, want mesh-catalog with its four verbs", m.Claims) + } + // No streams, no bus, no other seat (ADR 0437 §4); it says no event. + for _, k := range []string{"streams", "logs", "provides", "requires", "uses", "defines-seats", "seat", "seats", "bus"} { if _, ok := top[k]; ok { t.Errorf("the manifest declares %q: the indexer has none", k) } diff --git a/modules/mesh-delivery-indexer/module.json b/modules/mesh-delivery-indexer/module.json index 11fac677..3fa9e8a7 100644 --- a/modules/mesh-delivery-indexer/module.json +++ b/modules/mesh-delivery-indexer/module.json @@ -2,6 +2,18 @@ "module": "mesh-delivery-indexer", "version": "1", "slug": "indexer", + "claims": [ + { + "name": "mesh-catalog", + "scope": "mesh", + "serves": [ + "modules", + "module", + "provides", + "dependents" + ] + } + ], "tools": [ "indexer_take_in", "indexer_old_sections", diff --git a/modules/mesh-grants/go.mod b/modules/mesh-grants/go.mod index bba38e07..a90cee61 100644 --- a/modules/mesh-grants/go.mod +++ b/modules/mesh-grants/go.mod @@ -20,7 +20,3 @@ require ( golang.org/x/sys v0.48.0 // indirect golang.org/x/time v0.15.0 // indirect ) - -require git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 - -replace git.novox.be/novox/mesh-delivery/sdk => ../../sdk diff --git a/modules/mesh-grants/grants_test.go b/modules/mesh-grants/grants_test.go index d639fee7..162596c9 100644 --- a/modules/mesh-grants/grants_test.go +++ b/modules/mesh-grants/grants_test.go @@ -2822,7 +2822,8 @@ func TestGrants(t *testing.T) { t.Errorf("%s: the kept user was not said: %+v", held.name, last) } } - // A held module that runs no build the part can read declares nothing to anyone: the list in force is kept, said. + // A held module that runs no build the part can read declares nothing to anyone: only its own users stay as the list in + // force holds them, said unreadable; the others move (ADR 0614 §8). delete(b.states[grants.ReadHave], "b.mod-r") b.put(grants.ReadModules, "mod-r", delivery.Module{V: delivery.Version, FP2: "src2:" + strings.Repeat("ab", 32), Manifest: delivery.ManifestDigest([]byte(ctl)), Repository: "novox/x", Commit: "c", Verdict: delivery.VerdictRefused, @@ -2831,8 +2832,14 @@ func TestGrants(t *testing.T) { wasList, _, _ := p.Sealed() res := p.Compose() nowList, _, _ := p.Sealed() - if nowList.Digest != wasList.Digest || res.Sealed == nil || !strings.Contains(res.Sealed.Why, "running manifest of mod-r") { - t.Errorf("a held module with no running manifest did not keep the list in force: %+v", res.Sealed) + if nowList.Digest == wasList.Digest || slices.ContainsFunc(res.Errors, func(e string) bool { return strings.Contains(e, "composed whole") }) { + t.Errorf("a module with no readable manifest held the whole list: %+v", res.Sealed) + } + if kept, _, ok, _ := b.ownGet(grants.StateUserList, grants.SealedUserKey(nowList.Digest, "b.mod-r.mod-r-tools")); !ok || string(kept) != string(before) { + t.Errorf("b.mod-r.mod-r-tools did not keep its grants of the list in force: %s", kept) + } + if last := said[len(said)-1]; last.State != asks.StateRaised || !strings.Contains(last.Summary, "the manifest of mod-r is unreadable") { + t.Errorf("the unreadable manifest was not said: %+v", last) } // Accepted again: the users compose from the manifest and the condition clears. b.manifestOf("mod-r", ctl) @@ -2842,38 +2849,27 @@ func TestGrants(t *testing.T) { // ADR 0601 §4: a tool runner whose manifest does not say so yet (an older build's) keeps its user as the list in force // holds it, known by what it runs (it says the runner is alive), and the held condition says so; never composed as a // plain module. - const runner = `{"module":"agent-runtime","version":"1","tool-runner":true,"own-secrets":{"broker":"/var/lib/nt/broker"}}` - b.manifestOf("agent-runtime", runner) - b.assign("a", "agent-runtime") - b.put(grants.ReadAccounts, "a.agent-runtime", map[string]any{"user": "a.agent-runtime", "hash": "$2a$10$first", "generation": 1, "fingerprint": "sha256:1"}) + const runner = `{"module":"node-tools","version":"1","tool-runner":true,"own-secrets":{"broker":"/var/lib/nt/broker"}}` + b.manifestOf("node-tools", runner) + b.assign("a", "node-tools") + b.put(grants.ReadAccounts, "a.node-tools", map[string]any{"user": "a.node-tools", "hash": "$2a$10$first", "generation": 1, "fingerprint": "sha256:1"}) p.Compose() inForce, _, _ = p.Sealed() - ran, _, ok, _ := b.ownGet(grants.StateUserList, grants.SealedUserKey(inForce.Digest, "a.agent-runtime")) + ran, _, ok, _ := b.ownGet(grants.StateUserList, grants.SealedUserKey(inForce.Digest, "a.node-tools")) if !ok || !strings.Contains(string(ran), "mesh.control.a.tools-alive") { t.Fatalf("the list in force holds no tool runner on a: %s", ran) } - b.manifestOf("agent-runtime", strings.Replace(runner, `"tool-runner":true,`, "", 1)) + b.manifestOf("node-tools", strings.Replace(runner, `"tool-runner":true,`, "", 1)) b.put(grants.ReadAccounts, "a.mod-x", map[string]any{"user": "a.mod-x", "hash": "$2a$10$gen10", "generation": 10, "fingerprint": "sha256:10"}) p.Compose() now, _, _ := p.Sealed() - kept, _, ok, _ := b.ownGet(grants.StateUserList, grants.SealedUserKey(now.Digest, "a.agent-runtime")) + kept, _, ok, _ := b.ownGet(grants.StateUserList, grants.SealedUserKey(now.Digest, "a.node-tools")) if !ok || string(kept) != string(ran) { t.Errorf("the tool runner of a was composed without what it runs: %s, was %s", kept, ran) } - if last := said[len(said)-1]; last.State != asks.StateRaised || !strings.Contains(last.Summary, "a.agent-runtime (stays in the list") { + if last := said[len(said)-1]; last.State != asks.StateRaised || !strings.Contains(last.Summary, "a.node-tools (stays in the list") { t.Errorf("the kept tool runner was not said: %+v", last) } - // While node-tools' trunk manifest leaves `tool-runner` out for the running indexer, mesh-sdk's deprecated - // catalogue.RuntimeModule is the tool runner without saying so (issue 774, issue 1585 note 42): composed as one. - b.manifestOf(catalogue.RuntimeModule, strings.Replace(strings.Replace(runner, `"tool-runner":true,`, "", 1), "agent-runtime", catalogue.RuntimeModule, 1)) - b.assign("c", catalogue.RuntimeModule) - b.put(grants.ReadAccounts, "c."+catalogue.RuntimeModule, map[string]any{"user": "c." + catalogue.RuntimeModule, "hash": "$2a$10$c", "generation": 1, "fingerprint": "sha256:c"}) - p.Compose() - now, _, _ = p.Sealed() - if composed, _, ok, _ := b.ownGet(grants.StateUserList, grants.SealedUserKey(now.Digest, "c."+catalogue.RuntimeModule)); !ok || - !strings.Contains(string(composed), "mesh.control.c.tools-alive") { - t.Errorf("the kept runtime module on c was not composed as the tool runner: %s", composed) - } }) } diff --git a/modules/mesh-grants/internal/grants/held.go b/modules/mesh-grants/internal/grants/held.go index 1a283593..d5177e59 100644 --- a/modules/mesh-grants/internal/grants/held.go +++ b/modules/mesh-grants/internal/grants/held.go @@ -47,9 +47,15 @@ func heldModuleUsers(in Inputs, candidates []string) map[string]string { continue } prefix := node + "." + module + // No manifest of the module can be read at all (the trunk's is refused and no running build's is found): named + // unreadable, in the condition and in grants_user_list (ADR 0614 §8). + state := "held" + if _, readable := in.Held[module]; !readable { + state = "unreadable" + } for _, user := range candidates { if user == prefix || strings.HasPrefix(user, prefix+".") { - out[user] = fmt.Sprintf("the manifest of %s is held: %s", module, why) + out[user] = fmt.Sprintf("the manifest of %s is %s: %s", module, state, why) } } } diff --git a/modules/mesh-grants/internal/grants/inputs.go b/modules/mesh-grants/internal/grants/inputs.go index 82b6a39c..839a8f86 100644 --- a/modules/mesh-grants/internal/grants/inputs.go +++ b/modules/mesh-grants/internal/grants/inputs.go @@ -446,8 +446,9 @@ func ReadInputs(r Reader, cache *Manifests) Inputs { } in.Held = heldManifests(r, in, cache) // A held module placed on a node whose running manifest is not found declares no seat, stream or object bucket to - // anyone: composing past it would drop the grants of those who use them, so the list in force is kept (ADR 0601 - // clause 3), and the gap says which module and why. + // anyone: composing past it would drop the grants of those who use them, so the users of that module alone stay as the + // list in force holds them (held.go, named unreadable; ADR 0614 §8, ADR 0601 clause 3). The gap says which module and why, + // and holds nothing else: it is not a failed read. for _, g := range in.Refused { module, ok := strings.CutPrefix(g.Input, "manifest of ") if _, found := in.Held[module]; !ok || found { @@ -455,8 +456,8 @@ func ReadInputs(r Reader, cache *Manifests) Inputs { } for _, assigned := range in.Assigned { if slices.Contains(assigned, module) { - in.Gaps = append(in.Gaps, Gap{Input: "running manifest of " + module, Failed: true, - Why: "its manifest is held and no running build's manifest is found, so the seats and streams it declares cannot be composed: the list in force is kept"}) + in.Gaps = append(in.Gaps, Gap{Input: "running manifest of " + module, + Why: "its manifest is unreadable (held, and no running build's manifest is found), so the seats and streams it declares cannot be composed: its users stay as the list in force holds them"}) break } } diff --git a/modules/mesh-grants/internal/grants/records.go b/modules/mesh-grants/internal/grants/records.go index 1213cb9e..c93bf116 100644 --- a/modules/mesh-grants/internal/grants/records.go +++ b/modules/mesh-grants/internal/grants/records.go @@ -6,7 +6,6 @@ import ( "slices" "strings" - "git.novox.be/novox/mesh-delivery/sdk/toolrunner" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/delivery" "mesh-grants/internal/buscompose" @@ -133,7 +132,7 @@ func declaredFor(m catalogue.Manifest, seats map[string]catalogue.SeatDeclaratio fromModules = append(fromModules, c) } d := buscompose.Declared{ - Module: m.Module, ToolRunner: toolrunner.Is(m), Emits: m.EmitsAll(), Consumes: fromModules, Watches: watches, Serves: m.Tools, + Module: m.Module, ToolRunner: catalogue.IsToolRunner(m), Emits: m.EmitsAll(), Consumes: fromModules, Watches: watches, Serves: m.Tools, Invokes: m.Invokes, Waits: waitsOf(m, seats), State: bucketsOf(m), Reads: m.Reads, Logs: logsOf(m), Streams: streamsOf(m), Queues: queueOwnersOf(m), Processes: processesOf(m), Checks: catalogue.HealthChecks(m), RunsAs: m.RunsAs, Issued: issuedTools(m), diff --git a/sdk/toolrunner/toolrunner.go b/sdk/toolrunner/toolrunner.go deleted file mode 100644 index b42c5f35..00000000 --- a/sdk/toolrunner/toolrunner.go +++ /dev/null @@ -1,16 +0,0 @@ -// Package toolrunner says whether a manifest is the node's tool runner, for the parts of mesh-delivery that judge or -// compose one (the indexer's judge, mesh-grants). -package toolrunner - -import "git.novox.be/novox/mesh-sdk/go/catalogue" - -// Is says whether a manifest is the node's tool runner: it says so (`tool-runner`, catalogue.IsToolRunner), or its module -// is mesh-sdk's deprecated catalogue.RuntimeModule. -// -// The second clause is kept only while node-tools' manifest on mesh-tools' trunk does not say `tool-runner`: the running -// indexer refuses that word, so node-tools' trunk manifest leaves it out until the indexer that knows it is delivered -// (issue 774, issue 1585 note 42). It goes, with this helper's use of catalogue.RuntimeModule, once `tool-runner` is -// back on node-tools' trunk manifest; then every caller asks catalogue.IsToolRunner alone. -func Is(m catalogue.Manifest) bool { - return catalogue.IsToolRunner(m) || m.Module == catalogue.RuntimeModule -}