One name per thing, per the HQ glossary: the module/container/image/binary/repo becomes mesh-controller, the seat the-controller, and the store+broker pair the foundation (embedded base bundles, default template and example lock renamed with their go:embed directives). No behaviour change — a pure vocabulary rename. Claude-Session: https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
70 lines
2.4 KiB
Go
70 lines
2.4 KiB
Go
// Package examples checks the bundles shipped in this directory.
|
|
//
|
|
// **Nothing checked them before.** `foundation-first-node.lock` is what a machine becomes when
|
|
// there is no mesh to ask — the one declaration applied with nothing to verify it against — and
|
|
// it was edited by hand and read by nobody but a running host.
|
|
package examples
|
|
|
|
import (
|
|
"os"
|
|
"sort"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-host/internal/declaration"
|
|
)
|
|
|
|
func bundle(t *testing.T) *declaration.Declaration {
|
|
t.Helper()
|
|
raw, err := os.ReadFile("foundation-first-node.lock")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
d, err := declaration.ParseFileTrusted(raw)
|
|
if err != nil {
|
|
t.Fatalf("the bundle a first node applies does not parse: %v", err)
|
|
}
|
|
return d
|
|
}
|
|
|
|
// Defends novox/hq ADR 0028: the foundation supplies the control plane and nothing else.
|
|
//
|
|
// The object store was foundation for months on the strength of "it cannot grant itself a bucket",
|
|
// which answers half the test. The control plane never needed one, and nothing noticed because
|
|
// nothing counted what the bundle holds.
|
|
func TestTheBundleCarriesTheFoundationAndTheControlPlaneAndNothingElse(t *testing.T) {
|
|
var images []string
|
|
for _, r := range bundle(t).Resources {
|
|
c, ok := r.(*declaration.Container)
|
|
if !ok {
|
|
continue
|
|
}
|
|
// The registry the images come from is the lab's, and is not what this asserts.
|
|
name := c.Image
|
|
if i := strings.LastIndex(name, "/"); i >= 0 {
|
|
name = name[i+1:]
|
|
}
|
|
images = append(images, strings.SplitN(name, "@", 2)[0])
|
|
}
|
|
sort.Strings(images)
|
|
|
|
want := []string{"lavinmq", "mesh-controller", "postgres"}
|
|
if strings.Join(images, ",") != strings.Join(want, ",") {
|
|
t.Fatalf("the bundle carries %v; expected exactly %v.\n\n"+
|
|
"Adding one is a change to what every first node becomes, and to ADR 0006's "+
|
|
"membership — take it deliberately, not by editing a lock file.", images, want)
|
|
}
|
|
}
|
|
|
|
// The control plane is in the bundle, and the design overlooked it once by reasoning about
|
|
// foundation services rather than counting containers (novox/hq 03-DESIGN/01-to-be/07).
|
|
func TestTheControlPlaneIsCarriedToo(t *testing.T) {
|
|
for _, r := range bundle(t).Resources {
|
|
if c, ok := r.(*declaration.Container); ok && strings.Contains(c.Image, "mesh-controller") {
|
|
return
|
|
}
|
|
}
|
|
t.Fatal("nothing in the bundle starts the control plane, so the machine would raise a " +
|
|
"foundation and stop")
|
|
}
|