blob: 6a5b0c6f30a1f11b7da65de6d8ce1f8ca8aeaa60 [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 main
Serge Bazanskicaa12082023-02-16 14:54:04 +01005
6import (
7 "context"
8 "crypto/ed25519"
9 "crypto/rand"
10 "testing"
11 "time"
12
13 "golang.org/x/time/rate"
14
15 "source.monogon.dev/cloud/bmaas/bmdb"
16 "source.monogon.dev/cloud/bmaas/bmdb/model"
17 "source.monogon.dev/cloud/lib/component"
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020018 "source.monogon.dev/cloud/shepherd/manager"
Serge Bazanskicaa12082023-02-16 14:54:04 +010019)
20
21// TestProvisionerSmokes makes sure the Provisioner doesn't go up in flames on
22// the happy path.
23func TestProvisionerSmokes(t *testing.T) {
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020024 pc := manager.ProvisionerConfig{
Serge Bazanskicaa12082023-02-16 14:54:04 +010025 MaxCount: 10,
26 // We need 3 iterations to provide 10 machines with a chunk size of 4.
27 ReconcileLoopLimiter: rate.NewLimiter(rate.Every(10*time.Second), 3),
28 DeviceCreationLimiter: rate.NewLimiter(rate.Every(time.Second), 10),
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020029 ChunkSize: 4,
Serge Bazanskicaa12082023-02-16 14:54:04 +010030 }
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020031 sc := providerConfig{
Serge Bazanskicaa12082023-02-16 14:54:04 +010032 ProjectId: "noproject",
33 KeyLabel: "somekey",
Serge Bazanskicaa12082023-02-16 14:54:04 +010034 DevicePrefix: "test-",
35 }
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020036
37 _, key, _ := ed25519.GenerateKey(rand.Reader)
38 k := manager.SSHKey{
39 Key: key,
40 }
41
Serge Bazanskicaa12082023-02-16 14:54:04 +010042 f := newFakequinix(sc.ProjectId, 100)
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020043 provider, err := sc.New(&k, f)
44 if err != nil {
45 t.Fatalf("Could not create Provider: %v", err)
46 }
47
48 p, err := manager.NewProvisioner(provider, pc)
Serge Bazanskicaa12082023-02-16 14:54:04 +010049 if err != nil {
50 t.Fatalf("Could not create Provisioner: %v", err)
51 }
52
53 ctx, ctxC := context.WithCancel(context.Background())
54 defer ctxC()
55
56 b := bmdb.BMDB{
57 Config: bmdb.Config{
58 Database: component.CockroachConfig{
59 InMemory: true,
60 },
61 ComponentName: "test",
62 RuntimeInfo: "test",
63 },
64 }
65 conn, err := b.Open(true)
66 if err != nil {
67 t.Fatalf("Could not create in-memory BMDB: %v", err)
68 }
69
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +020070 if err := provider.SSHEquinixEnsure(ctx); err != nil {
Serge Bazanskicaa12082023-02-16 14:54:04 +010071 t.Fatalf("Failed to ensure SSH key: %v", err)
72 }
73 go p.Run(ctx, conn)
74
75 sess, err := conn.StartSession(ctx)
76 if err != nil {
77 t.Fatalf("Failed to create BMDB session for verification: %v", err)
78 }
79 for {
80 time.Sleep(100 * time.Millisecond)
81
82 var provided []model.MachineProvided
83 err = sess.Transact(ctx, func(q *model.Queries) error {
84 var err error
85 provided, err = q.GetProvidedMachines(ctx, model.ProviderEquinix)
86 return err
87 })
88 if err != nil {
89 t.Errorf("Transact failed: %v", err)
90 }
91 if len(provided) < 10 {
92 continue
93 }
94 if len(provided) > 10 {
95 t.Errorf("%d machines provided (limit: 10)", len(provided))
96 }
97
98 for _, mp := range provided {
99 if f.devices[mp.ProviderID] == nil {
100 t.Errorf("BMDB machine %q has unknown provider ID %q", mp.MachineID, mp.ProviderID)
101 }
102 }
103
104 return
105 }
106}