blob: b57546a6065b419a1e7795825e0e16c2c1971063 [file] [log] [blame]
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +02001package main
Serge Bazanskicaa12082023-02-16 14:54:04 +01002
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"
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020015 "source.monogon.dev/cloud/shepherd/manager"
Serge Bazanskicaa12082023-02-16 14:54:04 +010016)
17
18// TestProvisionerSmokes makes sure the Provisioner doesn't go up in flames on
19// the happy path.
20func TestProvisionerSmokes(t *testing.T) {
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020021 pc := manager.ProvisionerConfig{
Serge Bazanskicaa12082023-02-16 14:54:04 +010022 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),
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020026 ChunkSize: 4,
Serge Bazanskicaa12082023-02-16 14:54:04 +010027 }
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020028 sc := providerConfig{
Serge Bazanskicaa12082023-02-16 14:54:04 +010029 ProjectId: "noproject",
30 KeyLabel: "somekey",
Serge Bazanskicaa12082023-02-16 14:54:04 +010031 DevicePrefix: "test-",
32 }
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020033
34 _, key, _ := ed25519.GenerateKey(rand.Reader)
35 k := manager.SSHKey{
36 Key: key,
37 }
38
Serge Bazanskicaa12082023-02-16 14:54:04 +010039 f := newFakequinix(sc.ProjectId, 100)
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020040 provider, err := sc.New(&k, f)
41 if err != nil {
42 t.Fatalf("Could not create Provider: %v", err)
43 }
44
45 p, err := manager.NewProvisioner(provider, pc)
Serge Bazanskicaa12082023-02-16 14:54:04 +010046 if err != nil {
47 t.Fatalf("Could not create Provisioner: %v", err)
48 }
49
50 ctx, ctxC := context.WithCancel(context.Background())
51 defer ctxC()
52
53 b := bmdb.BMDB{
54 Config: bmdb.Config{
55 Database: component.CockroachConfig{
56 InMemory: true,
57 },
58 ComponentName: "test",
59 RuntimeInfo: "test",
60 },
61 }
62 conn, err := b.Open(true)
63 if err != nil {
64 t.Fatalf("Could not create in-memory BMDB: %v", err)
65 }
66
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020067 if err := provider.SSHEquinixEnsure(ctx); err != nil {
Serge Bazanskicaa12082023-02-16 14:54:04 +010068 t.Fatalf("Failed to ensure SSH key: %v", err)
69 }
70 go p.Run(ctx, conn)
71
72 sess, err := conn.StartSession(ctx)
73 if err != nil {
74 t.Fatalf("Failed to create BMDB session for verification: %v", err)
75 }
76 for {
77 time.Sleep(100 * time.Millisecond)
78
79 var provided []model.MachineProvided
80 err = sess.Transact(ctx, func(q *model.Queries) error {
81 var err error
82 provided, err = q.GetProvidedMachines(ctx, model.ProviderEquinix)
83 return err
84 })
85 if err != nil {
86 t.Errorf("Transact failed: %v", err)
87 }
88 if len(provided) < 10 {
89 continue
90 }
91 if len(provided) > 10 {
92 t.Errorf("%d machines provided (limit: 10)", len(provided))
93 }
94
95 for _, mp := range provided {
96 if f.devices[mp.ProviderID] == nil {
97 t.Errorf("BMDB machine %q has unknown provider ID %q", mp.MachineID, mp.ProviderID)
98 }
99 }
100
101 return
102 }
103}