networking required mesh-wireguard and nothing else; machines are assigned the network directly. module forget refuses a provided module, so a retired one is removed at start once no machine has it. Guard route-proxy's public account directory against a reissue.
92 lines
2.7 KiB
Go
92 lines
2.7 KiB
Go
package inventory
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
)
|
|
|
|
// What a release stops shipping is retired at the next start, and never from under a machine
|
|
// (novox/hq ADR 0226). `module forget` refuses a provided module, so without this a module the
|
|
// control plane no longer carries could be removed by nothing.
|
|
|
|
func TestAModuleTheControlPlaneNoLongerShipsIsRetired(t *testing.T) {
|
|
inv := fresh(t)
|
|
ctx := t.Context()
|
|
for _, m := range []string{"mesh-wireguard", "networking"} {
|
|
if err := inv.Provide(ctx, manifest(m, nil, nil)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
retired, kept, err := inv.RetireUnshipped(ctx, []string{"mesh-wireguard"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if strings.Join(retired, ",") != "networking" || len(kept) != 0 {
|
|
t.Fatalf("retired %v, kept %v", retired, kept)
|
|
}
|
|
if _, err := inv.Provided(ctx, "networking"); !errors.Is(err, pgx.ErrNoRows) {
|
|
t.Fatalf("networking is still in the catalogue: %v", err)
|
|
}
|
|
if provided, err := inv.Provided(ctx, "mesh-wireguard"); err != nil || !provided {
|
|
t.Fatalf("what this release ships went too: %v %v", provided, err)
|
|
}
|
|
}
|
|
|
|
func TestARetiredModuleStillAssignedIsKeptAndSaidSo(t *testing.T) {
|
|
inv := fresh(t)
|
|
ctx := t.Context()
|
|
if _, err := inv.AddNode(ctx, "anchor"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := inv.Provide(ctx, manifest("networking", nil, nil)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := inv.Assign(ctx, "anchor", "networking"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
retired, kept, err := inv.RetireUnshipped(ctx, nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(retired) != 0 {
|
|
// Taking it now would drop whatever it pulled in at the next push — for the bundle, the
|
|
// private network.
|
|
t.Fatalf("a module assigned on a machine was retired: %v", retired)
|
|
}
|
|
if !strings.Contains(kept["networking"], "anchor") {
|
|
t.Fatalf("keeping it does not say where it is still assigned: %v", kept)
|
|
}
|
|
|
|
// Unassigned, the next start takes it.
|
|
if err := inv.Unassign(ctx, "anchor", "networking"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
retired, _, err = inv.RetireUnshipped(ctx, nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if strings.Join(retired, ",") != "networking" {
|
|
t.Fatalf("unassigned, it was still not retired: %v", retired)
|
|
}
|
|
}
|
|
|
|
func TestAModuleFromARepositoryIsNeverRetiredByThis(t *testing.T) {
|
|
// Only what the control plane recorded as its own. A module somebody registered is theirs to
|
|
// forget.
|
|
inv := fresh(t)
|
|
ctx := t.Context()
|
|
if err := inv.RegisterModule(ctx, manifest("public-acme", nil, nil), Source{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
retired, kept, err := inv.RetireUnshipped(ctx, nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(retired) != 0 || len(kept) != 0 {
|
|
t.Fatalf("a registered module was considered: retired %v, kept %v", retired, kept)
|
|
}
|
|
}
|