Files
query-orchestration/internal/test/ecosystem.go
T
Michael McGuinness c4c0b9bd32 Merged in update/ci (pull request #127)
added CI

* onlywherenecessary

* export

* dockersocketoverride

* disablecleanup

* networkfromenv

* fullsuite

* ci

* dockerhost

* name

* network

* buildfirst

* rm

* caches

* additionalcaches

* additionalcaches

* cachenix

* nix

* requiredprofile

* nonixcache

* nobuild

* moremem

* rmgomodules

* buildfirst

* faster

* clean
2025-05-08 16:04:45 +00:00

187 lines
3.9 KiB
Go

package test
import (
"context"
"fmt"
"strings"
"sync"
"testing"
"queryorchestration/internal/serviceconfig"
"queryorchestration/internal/serviceconfig/objectstore"
queryapi "queryorchestration/pkg/queryAPI"
"github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go"
)
type Network struct {
Dependencies Dependencies
APIs map[APIName]*Container
Runners map[RunnerName]*Container
Client *queryapi.ClientWithResponses
}
func CreateFullNetwork(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) (Network, func()) {
deps := CreateFullDependencies(t, ctx, cfg)
var wg sync.WaitGroup
apiContainers := make(map[APIName]*Container, len(apis))
apiClean := make([]func(), len(apis))
var apiMu sync.Mutex
for i, s := range apis {
wg.Add(1)
go func() {
c, ccleanup := CreateAPI(t, ctx, cfg, deps.Network, &APIConfig{
API: s,
MockHTTP: string(deps.MockServer.Internal),
})
apiMu.Lock()
apiContainers[s.Name] = c
apiMu.Unlock()
apiClean[i] = ccleanup
wg.Done()
}()
}
runnerContainers := make(map[RunnerName]*Container, len(runners))
runnerClean := make([]func(), len(runners))
var runnerMu sync.Mutex
for i, r := range runners {
wg.Add(1)
go func() {
c, ccleanup := CreateRunner(t, ctx, cfg, deps.Network, &RunnerConfig{
Runner: r,
MockHTTP: string(deps.MockServer.Internal),
})
runnerMu.Lock()
runnerContainers[r.Name] = c
runnerMu.Unlock()
runnerClean[i] = ccleanup
wg.Done()
}()
}
wg.Wait()
qService, err := queryapi.NewClientWithResponses(apiContainers[QueryAPIName].URI)
require.NoError(t, err)
return Network{
Dependencies: deps,
APIs: apiContainers,
Runners: runnerContainers,
Client: qService,
}, func() {
var wg sync.WaitGroup
for _, c := range apiClean {
wg.Add(1)
go func() {
c()
wg.Done()
}()
}
for _, c := range runnerClean {
wg.Add(1)
go func() {
c()
wg.Done()
}()
}
wg.Wait()
}
}
type FullDependenciesConfig interface {
serviceconfig.ConfigProvider
objectstore.ConfigProvider
}
type Dependencies struct {
QueueURLs map[RunnerName]string
AWSConfig *AWSContainerConfig
DBConfig testcontainers.Container
MockServer MockServer
Network string
}
func CreateFullDependencies(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) Dependencies {
network := GetNetwork(t)
deps := Dependencies{
Network: network,
QueueURLs: map[RunnerName]string{},
}
var wg sync.WaitGroup
wg.Add(1)
go func() {
deps.AWSConfig = CreateAWSContainer(t, cfg, network)
SetQueueClient(t, ctx, cfg, deps.AWSConfig.ExternalEndpoint)
for _, runner := range runners {
wg.Add(1)
go func() {
deps.QueueURLs[runner.Name] = CreateQueue(t, ctx, cfg, runner.Name)
wg.Done()
}()
}
SetStoreClient(t, ctx, cfg, deps.AWSConfig.ExternalEndpoint)
CreateBucket(t, ctx, cfg)
SetBucketNotifs(t, ctx, cfg)
wg.Done()
}()
mockServer := CreateMockServer(t, network)
deps.MockServer = mockServer
CreateDB(t, cfg, network, &CreateDatabaseConfig{
NoMigrations: true,
})
wg.Wait()
return deps
}
type APINetwork struct {
Dependencies Dependencies
API *Container
}
func CreateAPINetwork(t testing.TB, ctx context.Context, cfg FullDependenciesConfig, api API) (*APINetwork, func()) {
deps := CreateFullDependencies(t, ctx, cfg)
c, ccleanup := CreateAPI(t, ctx, cfg, deps.Network, &APIConfig{
API: api,
MockHTTP: string(deps.MockServer.Internal),
})
return &APINetwork{
Dependencies: deps,
API: c,
}, ccleanup
}
func GetAlias(t testing.TB, baseName string) string {
name := fmt.Sprintf("%s_%s", baseName, t.Name())
name = strings.ToLower(name)
name = strings.ReplaceAll(name, "/", "")
name = strings.ReplaceAll(name, " ", "")
name = strings.ReplaceAll(name, "-", "")
name = strings.ReplaceAll(name, "_", "")
return name
}