From fb2f5a29625a5ca3104c2fddf5474f27d567fc38 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 19:16:09 +0100 Subject: [PATCH 1/8] =?UTF-8?q?The=20controller=20answers=20each=20node's?= =?UTF-8?q?=20placement=20from=20its=20own=20store,=20read-only,=20for=20t?= =?UTF-8?q?he=20seed=20of=20the=20catalogue's=20placement=20files:=20the?= =?UTF-8?q?=20one=20verb=20of=20its=20exit=20(issue=201126,=20ADR=200555?= =?UTF-8?q?=20=C2=A76;=20the=20operator=202026-10-26=2019:06:40)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/mesh-controller/nodes.go | 7 +- cmd/mesh-controller/placement_export.go | 50 +++++++++++++++ .../placement_export_integration_test.go | 64 +++++++++++++++++++ cmd/mesh-controller/seatverbs.go | 9 ++- go.mod | 2 +- go.sum | 4 ++ module.json | 1 + testdata/beside/CAPTURED | 2 +- 8 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 cmd/mesh-controller/placement_export.go create mode 100644 cmd/mesh-controller/placement_export_integration_test.go diff --git a/cmd/mesh-controller/nodes.go b/cmd/mesh-controller/nodes.go index f1ae066f..cfd0aeb0 100644 --- a/cmd/mesh-controller/nodes.go +++ b/cmd/mesh-controller/nodes.go @@ -133,9 +133,14 @@ func nodeCommand(ctx context.Context, args []string) error { // refuse (novox/hq issue 358). Read-only on the node and here, so a verb may run it too. return nodeJudgeDirectories(ctx, open, args[1:]) + case "placement-export": + // Each node's placement as the catalogue's placement file says it (novox/hq ADR 0555 §6): read-only, so a verb + // may run it. + return placementExport(ctx, open, args[1:]) + default: return fmt.Errorf("node has no %q; it has add, list, show, public-domain, account, agent-account, hand-over, "+ - "setuid-search and judge-directories", args[0]) + "setuid-search, judge-directories and placement-export", args[0]) } } diff --git a/cmd/mesh-controller/placement_export.go b/cmd/mesh-controller/placement_export.go new file mode 100644 index 00000000..0f5a7e7e --- /dev/null +++ b/cmd/mesh-controller/placement_export.go @@ -0,0 +1,50 @@ +package main + +import ( + "context" + "errors" + "sort" + + "git.novox.be/novox/mesh-sdk/go/compose/frombus" + "git.novox.be/novox/mesh-sdk/go/delivery" +) + +// placementExport prints each node's placement as the catalogue's placement file says it (novox/hq ADR 0555 §6, issue +// 1126): what a person decided of the node and where its modules run, read by this controller's own code from its own +// store, as JSON keyed by node. The one verb the controller gains for its exit (the operator, 2026-10-26 19:06:40, ADR +// 0547 §1's one exception besides §5's grant): read once by the seed of the placement files, whose pull request merges +// only when its composition check composes every node equal to what it runs. It reads the same Input every composition +// of this controller reads (readMeshAndNodes, readSettings) and writes nothing. +// +// It moves a piece of the research "The controller, NATS-native": the controller's last node data (node rows, placement, +// ports, pins, bindings, config placement) leaves it for the catalogue, before its exit at ADR 0547's third milestone. +func placementExport(ctx context.Context, open *stores, args []string) error { + if len(args) > 1 { + return errors.New("node placement-export []") + } + in, _, err := readMeshAndNodes(ctx, open) + if err != nil { + return err + } + if _, err := readSettings(ctx, open, &in); err != nil { + return err + } + var names []string + if len(args) == 1 { + names = []string{args[0]} + } else { + for _, n := range in.Nodes { + names = append(names, n.Name) + } + sort.Strings(names) + } + out := make(map[string]delivery.Placement, len(names)) + for _, name := range names { + p, err := frombus.Export(in, name) + if err != nil { + return err + } + out[name] = p + } + return printJSON(out) +} diff --git a/cmd/mesh-controller/placement_export_integration_test.go b/cmd/mesh-controller/placement_export_integration_test.go new file mode 100644 index 00000000..6eeaf8ca --- /dev/null +++ b/cmd/mesh-controller/placement_export_integration_test.go @@ -0,0 +1,64 @@ +//go:build integration + +package main + +import ( + "encoding/json" + "strings" + "testing" + + "git.novox.be/novox/mesh-sdk/go/compose/frombus" + sdkdelivery "git.novox.be/novox/mesh-sdk/go/delivery" + "git.novox.be/novox/mesh-sdk/go/overlay" +) + +// Issue 1126 (novox/hq ADR 0555 §6, the operator's one export verb of 2026-10-26 19:06:40): `node placement-export` +// answers, from the real store, each node's placement as the catalogue's placement file says it: what a person decided +// of the node (its endpoint, site, hub and address on the private network) and its modules in the order the composition +// reads them, exactly frombus.Export of the input this controller composes from; one node when named; a node the store +// lacks is refused. +func TestThePlacementExportIsEachNodesPlacementFromTheStore(t *testing.T) { + open := aMesh(t) + ctx := t.Context() + in, _, err := readMeshAndNodes(ctx, open) + if err != nil { + t.Fatal(err) + } + if _, err := readSettings(ctx, open, &in); err != nil { + t.Fatal(err) + } + var all map[string]sdkdelivery.Placement + if err := json.Unmarshal([]byte(stdoutOf(t, func() error { return placementExport(ctx, open, nil) })), &all); err != nil { + t.Fatal(err) + } + if len(all) != 2 { + t.Fatalf("exported %d nodes, want anchor and laptop", len(all)) + } + for i, name := range []string{"anchor", "laptop"} { + got := all[name] + d := got.Decided + if d.Endpoint != name+".example:51820" || d.Site != "here" || d.Hub != (name == "anchor") || d.Address != []string{"10.77.0.1", "10.77.0.2"}[i] { + t.Errorf("%s's decided facts are %+v", name, d) + } + if a := got.Assigned(); len(a) == 0 || !strings.Contains(strings.Join(a, ","), overlay.Name) { + t.Errorf("%s's modules are %v, want the private network among them", name, a) + } + want, err := frombus.Export(in, name) + if err != nil { + t.Fatal(err) + } + if !sdkdelivery.SamePlacement(got, want) { + t.Errorf("%s's export differs from frombus.Export of the controller's own input:\n%+v\n%+v", name, got, want) + } + } + var one map[string]sdkdelivery.Placement + if err := json.Unmarshal([]byte(stdoutOf(t, func() error { return placementExport(ctx, open, []string{"laptop"}) })), &one); err != nil { + t.Fatal(err) + } + if _, ok := one["laptop"]; !ok || len(one) != 1 { + t.Errorf("one node named exported %v", one) + } + if err := placementExport(ctx, open, []string{"stranger"}); err == nil { + t.Error("a node the store lacks was exported") + } +} diff --git a/cmd/mesh-controller/seatverbs.go b/cmd/mesh-controller/seatverbs.go index ae2e4643..819f528a 100644 --- a/cmd/mesh-controller/seatverbs.go +++ b/cmd/mesh-controller/seatverbs.go @@ -349,6 +349,11 @@ func (a *verbArguments) commandLine() ([]string, error) { return nil, err } return []string{"node", "judge-directories", str("node")}, nil + case "placement-export": + if node := str("node"); node != "" { + return []string{"node", "placement-export", node}, nil + } + return []string{"node", "placement-export"}, nil case "modules": return []string{"module", "list", "--json"}, nil case "seats": @@ -1400,7 +1405,9 @@ func seatAnnouncement(handlers map[string]link.ToolHandler) micro.Info { // nodeReads are the `node` subcommands a verb may run: the ones that only read. var nodeReads = map[string]bool{"list": true, "show": true, // Read-only on the node too: the engine judges its directories and changes nothing (novox/hq issue 358). - "judge-directories": true} + "judge-directories": true, + // Each node's placement as the catalogue's placement file says it, read from the store (novox/hq ADR 0555 §6). + "placement-export": true} // flagsOnly says a command line's rest names no subcommand: empty, or beginning with a flag. For a command // with no subcommands every word is a flag, its value or a name it reads. diff --git a/go.mod b/go.mod index 5b8386cc..4dbc7018 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026144731-a7a1fbd34e1d + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453 github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index 1b598142..22d258ad 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,10 @@ git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5 h1:E5stfIeCN6uYg git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5/go.mod h1:4wyoCr6IIIIarEUuROThWDj7DAvJvIidqMjWcpSnOwE= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026144731-a7a1fbd34e1d h1:saIO27B0lDKx2VCS9om2RWQdB9epRDCUigGps5J3Miw= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026144731-a7a1fbd34e1d/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181134-dfe3ba94750c h1:oqeliEkDtJRSNnNYRGk+Umc5WMdOHDzbjeQSRR2cCpA= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181134-dfe3ba94750c/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453 h1:TemVEm3xcXHA1OWzrO0+cnuWsUpDUsnNE7yIlMaxMBA= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/module.json b/module.json index eb6ee64c..2fce1341 100644 --- a/module.json +++ b/module.json @@ -82,6 +82,7 @@ "dead-letters", "root-free", "judge-directories", + "placement-export", "data", "build", "artifacts", diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index 814716c5..de8d762b 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog 3a1017f5594217092a654dd1e2d72226766bc16a modules/*/module.json, modules/*/files, modules/*/templates, predefined.json mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk a7a1fbd34e1d858df6e483580bdb4910fffa8b8c conformance/events/module-event.json +mesh-sdk 4d5f43022453e68940d505c7ed3c82e7c7c6a955 conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: -- 2.54.0 From 89f52a65040a4400eae90460ff741ba33dc27ccf Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 19:28:39 +0100 Subject: [PATCH 2/8] Pin mesh-sdk 53c2def, the group's head, and take the SDK's conformance copy again at it (issue 1126) --- go.mod | 2 +- go.sum | 2 ++ testdata/beside/CAPTURED | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 4dbc7018..96965479 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520 github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index 22d258ad..585f561e 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181134-dfe3ba94750c h1:oqeliEkD git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181134-dfe3ba94750c/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453 h1:TemVEm3xcXHA1OWzrO0+cnuWsUpDUsnNE7yIlMaxMBA= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520 h1:twiziR88X6ttKmw5JTd3aW6xb5bMZZ3Bl7WS2QOP3PE= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index de8d762b..4f372055 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog 3a1017f5594217092a654dd1e2d72226766bc16a modules/*/module.json, modules/*/files, modules/*/templates, predefined.json mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk 4d5f43022453e68940d505c7ed3c82e7c7c6a955 conformance/events/module-event.json +mesh-sdk 53c2def1a5200792ccbc9b660172cc198fb0764c conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: -- 2.54.0 From 7c8a2e03dd8ef41e10df31bea22dd2d4c2b07ca1 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 19:40:43 +0100 Subject: [PATCH 3/8] Pin mesh-sdk feat/1126-nodes-compose 9713c30: placement carries a settings-form module's values (issue 1126) --- go.mod | 2 +- go.sum | 2 ++ testdata/beside/CAPTURED | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 96965479..c26328a8 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18 github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index 585f561e..44b3af98 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453 h1:TemVEm3x git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520 h1:twiziR88X6ttKmw5JTd3aW6xb5bMZZ3Bl7WS2QOP3PE= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18 h1:HWNPfnT9YT9O6xHPLy2y6Q+LYT8XRjvLnZw9O61NETk= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index 4f372055..949b5d6c 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog 3a1017f5594217092a654dd1e2d72226766bc16a modules/*/module.json, modules/*/files, modules/*/templates, predefined.json mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk 53c2def1a5200792ccbc9b660172cc198fb0764c conformance/events/module-event.json +mesh-sdk 9713c3023a18b211499d90a077fe8e677f968d86 conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: -- 2.54.0 From 4e9e5c27d4fd1d528a786e41f13ba19f914c3390 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 20:12:49 +0100 Subject: [PATCH 4/8] Review of L2: the export's test reads each printed placement back as the file the seed writes, at its version (S1); pin mesh-sdk 3968849, CAPTURED taken again (issue 1126) --- cmd/mesh-controller/placement_export_integration_test.go | 6 ++++++ go.mod | 2 +- go.sum | 2 ++ testdata/beside/CAPTURED | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cmd/mesh-controller/placement_export_integration_test.go b/cmd/mesh-controller/placement_export_integration_test.go index 6eeaf8ca..197e1d0b 100644 --- a/cmd/mesh-controller/placement_export_integration_test.go +++ b/cmd/mesh-controller/placement_export_integration_test.go @@ -43,6 +43,12 @@ func TestThePlacementExportIsEachNodesPlacementFromTheStore(t *testing.T) { if a := got.Assigned(); len(a) == 0 || !strings.Contains(strings.Join(a, ","), overlay.Name) { t.Errorf("%s's modules are %v, want the private network among them", name, a) } + // What it prints is the file the seed writes: at the placement file's version, read back by its reader. + if raw, _ := json.Marshal(got); got.V != sdkdelivery.Version { + t.Errorf("%s is exported at version %d: %s", name, got.V, raw) + } else if _, err := sdkdelivery.DecodePlacement(raw); err != nil { + t.Errorf("%s's export does not read as a placement file: %v", name, err) + } want, err := frombus.Export(in, name) if err != nil { t.Fatal(err) diff --git a/go.mod b/go.mod index c26328a8..51113d49 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026190832-3968849b1b36 github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index 44b3af98..f22bc6cb 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520 h1:twiziR88 git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18 h1:HWNPfnT9YT9O6xHPLy2y6Q+LYT8XRjvLnZw9O61NETk= git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026190832-3968849b1b36 h1:aBkmFUq/zAVdR3PzfgjjC9AxSymNl3eVC7UEZv9tZ0Q= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026190832-3968849b1b36/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index 949b5d6c..f341c71a 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog 3a1017f5594217092a654dd1e2d72226766bc16a modules/*/module.json, modules/*/files, modules/*/templates, predefined.json mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk 9713c3023a18b211499d90a077fe8e677f968d86 conformance/events/module-event.json +mesh-sdk 3968849b1b36a1823628c8324c042ed50d8d3e75 conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: -- 2.54.0 From 9d8a5a7ede9061251378294029235c3239564ff6 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 20:23:51 +0100 Subject: [PATCH 5/8] Review of L2, round 2: the placement export is checked within an existing integration test over the same fresh mesh, so it adds no test of its own (the test budget; issue 1126) --- cmd/mesh-controller/addresses_integration_test.go | 2 ++ cmd/mesh-controller/placement_export_integration_test.go | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/mesh-controller/addresses_integration_test.go b/cmd/mesh-controller/addresses_integration_test.go index 1420e0f6..e2143496 100644 --- a/cmd/mesh-controller/addresses_integration_test.go +++ b/cmd/mesh-controller/addresses_integration_test.go @@ -78,6 +78,8 @@ func TestTheRegistryTrustAndEveryImageFollowThePortTheNodeGaveTheStore(t *testin func TestTheControlPlaneIsToldWhereTheNodePutTheStoreAndTheBroker(t *testing.T) { open := aMesh(t) + // Issue 1126: the placement export over this fresh mesh, before anything below changes it. + placementExportIsEachNodesPlacementFromTheStore(t, open) ctx := t.Context() raw, err := os.ReadFile("../../module.json") if err != nil { diff --git a/cmd/mesh-controller/placement_export_integration_test.go b/cmd/mesh-controller/placement_export_integration_test.go index 197e1d0b..35eb57e0 100644 --- a/cmd/mesh-controller/placement_export_integration_test.go +++ b/cmd/mesh-controller/placement_export_integration_test.go @@ -16,9 +16,10 @@ import ( // answers, from the real store, each node's placement as the catalogue's placement file says it: what a person decided // of the node (its endpoint, site, hub and address on the private network) and its modules in the order the composition // reads them, exactly frombus.Export of the input this controller composes from; one node when named; a node the store -// lacks is refused. -func TestThePlacementExportIsEachNodesPlacementFromTheStore(t *testing.T) { - open := aMesh(t) +// lacks is refused. Checked within TestTheControlPlaneIsToldWhereTheNodePutTheStoreAndTheBroker, over the same fresh +// mesh, so the export adds no integration test of its own (the test budget). +func placementExportIsEachNodesPlacementFromTheStore(t *testing.T, open *stores) { + t.Helper() ctx := t.Context() in, _, err := readMeshAndNodes(ctx, open) if err != nil { -- 2.54.0 From fd891688acdfb65d3b17f252af96e6548f9451d5 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 20:35:49 +0100 Subject: [PATCH 6/8] Pin mesh-sdk feat/1126-nodes-compose 03dce12, the group's head: the checker refuses a pin that is neither trunk nor the group's head (issue 1126) --- go.mod | 2 +- go.sum | 14 ++------------ testdata/beside/CAPTURED | 2 +- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 51113d49..11fb1553 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026190832-3968849b1b36 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026193323-03dce1237803 github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index f22bc6cb..f4b97b67 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,7 @@ git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5 h1:E5stfIeCN6uYgA9TCv+4K8JgaURg3zQppvUgJLaDMP4= git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5/go.mod h1:4wyoCr6IIIIarEUuROThWDj7DAvJvIidqMjWcpSnOwE= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026144731-a7a1fbd34e1d h1:saIO27B0lDKx2VCS9om2RWQdB9epRDCUigGps5J3Miw= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026144731-a7a1fbd34e1d/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181134-dfe3ba94750c h1:oqeliEkDtJRSNnNYRGk+Umc5WMdOHDzbjeQSRR2cCpA= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181134-dfe3ba94750c/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453 h1:TemVEm3xcXHA1OWzrO0+cnuWsUpDUsnNE7yIlMaxMBA= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026181356-4d5f43022453/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520 h1:twiziR88X6ttKmw5JTd3aW6xb5bMZZ3Bl7WS2QOP3PE= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026182519-53c2def1a520/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18 h1:HWNPfnT9YT9O6xHPLy2y6Q+LYT8XRjvLnZw9O61NETk= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026183837-9713c3023a18/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026190832-3968849b1b36 h1:aBkmFUq/zAVdR3PzfgjjC9AxSymNl3eVC7UEZv9tZ0Q= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026190832-3968849b1b36/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026193323-03dce1237803 h1:RInAboHBk5THYf6Agvy05iO9p2XV5zGb0ilYa+iSO7o= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026193323-03dce1237803/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index f341c71a..35416aa1 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog 3a1017f5594217092a654dd1e2d72226766bc16a modules/*/module.json, modules/*/files, modules/*/templates, predefined.json mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk 3968849b1b36a1823628c8324c042ed50d8d3e75 conformance/events/module-event.json +mesh-sdk 03dce1237803e1640e7d6679089b3fecb84b5d6c conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: -- 2.54.0 From dc414fbfef080d6aeff2e26803ec1b0abb7fe213 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 21:59:21 +0100 Subject: [PATCH 7/8] Pin mesh-sdk 5f45175 (l2-next: feat/1126-nodes-compose merged with sdk main) after merging main (issue 1126) --- go.mod | 2 +- go.sum | 4 ++-- testdata/beside/CAPTURED | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 11fb1553..271405f8 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026193323-03dce1237803 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026205647-5f45175ed02b github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index f4b97b67..94cf740c 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5 h1:E5stfIeCN6uYgA9TCv+4K8JgaURg3zQppvUgJLaDMP4= git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5/go.mod h1:4wyoCr6IIIIarEUuROThWDj7DAvJvIidqMjWcpSnOwE= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026193323-03dce1237803 h1:RInAboHBk5THYf6Agvy05iO9p2XV5zGb0ilYa+iSO7o= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026193323-03dce1237803/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026205647-5f45175ed02b h1:6iRVEZi6HUi9r2pFPz8aMLJy6FPdnyTOZ79/a7eSbNI= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026205647-5f45175ed02b/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index 35416aa1..41da9a01 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog 3a1017f5594217092a654dd1e2d72226766bc16a modules/*/module.json, modules/*/files, modules/*/templates, predefined.json mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk 03dce1237803e1640e7d6679089b3fecb84b5d6c conformance/events/module-event.json +mesh-sdk 5f45175ed02b88652c4583ef84fa841a3d4997f4 conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: -- 2.54.0 From df8ebf6a77c161b5362c5feb36aaa8749f8f1b85 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 22:05:41 +0100 Subject: [PATCH 8/8] Pin mesh-sdk 9796444 (l2-next: feat/1126-nodes-compose merged with sdk main #101, the standing-test race fixes) (issue 1126) --- go.mod | 2 +- go.sum | 4 ++-- testdata/beside/CAPTURED | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 271405f8..c655ea69 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/novox/mesh-controller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026205647-5f45175ed02b + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026210326-979644420117 github.com/jackc/pgx/v5 v5.10.0 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/go.sum b/go.sum index 94cf740c..265a697a 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5 h1:E5stfIeCN6uYgA9TCv+4K8JgaURg3zQppvUgJLaDMP4= git.novox.be/novox/mesh-host v0.0.0-20261018171808-9d9e3a46c4f5/go.mod h1:4wyoCr6IIIIarEUuROThWDj7DAvJvIidqMjWcpSnOwE= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026205647-5f45175ed02b h1:6iRVEZi6HUi9r2pFPz8aMLJy6FPdnyTOZ79/a7eSbNI= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026205647-5f45175ed02b/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026210326-979644420117 h1:88CNZOoQgu7YPYKW16qkWT8Gw9Ucg07aTrIImA2nYUk= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261026210326-979644420117/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/testdata/beside/CAPTURED b/testdata/beside/CAPTURED index 41da9a01..d9d8f55a 100644 --- a/testdata/beside/CAPTURED +++ b/testdata/beside/CAPTURED @@ -9,7 +9,7 @@ a second place to clean besides the catalogue itself. mesh-catalog 3a1017f5594217092a654dd1e2d72226766bc16a modules/*/module.json, modules/*/files, modules/*/templates, predefined.json mesh-host 9d9e3a46c4f5943cfffb413d962ce48b75e2fd39 examples/foundation-first-node.lock -mesh-sdk 5f45175ed02b88652c4583ef84fa841a3d4997f4 conformance/events/module-event.json +mesh-sdk 979644420117d8d48c7228fc06a51a92a1dc5279 conformance/events/module-event.json To move them, from this repository's root, with the two repositories checked out beside it: -- 2.54.0