mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-19 19:01:42 +00:00
92fa467c90
* refactor(e2e/multinode): flatten phase 11 + parallelize bucket #1 + drop phase numbers Split monolithic phase11_PlacementAndNATGateway (~430 lines, 8 inline sub-steps) into 6 top-level Tests, each owning its own VPC graph via t.Cleanup and layered setup helpers (spreadSetupVPC, spreadSetupBastion, spreadSetupPrivateTrio, spreadSetupNATGW). The cleanup-ordering test flips *bool latches as each explicit teardown step succeeds so the LIFO unwind is a no-op on the success path. Add t.Parallel() to read-only / independent Tests: ClusterHealth, InstanceDistribution, GuestSSH, VPCNetworking. Deviates from the mulga-siv-127 bead's bucket-#1 listing by keeping CrossNodeGateway sequential (asserts a snapshot equality across gateways that the parallel VPC test would break by churning instance count mid-assert) and CrossNodeOps sequential (stops/starts trio[0], would race GuestSSH). Both deviations documented in tests_test.go + plan doc. Drop the bash phase numbering (phaseN_X funcs + "Phase N" log strings) from the rest of the suite — 10 funcs renamed to runX. Phase numbers were a port-time crutch; the Test names now describe each scenario and phase numbers ageing into noise as bash is retired in Stage H. * refactor(e2e/multinode): collapse spread Tests + control execution order Two changes wedged together since they touch the same files: 1. Collapse the 6 top-level TestMultinodeSpread* Tests into a single TestMultinodeSpread with 6 t.Run sub-tests sharing one VPC + bastion + private trio + NAT GW setup chain. The 6-test split paid setup cost 6× — bastion launch + private trio launch + NAT GW provision per Test pushed phase-11 wall-clock near 60min vs ~15min monolithic. Shared- setup layout keeps JUnit granularity (one row per sub-test) while restoring the monolithic budget. Setup helpers register t.Cleanup against the outer test so teardown runs once at the end (LIFO: NAT GW → trio → bastion → VPC). 2. Move the TestMultinodeSpread wrapper into tests_test.go so file-source order controls execution position. Previously the func lived in placement_nat_test.go which sorts before preflight_test.go and tests_test.go alphabetically — Spread ran FIRST in the sequential bucket, defeating Preflight's fail-fast on a sick cluster. Wrapper now runs after NodeRecovery so the cluster has been fully degrade-tested before Spread's 4-VM + NAT GW + custom-VPC graph spins up.
45 lines
1.7 KiB
Go
45 lines
1.7 KiB
Go
//go:build e2e
|
|
|
|
package multinode
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/mulgadc/spinifex/tests/e2e/harness"
|
|
)
|
|
|
|
// runInstanceDistribution is the Go port of instance lifecycle + distribution
|
|
// (run-multinode-e2e.sh:513-623). Launches a trio of instances and checks at
|
|
// least two cluster nodes host them. Distribution is non-deterministic
|
|
// (scheduler may stack on one node under load) so the bash version
|
|
// warns-not-fails when all three land on the same host. The Go port mirrors:
|
|
// minNodes=1 fatal, log "spread=N" so flaky CI surfaces in metrics without
|
|
// blocking the run.
|
|
func runInstanceDistribution(t *testing.T, fix *Fixture) {
|
|
harness.Phase(t, "Multinode — Instance Distribution")
|
|
|
|
ids := needInstanceTrio(t, fix)
|
|
harness.Detail(t, "instances", ids)
|
|
|
|
harness.Step(t, "check distribution across nodes")
|
|
counts := harness.AssertSpreadAcrossNodes(t, fix.Cluster, ids, 1)
|
|
harness.Detail(t, "spread", counts, "unique_hosts", len(counts))
|
|
if len(counts) < 2 {
|
|
t.Logf("WARN: all %d instances on one node (%v) — non-fatal, scheduler quirk", len(ids), counts)
|
|
}
|
|
|
|
// `spx get vms` is best-effort. Bash phase 3 invokes it with `2>/dev/null`
|
|
// and downgrades a missing instance to WARN — the underlying CLI ↔ NATS
|
|
// connection can race the cluster join (mulga-siv-90 CI run 26161792146)
|
|
// without affecting correctness of the data path. Mirror that: accept
|
|
// non-zero exit, log when an ID is missing rather than fail.
|
|
harness.Step(t, "spx get vms includes every launched instance (best-effort)")
|
|
vms := harness.SpxRunBestEffort(t, "get", "vms")
|
|
for _, id := range ids {
|
|
if !strings.Contains(vms, id) {
|
|
t.Logf("WARN: spx get vms did not list %s", id)
|
|
}
|
|
}
|
|
}
|