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
79 lines
2.6 KiB
Go
79 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-controller/internal/inventory"
|
|
)
|
|
|
|
// placementOf is what the mesh holds about where one node is.
|
|
func placementOf(t *testing.T, ctx context.Context, inv *inventory.Inventory, name string) inventory.Overlay {
|
|
t.Helper()
|
|
placed, err := inv.Overlays(ctx)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, one := range placed {
|
|
if one.Name == name {
|
|
return one
|
|
}
|
|
}
|
|
t.Fatalf("%s is not placed at all", name)
|
|
return inventory.Overlay{}
|
|
}
|
|
|
|
// The sibling of `node public-domain`, and the worse one: a placement is three facts declared
|
|
// together, so an invocation that said none of them took all three away — the endpoint every other
|
|
// machine dials, the site, and the hub. A mesh whose hub was placed that way has no paths left.
|
|
func TestPlacingANodeWithNothingSaidDoesNotUnplaceIt(t *testing.T) {
|
|
open := aMesh(t)
|
|
ctx := t.Context()
|
|
if err := overlayPlace(ctx, open.inventory,
|
|
[]string{"anchor", "--endpoint", "198.51.100.10:51820", "--site", "hosting", "--hub"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err := overlayPlace(ctx, open.inventory, []string{"anchor"})
|
|
if err == nil {
|
|
t.Fatal("saying nothing unplaced the node instead of being refused")
|
|
}
|
|
if !strings.Contains(err.Error(), "--nothing") {
|
|
t.Errorf("the refusal does not say how to mean it: %v", err)
|
|
}
|
|
|
|
held := placementOf(t, ctx, open.inventory, "anchor")
|
|
if held.Endpoint != "198.51.100.10:51820" || held.Site != "hosting" || !held.Hub {
|
|
t.Fatalf("the placement was taken away by an invocation that was refused: %+v", held)
|
|
}
|
|
}
|
|
|
|
// Placing a machine with nothing set is a real thing to want — one that roams and opens every path
|
|
// itself is exactly that — so it keeps a way to be said, by name.
|
|
func TestPlacingANodeWithNothingIsAskedForByName(t *testing.T) {
|
|
open := aMesh(t)
|
|
ctx := t.Context()
|
|
if err := overlayPlace(ctx, open.inventory,
|
|
[]string{"anchor", "--endpoint", "198.51.100.10:51820", "--site", "hosting"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := overlayPlace(ctx, open.inventory, []string{"anchor", "--nothing"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
held := placementOf(t, ctx, open.inventory, "anchor")
|
|
if held.Endpoint != "" || held.Site != "" || held.Hub {
|
|
t.Fatalf("--nothing did not place it with nothing: %+v", held)
|
|
}
|
|
}
|
|
|
|
// Both at once cannot be meant, so neither silently wins.
|
|
func TestAPlacementAndNothingTogetherIsRefused(t *testing.T) {
|
|
open := aMesh(t)
|
|
ctx := t.Context()
|
|
if err := overlayPlace(ctx, open.inventory,
|
|
[]string{"anchor", "--site", "hosting", "--nothing"}); err == nil {
|
|
t.Fatal("a placement and --nothing together was accepted")
|
|
}
|
|
}
|