blob: 80a90b8a971e9980cf979a17769df526ff58f6de [file] [log] [blame]
Serge Bazanskicaa12082023-02-16 14:54:04 +01001package manager
2
3import (
4 "context"
5 "crypto/ed25519"
6 "crypto/rand"
7 "testing"
8 "time"
9
10 "golang.org/x/time/rate"
11
12 "source.monogon.dev/cloud/bmaas/bmdb"
13 "source.monogon.dev/cloud/bmaas/bmdb/model"
14 "source.monogon.dev/cloud/lib/component"
15)
16
17// TestProvisionerSmokes makes sure the Provisioner doesn't go up in flames on
18// the happy path.
19func TestProvisionerSmokes(t *testing.T) {
20 pc := ProvisionerConfig{
21 OS: "fake",
22 MaxCount: 10,
23 // We need 3 iterations to provide 10 machines with a chunk size of 4.
24 ReconcileLoopLimiter: rate.NewLimiter(rate.Every(10*time.Second), 3),
25 DeviceCreationLimiter: rate.NewLimiter(rate.Every(time.Second), 10),
26 ReservationChunkSize: 4,
27 }
28 _, key, _ := ed25519.GenerateKey(rand.Reader)
29 sc := SharedConfig{
30 ProjectId: "noproject",
31 KeyLabel: "somekey",
32 Key: key,
33 DevicePrefix: "test-",
34 }
35 f := newFakequinix(sc.ProjectId, 100)
36 p, err := pc.New(f, &sc)
37 if err != nil {
38 t.Fatalf("Could not create Provisioner: %v", err)
39 }
40
41 ctx, ctxC := context.WithCancel(context.Background())
42 defer ctxC()
43
44 b := bmdb.BMDB{
45 Config: bmdb.Config{
46 Database: component.CockroachConfig{
47 InMemory: true,
48 },
49 ComponentName: "test",
50 RuntimeInfo: "test",
51 },
52 }
53 conn, err := b.Open(true)
54 if err != nil {
55 t.Fatalf("Could not create in-memory BMDB: %v", err)
56 }
57
58 if err := sc.SSHEquinixEnsure(ctx, f); err != nil {
59 t.Fatalf("Failed to ensure SSH key: %v", err)
60 }
61 go p.Run(ctx, conn)
62
63 sess, err := conn.StartSession(ctx)
64 if err != nil {
65 t.Fatalf("Failed to create BMDB session for verification: %v", err)
66 }
67 for {
68 time.Sleep(100 * time.Millisecond)
69
70 var provided []model.MachineProvided
71 err = sess.Transact(ctx, func(q *model.Queries) error {
72 var err error
73 provided, err = q.GetProvidedMachines(ctx, model.ProviderEquinix)
74 return err
75 })
76 if err != nil {
77 t.Errorf("Transact failed: %v", err)
78 }
79 if len(provided) < 10 {
80 continue
81 }
82 if len(provided) > 10 {
83 t.Errorf("%d machines provided (limit: 10)", len(provided))
84 }
85
86 for _, mp := range provided {
87 if f.devices[mp.ProviderID] == nil {
88 t.Errorf("BMDB machine %q has unknown provider ID %q", mp.MachineID, mp.ProviderID)
89 }
90 }
91
92 return
93 }
94}