5f92196625
tests/integration/harness.go: temp ORCA_HOME + mock peers + helpers. tests/integration/scenarios_test.go: ns-create/job-submit/drain/backup/ secrets/acl/metrics scenarios. drift_scenarios_test.go: 4 stubs (auto- remediation, NFS, cooldown, secret exclusion) skip until P10b. scripts/tests/orca-commands_test.bash: bats for new CLI commands. ---ci--- project: orca phase: 08 milestone: v0.11 status: execute ---/ci---
139 lines
3.2 KiB
Go
139 lines
3.2 KiB
Go
package integration
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.cloudinit.dev/coreci/orca/internal/model"
|
|
"git.cloudinit.dev/coreci/orca/internal/paths"
|
|
)
|
|
|
|
func TestHarness_CreatesValidOrcaHome(t *testing.T) {
|
|
h := NewHarness(t)
|
|
if h.Home == "" {
|
|
t.Fatal("Home is empty")
|
|
}
|
|
if h.DB == nil {
|
|
t.Fatal("DB is nil")
|
|
}
|
|
if h.Registry == nil {
|
|
t.Fatal("Registry is nil")
|
|
}
|
|
if err := h.VerifyState(); err != nil {
|
|
t.Fatalf("VerifyState: %v", err)
|
|
}
|
|
ctx := context.Background()
|
|
nodes, err := h.Registry.List(ctx)
|
|
if err != nil {
|
|
t.Fatalf("List nodes: %v", err)
|
|
}
|
|
if len(nodes) != 1 || nodes[0].Name != "localhost" {
|
|
t.Errorf("expected localhost node, got %+v", nodes)
|
|
}
|
|
}
|
|
|
|
func TestHarness_MasterKeyMode(t *testing.T) {
|
|
h := NewHarness(t)
|
|
if err := h.VerifyState(); err != nil {
|
|
t.Fatalf("VerifyState: %v", err)
|
|
}
|
|
info, err := statPerm(paths.MasterKeyPath())
|
|
if err != nil {
|
|
t.Fatalf("stat master key: %v", err)
|
|
}
|
|
const want = 0o600
|
|
if info != want {
|
|
t.Errorf("master key mode %o, want %o", info, want)
|
|
}
|
|
}
|
|
|
|
func TestHarness_MockPeerRecordsCommands(t *testing.T) {
|
|
h := NewHarness(t)
|
|
peer := h.RegisterPeer("node-a", "node-a:22")
|
|
peer.SetRunning("alloc-1", "alloc-2")
|
|
|
|
ctx := context.Background()
|
|
running, err := h.ListAllocs(ctx, "node-a")
|
|
if err != nil {
|
|
t.Fatalf("ListAllocs: %v", err)
|
|
}
|
|
if len(running) != 2 {
|
|
t.Errorf("running allocs = %v, want 2", running)
|
|
}
|
|
cmds := peer.Commands()
|
|
if len(cmds) < 1 {
|
|
t.Fatalf("expected recorded commands, got %v", cmds)
|
|
}
|
|
foundList := false
|
|
for _, c := range cmds {
|
|
if startsWith(c, "systemctl list-units 'orca-alloc-*.service'") {
|
|
foundList = true
|
|
}
|
|
}
|
|
if !foundList {
|
|
t.Errorf("no list-units command recorded: %v", cmds)
|
|
}
|
|
}
|
|
|
|
func TestHarness_DrainNodeStopsAllocs(t *testing.T) {
|
|
h := NewHarness(t)
|
|
peer := h.RegisterPeer("node-b", "node-b:22")
|
|
peer.SetRunning("alloc-x", "alloc-y")
|
|
|
|
ctx := context.Background()
|
|
stopped, err := h.DrainNode(ctx, "node-b")
|
|
if err != nil {
|
|
t.Fatalf("DrainNode: %v", err)
|
|
}
|
|
if len(stopped) != 2 {
|
|
t.Errorf("stopped = %v, want 2", stopped)
|
|
}
|
|
if r := peer.RunningAllocs(); len(r) != 0 {
|
|
t.Errorf("after drain, running = %v, want empty", r)
|
|
}
|
|
nodes, err := h.Registry.List(ctx)
|
|
if err != nil {
|
|
t.Fatalf("List: %v", err)
|
|
}
|
|
for _, n := range nodes {
|
|
if n.Name == "node-b" && n.State != model.NodeStateDrained {
|
|
t.Errorf("node-b state = %q, want drained", n.State)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestHarness_SubmitJobHelperWorks(t *testing.T) {
|
|
h := NewHarness(t)
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
jobID, err := h.SubmitJob(ctx, "smoke", "/bin/true")
|
|
if err != nil {
|
|
t.Fatalf("SubmitJob: %v", err)
|
|
}
|
|
if jobID == "" {
|
|
t.Fatal("SubmitJob returned empty id")
|
|
}
|
|
jobs, err := h.Jobs.List(ctx)
|
|
if err != nil {
|
|
t.Fatalf("Jobs.List: %v", err)
|
|
}
|
|
var found bool
|
|
for _, j := range jobs {
|
|
if j.ID == jobID && j.Status == model.JobStatusComplete {
|
|
found = true
|
|
}
|
|
}
|
|
if !found {
|
|
t.Errorf("submitted job %s not complete in list: %+v", jobID, jobs)
|
|
}
|
|
}
|
|
|
|
func TestHarness_MockTransportUnknownPeerErrors(t *testing.T) {
|
|
h := NewHarness(t)
|
|
ctx := context.Background()
|
|
if _, err := h.Transport.Exec(ctx, "ghost", "true"); err == nil {
|
|
t.Error("expected error for unknown peer, got nil")
|
|
}
|
|
}
|