blob: 80a90b8a971e9980cf979a17769df526ff58f6de [file] [log] [blame]
package manager
import (
"context"
"crypto/ed25519"
"crypto/rand"
"testing"
"time"
"golang.org/x/time/rate"
"source.monogon.dev/cloud/bmaas/bmdb"
"source.monogon.dev/cloud/bmaas/bmdb/model"
"source.monogon.dev/cloud/lib/component"
)
// TestProvisionerSmokes makes sure the Provisioner doesn't go up in flames on
// the happy path.
func TestProvisionerSmokes(t *testing.T) {
pc := ProvisionerConfig{
OS: "fake",
MaxCount: 10,
// We need 3 iterations to provide 10 machines with a chunk size of 4.
ReconcileLoopLimiter: rate.NewLimiter(rate.Every(10*time.Second), 3),
DeviceCreationLimiter: rate.NewLimiter(rate.Every(time.Second), 10),
ReservationChunkSize: 4,
}
_, key, _ := ed25519.GenerateKey(rand.Reader)
sc := SharedConfig{
ProjectId: "noproject",
KeyLabel: "somekey",
Key: key,
DevicePrefix: "test-",
}
f := newFakequinix(sc.ProjectId, 100)
p, err := pc.New(f, &sc)
if err != nil {
t.Fatalf("Could not create Provisioner: %v", err)
}
ctx, ctxC := context.WithCancel(context.Background())
defer ctxC()
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)
}
if err := sc.SSHEquinixEnsure(ctx, f); err != nil {
t.Fatalf("Failed to ensure SSH key: %v", err)
}
go p.Run(ctx, conn)
sess, err := conn.StartSession(ctx)
if err != nil {
t.Fatalf("Failed to create BMDB session for verification: %v", err)
}
for {
time.Sleep(100 * time.Millisecond)
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.Errorf("Transact failed: %v", err)
}
if len(provided) < 10 {
continue
}
if len(provided) > 10 {
t.Errorf("%d machines provided (limit: 10)", len(provided))
}
for _, mp := range provided {
if f.devices[mp.ProviderID] == nil {
t.Errorf("BMDB machine %q has unknown provider ID %q", mp.MachineID, mp.ProviderID)
}
}
return
}
}