Skip to content

Commit bdbc262

Browse files
e2e: isolate Docker networks for parallel integration tests
Use a per-test network name derived from t.Name() with e2e.WithName, since bare e2e.New() hashes runtime.Caller(3) and collides on testing.tRunner for every test. Derive TLS/OIDC hostnames from e.Name() via getContainerName, drop fixed env name constants, and align Dex/tenant API host with the observatorium-api runnable.
1 parent 4f749a8 commit bdbc262

13 files changed

Lines changed: 66 additions & 88 deletions

test/e2e/alerts_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ import (
2424
func TestAlertmanagerApiProxy(t *testing.T) {
2525
t.Parallel()
2626

27-
e, err := e2e.New(e2e.WithName(envAlertmanagerName))
27+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
2828
testutil.Ok(t, err)
2929
t.Cleanup(e.Close)
3030

31-
prepareConfigsAndCerts(t, alerts, e)
32-
_, token, rateLimiterAddr := startBaseServices(t, e, alerts)
31+
prepareConfigsAndCerts(t, e)
32+
_, token, rateLimiterAddr := startBaseServices(t, e)
3333
alertmanagerEndpoint := newAlertmanagerService(e)
3434
readEndpoint, writeEndpoint, _ := startServicesForMetrics(t, e)
3535
testutil.Ok(t, e2e.StartAndWaitReady(alertmanagerEndpoint))

test/e2e/configs.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@ const (
3131
certsSharedDir = "certs"
3232
configSharedDir = "config"
3333

34-
envMetricsName = "metrics"
35-
envRulesAPIName = "rules-api"
36-
envAlertmanagerName = "alertmanager-api"
37-
envLogsName = "logs-tail"
38-
envTracesName = "traces-export"
39-
envTracesTempoName = "traces-tempo"
40-
envTracesTemplateName = "traces-template"
41-
envTenantsName = "tenants"
42-
envInteractive = "interactive"
43-
envProbesName = "probes"
44-
4534
defaultTenantID = "1610b0c3-c509-4592-a256-a1871353dbfa"
4635
mtlsTenantID = "845cdfd9-f936-443c-979c-2ee7dc91f646"
4736

test/e2e/helpers.go

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package e2e
44

55
import (
6+
"crypto/sha256"
67
"crypto/tls"
78
"crypto/x509"
89
"encoding/json"
@@ -21,16 +22,26 @@ import (
2122
"github.com/observatorium/api/test/testtls"
2223
)
2324

25+
// uniqueE2ENetworkName returns a Docker-valid e2e network name (≤16 chars, [-a-zA-Z0-9])
26+
// that is distinct for each Go test. efficientgo/e2e's default name hashes runtime.Caller(3),
27+
// which resolves to testing.tRunner for every test, so bare e2e.New() would assign the same
28+
// network to all parallel tests and reproduce Docker network races.
29+
func uniqueE2ENetworkName(t *testing.T) string {
30+
t.Helper()
31+
sum := sha256.Sum256([]byte(t.Name()))
32+
return fmt.Sprintf("%x", sum[:8]) // 16 hex digits
33+
}
34+
2435
// Generates certificates and copies static configuration to the shared directory.
25-
func prepareConfigsAndCerts(t *testing.T, tt testType, e e2e.Environment) {
36+
func prepareConfigsAndCerts(t *testing.T, e e2e.Environment) {
2637
testutil.Ok(
2738
t,
2839
testtls.GenerateCerts(
2940
filepath.Join(e.SharedDir(), certsSharedDir),
30-
getContainerName(t, tt, "observatorium-api"),
31-
[]string{getContainerName(t, tt, "observatorium-api"), "127.0.0.1"},
32-
getContainerName(t, tt, "dex"),
33-
[]string{getContainerName(t, tt, "dex"), "127.0.0.1"},
41+
getContainerName(e, "observatorium-api"),
42+
[]string{getContainerName(e, "observatorium-api"), "127.0.0.1"},
43+
getContainerName(e, "dex"),
44+
[]string{getContainerName(e, "dex"), "127.0.0.1"},
3445
),
3546
)
3647

@@ -82,32 +93,10 @@ func obtainToken(endpoint string, tlsConf *tls.Config) (string, error) {
8293
return t.IDToken, nil
8394
}
8495

85-
func getContainerName(t *testing.T, tt testType, serviceName string) string {
86-
switch tt {
87-
case logs:
88-
return envLogsName + "-" + serviceName
89-
case metrics:
90-
return envMetricsName + "-" + serviceName
91-
case rules:
92-
return envRulesAPIName + "-" + serviceName
93-
case alerts:
94-
return envAlertmanagerName + "-" + serviceName
95-
case tenants:
96-
return envTenantsName + "-" + serviceName
97-
case interactive:
98-
return envInteractive + "-" + serviceName
99-
case probes:
100-
return envProbesName + "-" + serviceName
101-
case traces:
102-
return envTracesName + "-" + serviceName
103-
case tracesTemplate:
104-
return envTracesTemplateName + "-" + serviceName
105-
case tracesTempo:
106-
return envTracesTempoName + "-" + serviceName
107-
default:
108-
t.Fatal("invalid test type provided")
109-
return ""
110-
}
96+
// getContainerName returns the Docker DNS hostname for a service in this environment.
97+
// It must match e2e's naming ({networkName}-{runnableName}) so TLS SANs and OIDC redirects stay correct.
98+
func getContainerName(e e2e.Environment, serviceName string) string {
99+
return e.Name() + "-" + serviceName
111100
}
112101

113102
func getTLSClientConfig(t *testing.T, e e2e.Environment) *tls.Config {

test/e2e/interactive_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ import (
1414
func TestInteractiveSetup(t *testing.T) {
1515
fmt.Printf("Starting services...\n")
1616

17-
e, err := e2e.New(e2e.WithName(envInteractive))
17+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
1818
testutil.Ok(t, err)
1919
t.Cleanup(e.Close)
2020

21-
prepareConfigsAndCerts(t, interactive, e)
22-
_, token, rateLimiterAddr := startBaseServices(t, e, interactive)
21+
prepareConfigsAndCerts(t, e)
22+
_, token, rateLimiterAddr := startBaseServices(t, e)
2323
readEndpoint, writeEndpoint, readExtEndpoint := startServicesForMetrics(t, e)
2424
logsEndpoint, logsExtEndpoint := startServicesForLogs(t, e)
2525
rulesEndpoint := startServicesForRules(t, e)

test/e2e/logs_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ import (
1818
func TestLogs(t *testing.T) {
1919
t.Parallel()
2020

21-
e, err := e2e.New(e2e.WithName(envLogsName))
21+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
2222
testutil.Ok(t, err)
2323
t.Cleanup(e.Close)
2424

25-
prepareConfigsAndCerts(t, logs, e)
26-
_, token, rateLimiterAddr := startBaseServices(t, e, logs)
25+
prepareConfigsAndCerts(t, e)
26+
_, token, rateLimiterAddr := startBaseServices(t, e)
2727
logsEndpoint, logsExtEndpoint := startServicesForLogs(t, e)
2828

2929
api, err := newObservatoriumAPIService(

test/e2e/metrics_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ import (
2424
func TestMetricsReadAndWrite(t *testing.T) {
2525
t.Parallel()
2626

27-
e, err := e2e.New(e2e.WithName(envMetricsName))
27+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
2828
testutil.Ok(t, err)
2929
t.Cleanup(e.Close)
3030

31-
prepareConfigsAndCerts(t, metrics, e)
32-
_, token, rateLimiterAddr := startBaseServices(t, e, metrics)
31+
prepareConfigsAndCerts(t, e)
32+
_, token, rateLimiterAddr := startBaseServices(t, e)
3333
readEndpoint, writeEndpoint, readExtEndpoint := startServicesForMetrics(t, e)
3434

3535
api, err := newObservatoriumAPIService(

test/e2e/openapi_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import (
1515
func TestOpenAPIEndpoint(t *testing.T) {
1616
t.Parallel()
1717

18-
e, err := e2e.New(e2e.WithName(envMetricsName))
18+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
1919
testutil.Ok(t, err)
2020
t.Cleanup(e.Close)
2121

22-
prepareConfigsAndCerts(t, metrics, e)
23-
_, _, _ = startBaseServices(t, e, metrics)
22+
prepareConfigsAndCerts(t, e)
23+
_, _, _ = startBaseServices(t, e)
2424
readEndpoint, writeEndpoint, _ := startServicesForMetrics(t, e)
2525

2626
api, err := newObservatoriumAPIService(

test/e2e/probes_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import (
1515
)
1616

1717
func TestProbes_CreateAndGetProbe(t *testing.T) {
18-
e, err := e2e.New(e2e.WithName(envProbesName))
18+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
1919
testutil.Ok(t, err)
2020
t.Cleanup(e.Close)
2121

22-
prepareConfigsAndCerts(t, probes, e)
23-
_, token, rateLimiterAddr := startBaseServices(t, e, probes)
22+
prepareConfigsAndCerts(t, e)
23+
_, token, rateLimiterAddr := startBaseServices(t, e)
2424
probesEndpoint := startServicesForProbes(t, e)
2525

2626
api, err := newObservatoriumAPIService(
@@ -112,12 +112,12 @@ func TestProbes_CreateAndGetProbe(t *testing.T) {
112112
}
113113

114114
func TestProbes_ListProbes(t *testing.T) {
115-
e, err := e2e.New(e2e.WithName(envProbesName))
115+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
116116
testutil.Ok(t, err)
117117
t.Cleanup(e.Close)
118118

119-
prepareConfigsAndCerts(t, probes, e)
120-
_, token, rateLimiterAddr := startBaseServices(t, e, probes)
119+
prepareConfigsAndCerts(t, e)
120+
_, token, rateLimiterAddr := startBaseServices(t, e)
121121
probesEndpoint := startServicesForProbes(t, e)
122122

123123
api, err := newObservatoriumAPIService(
@@ -218,12 +218,12 @@ func TestProbes_ListProbes(t *testing.T) {
218218
}
219219

220220
func TestProbes_CreateProbeConflict(t *testing.T) {
221-
e, err := e2e.New(e2e.WithName(envProbesName))
221+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
222222
testutil.Ok(t, err)
223223
t.Cleanup(e.Close)
224224

225-
prepareConfigsAndCerts(t, probes, e)
226-
_, token, rateLimiterAddr := startBaseServices(t, e, probes)
225+
prepareConfigsAndCerts(t, e)
226+
_, token, rateLimiterAddr := startBaseServices(t, e)
227227
probesEndpoint := startServicesForProbes(t, e)
228228

229229
api, err := newObservatoriumAPIService(
@@ -282,12 +282,12 @@ func TestProbes_CreateProbeConflict(t *testing.T) {
282282
}
283283

284284
func TestProbes_UnauthorizedAccess(t *testing.T) {
285-
e, err := e2e.New(e2e.WithName(envProbesName))
285+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
286286
testutil.Ok(t, err)
287287
t.Cleanup(e.Close)
288288

289-
prepareConfigsAndCerts(t, probes, e)
290-
_, _, rateLimiterAddr := startBaseServices(t, e, probes)
289+
prepareConfigsAndCerts(t, e)
290+
_, _, rateLimiterAddr := startBaseServices(t, e)
291291
probesEndpoint := startServicesForProbes(t, e)
292292

293293
api, err := newObservatoriumAPIService(

test/e2e/redis_rate_limiter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
func TestRedisRateLimiter_GetRateLimits(t *testing.T) {
1818
t.Parallel()
1919
// Start isolated environment with given ref.
20-
e, err := e2e.New(e2e.WithName("redis-rate-li"))
20+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
2121
testutil.Ok(t, err)
2222
t.Cleanup(e.Close)
2323

test/e2e/rules_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ const metricsNilRulesYamlTpl = ``
110110
func TestRulesAPI(t *testing.T) {
111111
t.Parallel()
112112

113-
e, err := e2e.New(e2e.WithName(envRulesAPIName))
113+
e, err := e2e.New(e2e.WithName(uniqueE2ENetworkName(t)))
114114
testutil.Ok(t, err)
115115
t.Cleanup(e.Close)
116116

117-
prepareConfigsAndCerts(t, rules, e)
118-
_, token, rateLimiterAddr := startBaseServices(t, e, rules)
117+
prepareConfigsAndCerts(t, e)
118+
_, token, rateLimiterAddr := startBaseServices(t, e)
119119
metricsRulesEndpoint := startServicesForRules(t, e)
120120
logsRulesEndpoint, _ := startServicesForLogs(t, e)
121121

0 commit comments

Comments
 (0)