A plan is ordered by artifacts and says nothing about what must be running before what (ADR 0162); on 2026-10-03 that put the build machine in tier 0 and the controller in tier 1, and the new build machine could not bind the worker the old controller had defined. One running order enters the graph, named as its own edge: a module claiming the build seat follows the control plane, and the built-by edge from the control plane to that holder yields to it — the controller is built by whichever build machine is running, as the runtime image always was. The edge orders a plan and never widens it, like built-by.
46 lines
1.8 KiB
Go
46 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-controller/internal/inventory"
|
|
)
|
|
|
|
// The holder of the build seat follows the controller that defines its worker (novox/hq issue 206).
|
|
// On 2026-10-03 a plan put the build machine in tier 0 and the controller in tier 1; the new build
|
|
// machine could not bind the worker the old controller had defined, and nothing could build the
|
|
// controller that would have redefined it. The built-by edge from the controller to its build
|
|
// machine yields to that order: the controller is built by whichever build machine is running.
|
|
func TestTheBuildSeatsHolderFollowsTheControllerThatDefinesItsWorker(t *testing.T) {
|
|
edges := []inventory.Edge{
|
|
{From: "build-agent", To: "mesh-controller", Kind: inventory.EdgePackages},
|
|
{From: "build-agent", To: "mesh-controller", Kind: inventory.EdgeWorkerOf},
|
|
{From: "mesh-controller", To: "build-agent", Kind: inventory.EdgeBuiltBy},
|
|
{From: "route-proxy", To: "mesh-controller", Kind: inventory.EdgePackages},
|
|
{From: "route-proxy", To: "build-agent", Kind: inventory.EdgeBuiltBy},
|
|
}
|
|
set := reachableFrom([]string{"mesh-controller"}, edges)
|
|
if len(set) != 3 {
|
|
t.Fatalf("the controller, what packages it, and nothing more: %v", set)
|
|
}
|
|
tiers := tiersOf(set, edges)
|
|
pos := map[string]int{}
|
|
for i, tier := range tiers {
|
|
for _, m := range tier {
|
|
pos[m] = i
|
|
}
|
|
}
|
|
if pos["mesh-controller"] != 0 {
|
|
t.Fatalf("the controller first, built by the build machine that is running: %v", tiers)
|
|
}
|
|
if pos["build-agent"] <= pos["mesh-controller"] {
|
|
t.Fatalf("the build machine after the controller that defines its worker: %v", tiers)
|
|
}
|
|
if pos["route-proxy"] <= pos["build-agent"] {
|
|
t.Fatalf("what the build machine builds comes after it: %v", tiers)
|
|
}
|
|
if hasCycle(tiers, edges) {
|
|
t.Fatalf("no cycle here: %v", tiers)
|
|
}
|
|
}
|