8e6e53cf63
When running the test suite in CI (where requests are centralized from relatively few IPs), we'd occasionally hit Dockerhub's rate limits. Luckily Hashicorp runs a (limited) public mirror of the containers we need, so we can switch to them here in the tests. For consistency between developer and CI, we've opted to have the tests always pull from the Hashicorp mirror, rather than updating the CI runner to prefer the mirror. We exclude nomad and influxdb as we don't presently mirror these repos. Signed-off-by: Alexander Scheel <alex.scheel@hashicorp.com> Signed-off-by: Alexander Scheel <alex.scheel@hashicorp.com>
116 lines
3.3 KiB
Go
116 lines
3.3 KiB
Go
package postgresql
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"net/url"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/vault/helper/testhelpers/docker"
|
|
)
|
|
|
|
func PrepareTestContainer(t *testing.T, version string) (func(), string) {
|
|
env := []string{
|
|
"POSTGRES_PASSWORD=secret",
|
|
"POSTGRES_DB=database",
|
|
}
|
|
|
|
_, cleanup, url, _ := prepareTestContainer(t, "postgres", "docker.mirror.hashicorp.services/postgres", version, "secret", true, false, false, env)
|
|
|
|
return cleanup, url
|
|
}
|
|
|
|
func PrepareTestContainerWithPassword(t *testing.T, version, password string) (func(), string) {
|
|
env := []string{
|
|
"POSTGRES_PASSWORD=" + password,
|
|
"POSTGRES_DB=database",
|
|
}
|
|
|
|
_, cleanup, url, _ := prepareTestContainer(t, "postgres", "docker.mirror.hashicorp.services/postgres", version, password, true, false, false, env)
|
|
|
|
return cleanup, url
|
|
}
|
|
|
|
func PrepareTestContainerRepmgr(t *testing.T, name, version string, envVars []string) (*docker.Runner, func(), string, string) {
|
|
env := append(envVars,
|
|
"REPMGR_PARTNER_NODES=psql-repl-node-0,psql-repl-node-1",
|
|
"REPMGR_PRIMARY_HOST=psql-repl-node-0",
|
|
"REPMGR_PASSWORD=repmgrpass",
|
|
"POSTGRESQL_PASSWORD=secret")
|
|
|
|
return prepareTestContainer(t, name, "docker.mirror.hashicorp.services/bitnami/postgresql-repmgr", version, "secret", false, true, true, env)
|
|
}
|
|
|
|
func prepareTestContainer(t *testing.T, name, repo, version, password string,
|
|
addSuffix, forceLocalAddr, doNotAutoRemove bool, envVars []string,
|
|
) (*docker.Runner, func(), string, string) {
|
|
if os.Getenv("PG_URL") != "" {
|
|
return nil, func() {}, "", os.Getenv("PG_URL")
|
|
}
|
|
|
|
if version == "" {
|
|
version = "11"
|
|
}
|
|
|
|
runOpts := docker.RunOptions{
|
|
ContainerName: name,
|
|
ImageRepo: repo,
|
|
ImageTag: version,
|
|
Env: envVars,
|
|
Ports: []string{"5432/tcp"},
|
|
DoNotAutoRemove: doNotAutoRemove,
|
|
}
|
|
if repo == "bitnami/postgresql-repmgr" {
|
|
runOpts.NetworkID = os.Getenv("POSTGRES_MULTIHOST_NET")
|
|
}
|
|
|
|
runner, err := docker.NewServiceRunner(runOpts)
|
|
if err != nil {
|
|
t.Fatalf("Could not start docker Postgres: %s", err)
|
|
}
|
|
|
|
svc, containerID, err := runner.StartNewService(context.Background(), addSuffix, forceLocalAddr, connectPostgres(password, repo))
|
|
if err != nil {
|
|
t.Fatalf("Could not start docker Postgres: %s", err)
|
|
}
|
|
|
|
return runner, svc.Cleanup, svc.Config.URL().String(), containerID
|
|
}
|
|
|
|
func connectPostgres(password, repo string) docker.ServiceAdapter {
|
|
return func(ctx context.Context, host string, port int) (docker.ServiceConfig, error) {
|
|
u := url.URL{
|
|
Scheme: "postgres",
|
|
User: url.UserPassword("postgres", password),
|
|
Host: fmt.Sprintf("%s:%d", host, port),
|
|
Path: "postgres",
|
|
RawQuery: "sslmode=disable",
|
|
}
|
|
|
|
db, err := sql.Open("pgx", u.String())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer db.Close()
|
|
|
|
if err = db.Ping(); err != nil {
|
|
return nil, err
|
|
}
|
|
return docker.NewServiceURL(u), nil
|
|
}
|
|
}
|
|
|
|
func StopContainer(t *testing.T, ctx context.Context, runner *docker.Runner, containerID string) {
|
|
if err := runner.Stop(ctx, containerID); err != nil {
|
|
t.Fatalf("Could not stop docker Postgres: %s", err)
|
|
}
|
|
}
|
|
|
|
func RestartContainer(t *testing.T, ctx context.Context, runner *docker.Runner, containerID string) {
|
|
if err := runner.Restart(ctx, containerID); err != nil {
|
|
t.Fatalf("Could not restart docker Postgres: %s", err)
|
|
}
|
|
}
|