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