2025-02-03 17:30:50 +00:00
|
|
|
package test
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2025-03-11 16:31:06 +00:00
|
|
|
"os"
|
|
|
|
|
"path"
|
2025-03-05 12:05:46 +00:00
|
|
|
"testing"
|
|
|
|
|
|
2025-02-03 17:30:50 +00:00
|
|
|
"queryorchestration/internal/serviceconfig"
|
2025-02-05 12:52:41 +00:00
|
|
|
"queryorchestration/internal/serviceconfig/aws"
|
|
|
|
|
"queryorchestration/internal/serviceconfig/database"
|
2025-03-11 16:31:06 +00:00
|
|
|
"queryorchestration/internal/serviceconfig/objectstore"
|
|
|
|
|
queryservice "queryorchestration/pkg/queryService"
|
2025-02-03 17:30:50 +00:00
|
|
|
|
2025-03-04 15:51:03 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2025-02-03 17:30:50 +00:00
|
|
|
"github.com/testcontainers/testcontainers-go"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type EcosystemConfig struct {
|
|
|
|
|
Services map[Service]*Container
|
|
|
|
|
Runners map[Runner]*Container
|
2025-02-05 12:52:41 +00:00
|
|
|
Cfg serviceconfig.ConfigProvider
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type EcosystemNetworkConfig struct {
|
2025-02-05 12:52:41 +00:00
|
|
|
Runners []*RunnerNetworkConfig
|
|
|
|
|
Services []*ServiceNetworkConfig
|
|
|
|
|
Cfg serviceconfig.ConfigProvider
|
2025-03-11 16:31:06 +00:00
|
|
|
Dependencies *Dependencies
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
2025-02-14 10:56:24 +00:00
|
|
|
func CreateRunnersAndServicesNetwork(t testing.TB, ctx context.Context, ncfg *EcosystemNetworkConfig) (*EcosystemConfig, func()) {
|
2025-03-11 16:31:06 +00:00
|
|
|
if ncfg.Dependencies == nil {
|
|
|
|
|
ncfg.Dependencies = &Dependencies{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
network := ncfg.Dependencies.Network
|
2025-02-03 17:30:50 +00:00
|
|
|
var ncleanup func()
|
|
|
|
|
if network == nil {
|
|
|
|
|
network, ncleanup = CreateNetwork(t, ctx)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, dbcleanup := CreateDB(t, ctx, &CreateDatabaseConfig{
|
|
|
|
|
Network: network,
|
|
|
|
|
Cfg: ncfg.Cfg,
|
|
|
|
|
RunMigrations: true,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
ss := make(map[string]*Container, len(ncfg.Services))
|
|
|
|
|
sclean := make([]func(), len(ncfg.Services))
|
|
|
|
|
for i, s := range ncfg.Services {
|
|
|
|
|
c, ccleanup := CreateService(t, ctx, &ServiceConfig{
|
|
|
|
|
Name: s.Name,
|
|
|
|
|
Env: s.Env,
|
|
|
|
|
Cfg: ncfg.Cfg,
|
|
|
|
|
Network: network,
|
|
|
|
|
})
|
|
|
|
|
ss[s.Name] = c
|
|
|
|
|
sclean[i] = ccleanup
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var qcleanup func()
|
2025-03-11 16:31:06 +00:00
|
|
|
if ncfg.Dependencies.AWSConfig == nil {
|
2025-02-05 12:52:41 +00:00
|
|
|
_, qcleanup = CreateAWSContainer(t, ctx, &CreateAWSConfig{
|
2025-02-03 17:30:50 +00:00
|
|
|
Network: network,
|
|
|
|
|
Cfg: ncfg.Cfg,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:52:41 +00:00
|
|
|
if ncfg.Cfg.GetQueueClient() == nil {
|
2025-03-11 16:31:06 +00:00
|
|
|
SetQueueClient(t, ctx, ncfg.Cfg)
|
2025-02-05 12:52:41 +00:00
|
|
|
}
|
|
|
|
|
|
2025-02-03 17:30:50 +00:00
|
|
|
qs := make(map[string]*Container, len(ncfg.Runners))
|
|
|
|
|
qclean := make([]func(), len(ncfg.Runners))
|
|
|
|
|
for i, r := range ncfg.Runners {
|
2025-03-11 16:31:06 +00:00
|
|
|
url := ncfg.Dependencies.QueueURLs[r.Name]
|
|
|
|
|
if url == "" {
|
|
|
|
|
url = CreateQueue(t, ctx, ncfg.Cfg, r.Name)
|
2025-02-13 00:23:13 +00:00
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
|
|
|
|
c, ccleanup := CreateRunner(t, ctx, &RunnerConfig{
|
|
|
|
|
Name: r.Name,
|
|
|
|
|
Env: r.Env,
|
2025-03-11 16:31:06 +00:00
|
|
|
QueueURL: url,
|
2025-02-03 17:30:50 +00:00
|
|
|
Cfg: ncfg.Cfg,
|
|
|
|
|
Network: network,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
qs[r.Name] = c
|
|
|
|
|
qclean[i] = ccleanup
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &EcosystemConfig{
|
|
|
|
|
Services: ss,
|
|
|
|
|
Runners: qs,
|
|
|
|
|
}, func() {
|
|
|
|
|
for _, c := range sclean {
|
|
|
|
|
c()
|
|
|
|
|
}
|
|
|
|
|
for _, c := range qclean {
|
|
|
|
|
c()
|
|
|
|
|
}
|
|
|
|
|
dbcleanup()
|
|
|
|
|
if qcleanup != nil {
|
|
|
|
|
qcleanup()
|
|
|
|
|
}
|
|
|
|
|
if ncleanup != nil {
|
|
|
|
|
ncleanup()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-11 16:31:06 +00:00
|
|
|
func SetCfgProviderWithBasePath(t testing.TB, cfg serviceconfig.ConfigProvider, basePath string) {
|
|
|
|
|
SetCfgProvider(t, cfg)
|
|
|
|
|
|
|
|
|
|
cfg.SetBasePath(path.Join(os.Getenv("PWD"), basePath))
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-14 10:56:24 +00:00
|
|
|
func SetCfgProvider(t testing.TB, cfg serviceconfig.ConfigProvider) {
|
2025-02-05 12:52:41 +00:00
|
|
|
cfg.SetAWSConfig(&aws.AWSConfig{
|
|
|
|
|
AWSKeyID: "test",
|
|
|
|
|
AWSSecretKey: "test",
|
|
|
|
|
AWSRegion: "us-east-1",
|
|
|
|
|
})
|
|
|
|
|
t.Setenv("AWS_ACCESS_KEY_ID", cfg.GetAWSKeyID())
|
|
|
|
|
t.Setenv("AWS_SECRET_ACCESS_KEY", cfg.GetAWSSecretKey())
|
|
|
|
|
t.Setenv("AWS_SESSION_TOKEN", cfg.GetAWSSessionToken())
|
|
|
|
|
t.Setenv("AWS_REGION", cfg.GetAWSRegion())
|
|
|
|
|
t.Setenv("AWS_DEFAULT_REGION", cfg.GetAWSRegion())
|
|
|
|
|
|
|
|
|
|
cfg.SetDBConfig(&database.DBConfig{
|
|
|
|
|
DBUser: "invalid_user",
|
|
|
|
|
DBSecret: "invalid_pass",
|
|
|
|
|
DBHost: "invalid_host",
|
|
|
|
|
DBPort: 5432,
|
|
|
|
|
DBName: "invalid_name",
|
|
|
|
|
DBNoSSL: true,
|
|
|
|
|
})
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ServiceNetworkConfig struct {
|
2025-02-12 19:00:25 +00:00
|
|
|
Cfg serviceconfig.ConfigProvider
|
|
|
|
|
Network *testcontainers.DockerNetwork
|
|
|
|
|
Name Runner
|
|
|
|
|
Env map[string]string
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
2025-02-14 10:56:24 +00:00
|
|
|
func CreateServiceNetwork(t testing.TB, ctx context.Context, scfg *ServiceNetworkConfig) (*Container, func()) {
|
2025-02-12 19:00:25 +00:00
|
|
|
if scfg.Cfg == nil {
|
|
|
|
|
scfg.Cfg = &serviceconfig.BaseConfig{}
|
|
|
|
|
SetCfgProvider(t, scfg.Cfg)
|
|
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
2025-02-12 19:00:25 +00:00
|
|
|
network := scfg.Network
|
|
|
|
|
var ncleanup func()
|
|
|
|
|
if network == nil {
|
|
|
|
|
network, ncleanup = CreateNetwork(t, ctx)
|
|
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
|
|
|
|
_, dbcleanup := CreateDB(t, ctx, &CreateDatabaseConfig{
|
|
|
|
|
Network: network,
|
2025-02-12 19:00:25 +00:00
|
|
|
Cfg: scfg.Cfg,
|
2025-02-03 17:30:50 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
c, ccleanup := CreateService(t, ctx, &ServiceConfig{
|
|
|
|
|
Name: scfg.Name,
|
|
|
|
|
Env: scfg.Env,
|
2025-02-12 19:00:25 +00:00
|
|
|
Cfg: scfg.Cfg,
|
2025-02-03 17:30:50 +00:00
|
|
|
Network: network,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return c, func() {
|
|
|
|
|
dbcleanup()
|
|
|
|
|
ccleanup()
|
2025-02-12 19:00:25 +00:00
|
|
|
if ncleanup != nil {
|
|
|
|
|
ncleanup()
|
|
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type RunnerNetworkConfig struct {
|
2025-02-05 12:52:41 +00:00
|
|
|
Network *testcontainers.DockerNetwork
|
|
|
|
|
AWSContainer *AWSContainerConfig
|
2025-02-13 00:23:13 +00:00
|
|
|
QueueURL *string
|
2025-02-05 12:52:41 +00:00
|
|
|
Cfg serviceconfig.ConfigProvider
|
|
|
|
|
Name Runner
|
|
|
|
|
Env map[string]string
|
2025-02-03 17:30:50 +00:00
|
|
|
}
|
|
|
|
|
|
2025-02-14 10:56:24 +00:00
|
|
|
func CreateRunnerNetwork(t testing.TB, ctx context.Context, rcfg *RunnerNetworkConfig) (*Container, func()) {
|
2025-02-03 17:30:50 +00:00
|
|
|
network := rcfg.Network
|
|
|
|
|
var ncleanup func()
|
|
|
|
|
if network == nil {
|
|
|
|
|
network, ncleanup = CreateNetwork(t, ctx)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var qcleanup func()
|
2025-02-05 12:52:41 +00:00
|
|
|
if rcfg.AWSContainer == nil {
|
|
|
|
|
_, qcleanup = CreateAWSContainer(t, ctx, &CreateAWSConfig{
|
2025-02-03 17:30:50 +00:00
|
|
|
Network: network,
|
|
|
|
|
Cfg: rcfg.Cfg,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-05 12:52:41 +00:00
|
|
|
if rcfg.Cfg.GetQueueClient() == nil {
|
|
|
|
|
err := rcfg.Cfg.SetQueueClient(ctx)
|
2025-03-04 15:51:03 +00:00
|
|
|
require.NoError(t, err)
|
2025-02-05 12:52:41 +00:00
|
|
|
}
|
|
|
|
|
|
2025-02-13 00:23:13 +00:00
|
|
|
url := rcfg.QueueURL
|
|
|
|
|
if url == nil {
|
|
|
|
|
u := CreateQueue(t, ctx, rcfg.Cfg, rcfg.Name)
|
|
|
|
|
url = &u
|
|
|
|
|
}
|
2025-02-03 17:30:50 +00:00
|
|
|
|
|
|
|
|
_, dbcleanup := CreateDB(t, ctx, &CreateDatabaseConfig{
|
|
|
|
|
Network: network,
|
|
|
|
|
Cfg: rcfg.Cfg,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
c, ccleanup := CreateRunner(t, ctx, &RunnerConfig{
|
|
|
|
|
Name: rcfg.Name,
|
|
|
|
|
Env: rcfg.Env,
|
2025-02-13 00:23:13 +00:00
|
|
|
QueueURL: *url,
|
2025-02-03 17:30:50 +00:00
|
|
|
Cfg: rcfg.Cfg,
|
|
|
|
|
Network: network,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return c, func() {
|
|
|
|
|
ccleanup()
|
|
|
|
|
dbcleanup()
|
|
|
|
|
if qcleanup != nil {
|
|
|
|
|
qcleanup()
|
|
|
|
|
}
|
|
|
|
|
if ncleanup != nil {
|
|
|
|
|
ncleanup()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-11 16:31:06 +00:00
|
|
|
|
|
|
|
|
type FullDependenciesConfig interface {
|
|
|
|
|
serviceconfig.ConfigProvider
|
|
|
|
|
objectstore.ConfigProvider
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Dependencies struct {
|
|
|
|
|
BucketName string
|
|
|
|
|
QueueURLs map[string]string
|
|
|
|
|
Network *testcontainers.DockerNetwork
|
|
|
|
|
AWSConfig *AWSContainerConfig
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateFullDependencies(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) (Dependencies, func()) {
|
|
|
|
|
network, ncleanup := CreateNetwork(t, ctx)
|
|
|
|
|
|
|
|
|
|
acfg, clean := CreateAWSContainer(t, ctx, &CreateAWSConfig{
|
|
|
|
|
Cfg: cfg,
|
|
|
|
|
Network: network,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
SetQueueClient(t, ctx, cfg)
|
|
|
|
|
SetStoreClient(t, ctx, cfg, acfg.ExternalEndpoint)
|
|
|
|
|
|
|
|
|
|
urls := map[string]string{}
|
|
|
|
|
urls[DocInitRunner] = CreateQueue(t, ctx, cfg, DocInitRunner)
|
|
|
|
|
urls[DocSyncRunner] = CreateQueue(t, ctx, cfg, DocSyncRunner)
|
|
|
|
|
urls[DocCleanRunner] = CreateQueue(t, ctx, cfg, DocCleanRunner)
|
|
|
|
|
urls[DocTextRunner] = CreateQueue(t, ctx, cfg, DocTextRunner)
|
|
|
|
|
urls[QuerySyncRunner] = CreateQueue(t, ctx, cfg, QuerySyncRunner)
|
|
|
|
|
urls[QueryRunner] = CreateQueue(t, ctx, cfg, QueryRunner)
|
|
|
|
|
urls[ClientSyncRunner] = CreateQueue(t, ctx, cfg, ClientSyncRunner)
|
|
|
|
|
urls[QueryVersionSyncRunner] = CreateQueue(t, ctx, cfg, QueryVersionSyncRunner)
|
|
|
|
|
|
|
|
|
|
bucketName := "docinitbucket"
|
|
|
|
|
CreateBucket(t, ctx, cfg, bucketName)
|
|
|
|
|
SetBucketNotifs(t, ctx, cfg, bucketName)
|
|
|
|
|
|
|
|
|
|
return Dependencies{
|
|
|
|
|
BucketName: bucketName,
|
|
|
|
|
QueueURLs: urls,
|
|
|
|
|
Network: network,
|
|
|
|
|
AWSConfig: acfg,
|
|
|
|
|
}, func() {
|
|
|
|
|
ncleanup()
|
|
|
|
|
clean()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Network struct {
|
|
|
|
|
Dependencies Dependencies
|
|
|
|
|
Network EcosystemConfig
|
|
|
|
|
Client *queryservice.ClientWithResponses
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CreateFullNetwork(t testing.TB, ctx context.Context, cfg FullDependenciesConfig) (Network, func()) {
|
|
|
|
|
deps, clean := CreateFullDependencies(t, ctx, cfg)
|
|
|
|
|
|
|
|
|
|
net, cleanup := CreateRunnersAndServicesNetwork(t, ctx, &EcosystemNetworkConfig{
|
|
|
|
|
Cfg: cfg,
|
|
|
|
|
Dependencies: &deps,
|
|
|
|
|
Runners: []*RunnerNetworkConfig{
|
|
|
|
|
{
|
|
|
|
|
Name: DocInitRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"DOCUMENT_SYNC_URL": deps.QueueURLs[DocSyncRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: DocSyncRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"DOCUMENT_CLEAN_URL": deps.QueueURLs[DocCleanRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: DocCleanRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"DOCUMENT_TEXT_URL": deps.QueueURLs[DocTextRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: DocTextRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"QUERY_SYNC_URL": deps.QueueURLs[QuerySyncRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: QuerySyncRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"QUERY_URL": deps.QueueURLs[QueryRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: QueryRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"QUERY_URL": deps.QueueURLs[QueryRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: ClientSyncRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"DOCUMENT_SYNC_URL": deps.QueueURLs[DocSyncRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Name: QueryVersionSyncRunner,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"CLIENT_SYNC_URL": deps.QueueURLs[ClientSyncRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Services: []*ServiceNetworkConfig{
|
|
|
|
|
{
|
|
|
|
|
Name: QueryService,
|
|
|
|
|
Env: map[string]string{
|
|
|
|
|
"CLIENT_SYNC_URL": deps.QueueURLs[ClientSyncRunner],
|
|
|
|
|
"QUERY_VERSION_SYNC_URL": deps.QueueURLs[QueryVersionSyncRunner],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
qService, err := queryservice.NewClientWithResponses(net.Services[QueryService].URI)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
return Network{
|
|
|
|
|
Dependencies: deps,
|
|
|
|
|
Network: *net,
|
|
|
|
|
Client: qService,
|
|
|
|
|
}, func() {
|
|
|
|
|
cleanup()
|
|
|
|
|
clean()
|
|
|
|
|
}
|
|
|
|
|
}
|