Merge remote-tracking branch 'origin/main' into fix/delivery-records-true
# Conflicts: # modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/main.go # modules/mesh-delivery-indexer/go.mod # modules/mesh-delivery-indexer/go.sum # modules/mesh-delivery-indexer/manifest_test.go # modules/mesh-delivery-indexer/module.json # modules/mesh-delivery-view/cmd/mesh-delivery-view-tools/main.go # modules/mesh-delivery-view/go.mod # modules/mesh-delivery-view/go.sum # modules/mesh-delivery-view/internal/view/read.go # modules/mesh-delivery-view/manifest_test.go # modules/mesh-delivery-view/module.json
This commit is contained in:
@@ -62,6 +62,15 @@ func Tools(r view.Reader, u view.UsageReader) []stdio.Tool {
|
||||
mods, err := r.Modules(only)
|
||||
return map[string]any{"modules": mods}, err
|
||||
}},
|
||||
{Name: view.PlacementReadTool,
|
||||
Description: "Where modules run, as the indexer read it from the catalogue's placement files at the last merge (placement.<node>, novox/hq ADR 0549): " +
|
||||
"each node's modules in order with their host ports, bindings and settings placement, its pins and the seats its modules hold, and the catalogue revision. " +
|
||||
"With node, that node's; with module, every node placing it; with neither, every node's. Keys that do not read are listed as unreadable. Read-only.",
|
||||
Input: map[string]any{"type": "object", "properties": nodeModule},
|
||||
Run: func(args map[string]any) (any, error) {
|
||||
node, module := nodeModuleOf(args)
|
||||
return r.Placement(node, module)
|
||||
}},
|
||||
{Name: view.CandidateReadTool,
|
||||
Description: "What the indexer stored for one candidate (the open pull requests of a branch) under candidates.<group>, as stored: " +
|
||||
"the pull requests and heads, the base, and per pull request the touched modules with their new-form fingerprint (fp2) or why " +
|
||||
@@ -193,7 +202,8 @@ func read(state stdio.KeptState) view.StateRead {
|
||||
func main() {
|
||||
r := view.Reader{State: read(stdio.State("mesh-delivery-indexer.modules")), Builds: read(stdio.State("mesh-delivery-builder.builds")), CandidatesState: read(stdio.State("mesh-delivery-indexer.candidates")),
|
||||
WantsState: read(stdio.State("mesh-delivery-assigner.wants")), DifferencesState: read(stdio.State("mesh-delivery-assigner.differences")), HavesState: read(stdio.State("node-engine.have")),
|
||||
ReachState: read(stdio.State("mesh-delivery-view.reach"))}
|
||||
ReachState: read(stdio.State("mesh-delivery-view.reach")),
|
||||
PlacementState: read(stdio.State("mesh-delivery-indexer.placement"))}
|
||||
u := view.UsageReader{Haves: r.HavesState, Resolved: read(stdio.State("mesh-config.resolved")), Tries: read(stdio.State("mesh-delivery-checker.tries")),
|
||||
Steps: map[string]view.StateRead{}, Pauses: map[string]view.StateRead{}, Backlog: backlogOf(socket())}
|
||||
for _, lang := range delivery.AskLanguages {
|
||||
|
||||
@@ -105,6 +105,32 @@ func TestModulesToolAnswersEveryKeyAsStored(t *testing.T) {
|
||||
if len(only) != 1 || string(only["b"]) != withNone {
|
||||
t.Errorf("none2 modules = %v", only)
|
||||
}
|
||||
|
||||
// 1126 (ADR 0549 §2): indexer_placement answers a node's key as stored, every node placing a module, or every node's,
|
||||
// and lists a key that does not read.
|
||||
const ace, g14 = `{"v":1,"node":"ace","revision":"m1","modules":[{"module":"plex"}]}`, `{"v":1,"node":"g14","revision":"m1","modules":[{"module":"zsh"},{"module":"plex"}]}`
|
||||
p := view.Reader{PlacementState: fake{"placement.ace": ace, "placement.g14": g14, "placement.bad": `{"v":1}`, "other": "{}"}.reader().State}
|
||||
got := func(args map[string]any) map[string]json.RawMessage {
|
||||
t.Helper()
|
||||
out, err := run(t, p, view.PlacementReadTool, args)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return out.(map[string]any)["placement"].(map[string]json.RawMessage)
|
||||
}
|
||||
if one := got(map[string]any{"node": "ace"}); len(one) != 1 || string(one["ace"]) != ace {
|
||||
t.Errorf("node ace = %v", one)
|
||||
}
|
||||
if zsh := got(map[string]any{"module": "zsh"}); len(zsh) != 1 || string(zsh["g14"]) != g14 {
|
||||
t.Errorf("module zsh = %v", zsh)
|
||||
}
|
||||
out, err = run(t, p, view.PlacementReadTool, map[string]any{})
|
||||
if all := out.(map[string]any); err != nil || len(all["placement"].(map[string]json.RawMessage)) != 2 || len(all["unreadable"].([]string)) != 2 {
|
||||
t.Errorf("every node = %v, %v", all, err)
|
||||
}
|
||||
if _, err := run(t, p, view.PlacementReadTool, map[string]any{"node": "novox"}); err == nil || !strings.Contains(err.Error(), "no placement of novox") {
|
||||
t.Errorf("a node with no key: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
|
||||
Reference in New Issue
Block a user