blob: 5ba2253c96cbe4b54d8add1c162c7a3652c0a8b5 [file] [log] [blame]
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +02001package manager
2
3import (
4 "context"
5 "testing"
6 "time"
7
8 "golang.org/x/time/rate"
9
10 "source.monogon.dev/cloud/bmaas/bmdb"
11 "source.monogon.dev/cloud/bmaas/bmdb/model"
12 "source.monogon.dev/cloud/lib/component"
13)
14
15// TestInitializerSmokes makes sure the Initializer doesn't go up in flames on
16// the happy path.
17func TestInitializerSmokes(t *testing.T) {
18 provider := newDummyProvider(100)
19
20 ic := InitializerConfig{
21 ControlLoopConfig: ControlLoopConfig{
22 DBQueryLimiter: rate.NewLimiter(rate.Every(time.Second), 10),
23 },
24 Executable: []byte("beep boop i'm a real program"),
25 TargetPath: "/fake/path",
26 Endpoint: "example.com:1234",
27 SSHConnectTimeout: time.Second,
28 SSHExecTimeout: time.Second,
29 }
30
31 i, err := NewInitializer(provider, provider.sshClient(), ic)
32 if err != nil {
33 t.Fatalf("Could not create Initializer: %v", err)
34 }
35
36 b := bmdb.BMDB{
37 Config: bmdb.Config{
38 Database: component.CockroachConfig{
39 InMemory: true,
40 },
41 ComponentName: "test",
42 RuntimeInfo: "test",
43 },
44 }
45 conn, err := b.Open(true)
46 if err != nil {
47 t.Fatalf("Could not create in-memory BMDB: %v", err)
48 }
49
50 ctx, ctxC := context.WithCancel(context.Background())
51 t.Cleanup(ctxC)
52
53 go RunControlLoop(ctx, conn, i)
54
55 sess, err := conn.StartSession(ctx)
56 if err != nil {
57 t.Fatalf("Failed to create BMDB session for verifiaction: %v", err)
58 }
59
60 // Create 10 provided machines for testing.
61 if _, err := provider.createDummyMachines(ctx, sess, 10); err != nil {
62 t.Fatalf("Failed to create dummy machines: %v", err)
63 }
64
65 // Expect to find 0 machines needing start.
66 for {
67 time.Sleep(100 * time.Millisecond)
68
69 var machines []model.MachineProvided
70 err = sess.Transact(ctx, func(q *model.Queries) error {
71 var err error
72 machines, err = q.GetMachinesForAgentStart(ctx, model.GetMachinesForAgentStartParams{
73 Limit: 100,
74 Provider: provider.Type(),
75 })
76 return err
77 })
78 if err != nil {
79 t.Fatalf("Failed to run Transaction: %v", err)
80 }
81 if len(machines) == 0 {
82 break
83 }
84 }
85
86 for _, m := range provider.machines {
87 if !m.agentStarted {
88 t.Fatalf("Initializer didn't start agent on machine %q", m.id)
89 }
90 }
91}