blob: 3b4104409a4e4bab2cd0c9fdc1ac22208034c6fa [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
Jan Schär0175d7a2025-03-26 12:57:23 +000011 "golang.org/x/crypto/ssh"
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020012 "golang.org/x/time/rate"
13
14 "source.monogon.dev/cloud/bmaas/bmdb"
15 "source.monogon.dev/cloud/bmaas/bmdb/model"
16 "source.monogon.dev/cloud/lib/component"
17)
18
19// TestInitializerSmokes makes sure the Initializer doesn't go up in flames on
20// the happy path.
21func TestInitializerSmokes(t *testing.T) {
22 provider := newDummyProvider(100)
23
24 ic := InitializerConfig{
25 ControlLoopConfig: ControlLoopConfig{
26 DBQueryLimiter: rate.NewLimiter(rate.Every(time.Second), 10),
27 },
Jan Schär0175d7a2025-03-26 12:57:23 +000028 Executable: []byte("beep boop i'm a real program"),
29 TargetPath: "/fake/path",
30 Endpoint: "example.com:1234",
31 SSHConfig: ssh.ClientConfig{
32 Timeout: time.Second,
33 },
34 SSHExecTimeout: time.Second,
35 DialSSH: provider.FakeSSHDial,
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020036 }
37
Jan Schär0175d7a2025-03-26 12:57:23 +000038 i, err := NewInitializer(provider, ic)
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020039 if err != nil {
40 t.Fatalf("Could not create Initializer: %v", err)
41 }
42
43 b := bmdb.BMDB{
44 Config: bmdb.Config{
45 Database: component.CockroachConfig{
46 InMemory: true,
47 },
48 ComponentName: "test",
49 RuntimeInfo: "test",
50 },
51 }
52 conn, err := b.Open(true)
53 if err != nil {
54 t.Fatalf("Could not create in-memory BMDB: %v", err)
55 }
56
57 ctx, ctxC := context.WithCancel(context.Background())
58 t.Cleanup(ctxC)
59
60 go RunControlLoop(ctx, conn, i)
61
62 sess, err := conn.StartSession(ctx)
63 if err != nil {
64 t.Fatalf("Failed to create BMDB session for verifiaction: %v", err)
65 }
66
67 // Create 10 provided machines for testing.
68 if _, err := provider.createDummyMachines(ctx, sess, 10); err != nil {
69 t.Fatalf("Failed to create dummy machines: %v", err)
70 }
71
72 // Expect to find 0 machines needing start.
73 for {
74 time.Sleep(100 * time.Millisecond)
75
76 var machines []model.MachineProvided
77 err = sess.Transact(ctx, func(q *model.Queries) error {
78 var err error
79 machines, err = q.GetMachinesForAgentStart(ctx, model.GetMachinesForAgentStartParams{
80 Limit: 100,
81 Provider: provider.Type(),
82 })
83 return err
84 })
85 if err != nil {
86 t.Fatalf("Failed to run Transaction: %v", err)
87 }
88 if len(machines) == 0 {
89 break
90 }
91 }
92
Tim Windelschmidt8eeae7b2024-12-09 22:52:55 +010093 provider.muMachines.RLock()
94 defer provider.muMachines.RUnlock()
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020095 for _, m := range provider.machines {
96 if !m.agentStarted {
97 t.Fatalf("Initializer didn't start agent on machine %q", m.id)
98 }
99 }
100}