integration: standardize test infrastructure options

Make embedded DERP server and TLS the default configuration for all
integration tests, replacing the per-test opt-in model that led to
inconsistent and flaky test behavior.

Infrastructure changes:
- DefaultConfigEnv() includes embedded DERP server settings
- New() auto-generates a proper CA + server TLS certificate pair
- CA cert is installed into container trust stores and returned by
  GetCert() so clients and internal tools (curl) trust the server
- CreateCertificate() now returns (caCert, cert, key) instead of
  discarding the CA certificate
- Add WithPublicDERP() and WithoutTLS() opt-out options
- Remove WithTLS(), WithEmbeddedDERPServerOnly(), and WithDERPAsIP()
  since all their behavior is now the default or unnecessary

Test cleanup:
- Remove all redundant WithTLS/WithEmbeddedDERPServerOnly/WithDERPAsIP
  calls from test files
- Give every test a unique WithTestName by parameterizing aclScenario,
  sshScenario, and derpServerScenario helpers
- Add WithTestName to tests that were missing it
- Document all non-standard options with inline comments explaining
  why each is needed

Updates #3139
This commit is contained in:
Kristoffer Dalby
2026-03-16 09:15:46 +00:00
parent 87b8507ac9
commit e5ebe3205a
18 changed files with 209 additions and 236 deletions

View File

@@ -40,6 +40,7 @@ type DERPServerInContainer struct {
stunPort int
derpPort int
caCerts [][]byte
tlsCACert []byte
tlsCert []byte
tlsKey []byte
withExtraHosts []string
@@ -160,22 +161,27 @@ func New(
hostname = fmt.Sprintf("derp-%s-%s", strings.ReplaceAll(version, ".", "-"), hash)
}
tlsCert, tlsKey, err := integrationutil.CreateCertificate(hostname)
tlsCACert, tlsCert, tlsKey, err := integrationutil.CreateCertificate(hostname)
if err != nil {
return nil, fmt.Errorf("creating certificates for headscale test: %w", err)
return nil, fmt.Errorf("creating certificates for derp test: %w", err)
}
dsic := &DERPServerInContainer{
version: version,
hostname: hostname,
pool: pool,
networks: networks,
tlsCert: tlsCert,
tlsKey: tlsKey,
stunPort: 3478, //nolint
derpPort: 443, //nolint
version: version,
hostname: hostname,
pool: pool,
networks: networks,
tlsCACert: tlsCACert,
tlsCert: tlsCert,
tlsKey: tlsKey,
stunPort: 3478, //nolint
derpPort: 443, //nolint
}
// Install the CA cert so the DERP server trusts its own certificate
// and any headscale CA certs passed via WithCACert.
dsic.caCerts = append(dsic.caCerts, tlsCACert)
for _, opt := range opts {
opt(dsic)
}
@@ -297,9 +303,10 @@ func (t *DERPServerInContainer) Shutdown() error {
return t.pool.Purge(t.container)
}
// GetCert returns the TLS certificate of the DERPer instance.
// GetCert returns the CA certificate that clients should trust to
// verify this DERP server's TLS certificate.
func (t *DERPServerInContainer) GetCert() []byte {
return t.tlsCert
return t.tlsCACert
}
// Hostname returns the hostname of the DERPer instance.