blob: 145129a6a719d6bdf7a29ed298fb22ec713484c2 [file] [log] [blame]
package manager
import (
"context"
"testing"
"time"
"github.com/packethost/packngo"
"source.monogon.dev/cloud/bmaas/bmdb"
"source.monogon.dev/cloud/bmaas/bmdb/model"
"source.monogon.dev/cloud/lib/component"
)
type updaterDut struct {
f *fakequinix
u *Updater
bmdb *bmdb.Connection
ctx context.Context
}
func newUpdaterDut(t *testing.T) *updaterDut {
t.Helper()
uc := UpdaterConfig{
Enable: true,
IterationRate: time.Second,
}
f := newFakequinix("fake", 100)
u, err := uc.New(f)
if err != nil {
t.Fatalf("Could not create Updater: %v", err)
}
b := bmdb.BMDB{
Config: bmdb.Config{
Database: component.CockroachConfig{
InMemory: true,
},
ComponentName: "test",
RuntimeInfo: "test",
},
}
conn, err := b.Open(true)
if err != nil {
t.Fatalf("Could not create in-memory BMDB: %v", err)
}
ctx, ctxC := context.WithCancel(context.Background())
t.Cleanup(ctxC)
go u.Run(ctx, conn)
return &updaterDut{
f: f,
u: u,
bmdb: conn,
ctx: ctx,
}
}
func TestUpdater(t *testing.T) {
dut := newUpdaterDut(t)
f := dut.f
ctx := dut.ctx
conn := dut.bmdb
reservations, _ := f.ListReservations(ctx, "fake")
sess, err := conn.StartSession(ctx)
if err != nil {
t.Fatalf("Failed to create BMDB session: %v", err)
}
// Create test machine that should be selected for updating.
// First in Fakequinix...
dev, _ := f.CreateDevice(ctx, &packngo.DeviceCreateRequest{
Hostname: "test-devices",
OS: "fake",
ProjectID: "fake",
HardwareReservationID: reservations[0].ID,
ProjectSSHKeys: []string{},
})
// ... and in BMDB.
err = sess.Transact(ctx, func(q *model.Queries) error {
machine, err := q.NewMachine(ctx)
if err != nil {
return err
}
err = q.MachineAddProvided(ctx, model.MachineAddProvidedParams{
MachineID: machine.MachineID,
Provider: model.ProviderEquinix,
ProviderID: dev.ID,
})
if err != nil {
return err
}
return q.MachineSetAgentStarted(ctx, model.MachineSetAgentStartedParams{
MachineID: machine.MachineID,
AgentStartedAt: time.Now().Add(time.Hour * -10),
AgentPublicKey: []byte("fakefakefakefake"),
})
})
deadline := time.Now().Add(time.Second * 10)
for {
time.Sleep(100 * time.Millisecond)
if time.Now().After(deadline) {
t.Fatalf("Deadline exceeded")
}
var provided []model.MachineProvided
err = sess.Transact(ctx, func(q *model.Queries) error {
var err error
provided, err = q.GetProvidedMachines(ctx, model.ProviderEquinix)
return err
})
if err != nil {
t.Fatalf("Transact: %v", err)
}
if len(provided) < 1 {
continue
}
p := provided[0]
if p.ProviderStatus.ProviderStatus != model.ProviderStatusRunning {
continue
}
if p.ProviderLocation.String != "wad" {
continue
}
if p.ProviderIpAddress.String != "1.2.3.4" {
continue
}
if p.ProviderReservationID.String != reservations[0].ID {
continue
}
break
}
}