blob: ed3da7af5d8c3b33928d1f9b7985c8ada7a43679 [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 Bazanskiafd3cf82023-04-19 17:43:46 +02005
6import (
7 "context"
8 "testing"
9 "time"
10
11 "github.com/packethost/packngo"
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
18type updaterDut struct {
19 f *fakequinix
20 u *Updater
21 bmdb *bmdb.Connection
22 ctx context.Context
23}
24
25func newUpdaterDut(t *testing.T) *updaterDut {
26 t.Helper()
27
28 uc := UpdaterConfig{
29 Enable: true,
30 IterationRate: time.Second,
31 }
32
33 f := newFakequinix("fake", 100)
34 u, err := uc.New(f)
35 if err != nil {
36 t.Fatalf("Could not create Updater: %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 u.Run(ctx, conn)
57
58 return &updaterDut{
59 f: f,
60 u: u,
61 bmdb: conn,
62 ctx: ctx,
63 }
64}
65
66func TestUpdater(t *testing.T) {
67 dut := newUpdaterDut(t)
68 f := dut.f
69 ctx := dut.ctx
70 conn := dut.bmdb
71
72 reservations, _ := f.ListReservations(ctx, "fake")
73
74 sess, err := conn.StartSession(ctx)
75 if err != nil {
76 t.Fatalf("Failed to create BMDB session: %v", err)
77 }
78
79 // Create test machine that should be selected for updating.
80 // First in Fakequinix...
81 dev, _ := f.CreateDevice(ctx, &packngo.DeviceCreateRequest{
82 Hostname: "test-devices",
83 OS: "fake",
84 ProjectID: "fake",
85 HardwareReservationID: reservations[0].ID,
86 ProjectSSHKeys: []string{},
87 })
88 // ... and in BMDB.
89 err = sess.Transact(ctx, func(q *model.Queries) error {
90 machine, err := q.NewMachine(ctx)
91 if err != nil {
92 return err
93 }
94 err = q.MachineAddProvided(ctx, model.MachineAddProvidedParams{
95 MachineID: machine.MachineID,
96 Provider: model.ProviderEquinix,
97 ProviderID: dev.ID,
98 })
99 if err != nil {
100 return err
101 }
102 return q.MachineSetAgentStarted(ctx, model.MachineSetAgentStartedParams{
103 MachineID: machine.MachineID,
104 AgentStartedAt: time.Now().Add(time.Hour * -10),
105 AgentPublicKey: []byte("fakefakefakefake"),
106 })
107 })
Tim Windelschmidt096654a2024-04-18 23:10:19 +0200108 if err != nil {
109 t.Fatalf("failed to execute bmdb transaction: %v", err)
110 }
Serge Bazanskiafd3cf82023-04-19 17:43:46 +0200111
112 deadline := time.Now().Add(time.Second * 10)
113 for {
114 time.Sleep(100 * time.Millisecond)
115 if time.Now().After(deadline) {
116 t.Fatalf("Deadline exceeded")
117 }
118
119 var provided []model.MachineProvided
120 err = sess.Transact(ctx, func(q *model.Queries) error {
121 var err error
122 provided, err = q.GetProvidedMachines(ctx, model.ProviderEquinix)
123 return err
124 })
125 if err != nil {
126 t.Fatalf("Transact: %v", err)
127 }
128 if len(provided) < 1 {
129 continue
130 }
131 p := provided[0]
132 if p.ProviderStatus.ProviderStatus != model.ProviderStatusRunning {
133 continue
134 }
135 if p.ProviderLocation.String != "wad" {
136 continue
137 }
138 if p.ProviderIpAddress.String != "1.2.3.4" {
139 continue
140 }
141 if p.ProviderReservationID.String != reservations[0].ID {
142 continue
143 }
144 break
145 }
146}