373d21a744
Postgres-backed External Node Classifier for Puppet, replacing Cobbler. - encapi HTTP server (chi + pgx): read/write API + two ENC document shapes (reshaped for the exec terminus; cobbler-wire for enc_direct_facts.rb) - encapi-cli: classify/node/role/status CRUD + import-cobbler seeder - pkg/client Go SDK; unit tests across all packages (DB via testcontainers) - Dockerfile (distroless), Makefile, nfpm RPM (encapi-cli + encapi-enc wrapper), Woodpecker CI, docs/cutover.md
48 lines
1.5 KiB
Go
48 lines
1.5 KiB
Go
// Package testsupport starts a throwaway Postgres container for
|
|
// integration-style unit tests. It is only imported from *_test.go files, so
|
|
// it never reaches the production binary. Tests skip themselves when Docker is
|
|
// unavailable.
|
|
package testsupport
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/testcontainers/testcontainers-go"
|
|
tcpostgres "github.com/testcontainers/testcontainers-go/modules/postgres"
|
|
"github.com/testcontainers/testcontainers-go/wait"
|
|
)
|
|
|
|
func init() {
|
|
// The Ryuk reaper container cannot start in every environment; callers get
|
|
// an explicit terminate func for cleanup instead.
|
|
if _, ok := os.LookupEnv("TESTCONTAINERS_RYUK_DISABLED"); !ok {
|
|
_ = os.Setenv("TESTCONTAINERS_RYUK_DISABLED", "true")
|
|
}
|
|
}
|
|
|
|
// StartPostgres launches postgres:17-alpine and returns its DSN plus a
|
|
// terminate func.
|
|
func StartPostgres(ctx context.Context) (dsn string, terminate func(), err error) {
|
|
c, err := tcpostgres.Run(ctx,
|
|
"postgres:17-alpine",
|
|
tcpostgres.WithDatabase("encapi"),
|
|
tcpostgres.WithUsername("encapi"),
|
|
tcpostgres.WithPassword("encapi123"),
|
|
testcontainers.WithWaitStrategy(
|
|
wait.ForLog("database system is ready to accept connections").
|
|
WithOccurrence(2).
|
|
WithStartupTimeout(60*time.Second),
|
|
),
|
|
)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
host, _ := c.Host(ctx)
|
|
port, _ := c.MappedPort(ctx, "5432/tcp")
|
|
dsn = fmt.Sprintf("postgres://encapi:encapi123@%s:%s/encapi?sslmode=disable", host, port.Port())
|
|
return dsn, func() { _ = c.Terminate(ctx) }, nil
|
|
}
|