Skip to content

Commit 612cef3

Browse files
authored
test: Use Self-Signed Certificates to Use Exporter with TLS in E2E Tests (#12)
1 parent 57d0f7c commit 612cef3

File tree

6 files changed

+119
-21
lines changed

6 files changed

+119
-21
lines changed

internal/e2e/containers.go

Lines changed: 93 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ package e2e
1818

1919
import (
2020
"context"
21+
"errors"
2122
"log"
2223
"path/filepath"
2324
"time"
2425

26+
"github.com/mdelapenya/tlscert"
2527
"github.com/testcontainers/testcontainers-go"
2628
"github.com/testcontainers/testcontainers-go/wait"
2729
)
@@ -37,50 +39,91 @@ const (
3739

3840
func runReceivingSolarWindsOTELCollector(
3941
ctx context.Context,
42+
certDir string,
4043
networkName string,
4144
) (testcontainers.Container, error) {
4245
configPath, err := filepath.Abs(filepath.Join(".", "testdata", "receiving_collector.yaml"))
4346
if err != nil {
4447
return nil, err
4548
}
4649

47-
container, err := runSolarWindsOTELCollector(ctx, networkName, receivingContainer, configPath)
48-
return container, err
50+
// Used by the OTLP/gRPC Receiver for TLS (see its config).
51+
additionalFiles := []testcontainers.ContainerFile{
52+
{
53+
HostFilePath: filepath.Join(certDir, "cert-server.pem"),
54+
ContainerFilePath: "/opt/cert-server.pem",
55+
FileMode: 0o644,
56+
},
57+
{
58+
HostFilePath: filepath.Join(certDir, "key-server.pem"),
59+
ContainerFilePath: "/opt/key-server.pem",
60+
FileMode: 0o644,
61+
},
62+
}
63+
64+
return runSolarWindsOTELCollector(
65+
ctx,
66+
networkName,
67+
receivingContainer,
68+
configPath,
69+
additionalFiles,
70+
)
4971
}
5072

5173
func runTestedSolarWindsOTELCollector(
5274
ctx context.Context,
75+
certDir string,
5376
networkName string,
5477
) (testcontainers.Container, error) {
5578
configPath, err := filepath.Abs(filepath.Join(".", "testdata", "emitting_collector.yaml"))
5679
if err != nil {
5780
return nil, err
5881
}
5982

60-
container, err := runSolarWindsOTELCollector(ctx, networkName, testedContainer, configPath)
61-
return container, err
83+
// Add the root certificate for the self-signed certs as trusted.
84+
// Warning: This actually replaces all root certificates in the container.
85+
additionalFiles := []testcontainers.ContainerFile{
86+
{
87+
HostFilePath: filepath.Join(certDir, "cert-ca.pem"),
88+
ContainerFilePath: "/etc/ssl/certs/ca-certificates.crt",
89+
FileMode: 0o644,
90+
},
91+
}
92+
93+
return runSolarWindsOTELCollector(
94+
ctx,
95+
networkName,
96+
testedContainer,
97+
configPath,
98+
additionalFiles,
99+
)
62100
}
63101

64102
func runSolarWindsOTELCollector(
65103
ctx context.Context,
66104
networkName string,
67105
containerName string,
68106
configPath string,
107+
additionalFiles []testcontainers.ContainerFile,
69108
) (testcontainers.Container, error) {
70109
lc := new(logConsumer)
71110
lc.Prefix = containerName
111+
112+
files := []testcontainers.ContainerFile{
113+
{
114+
HostFilePath: configPath,
115+
ContainerFilePath: "/opt/default-config.yaml",
116+
FileMode: 0o440,
117+
},
118+
}
119+
files = append(files, additionalFiles...)
120+
72121
req := testcontainers.ContainerRequest{
73122
Image: "solarwinds-otel-collector:latest",
74123
LogConsumerCfg: &testcontainers.LogConsumerConfig{
75124
Consumers: []testcontainers.LogConsumer{lc},
76125
},
77-
Files: []testcontainers.ContainerFile{
78-
{
79-
HostFilePath: configPath,
80-
ContainerFilePath: "/opt/default-config.yaml",
81-
FileMode: 0o440,
82-
},
83-
},
126+
Files: files,
84127
WaitingFor: wait.ForLog("Everything is ready. Begin running and processing data."),
85128
Networks: []string{networkName},
86129
Name: containerName,
@@ -94,6 +137,45 @@ func runSolarWindsOTELCollector(
94137
return container, err
95138
}
96139

140+
type CertPaths struct {
141+
CaCertFile string
142+
CertFile string
143+
KeyFile string
144+
}
145+
146+
// generateCertificates generates a new CA certificate and a server
147+
// key and certificate derived from it for a given `host`.
148+
// All files are stored in a `path`. All paths of files written are
149+
// returned in a CertPaths struct.
150+
func generateCertificates(host, path string) (*CertPaths, error) {
151+
caCert := tlscert.SelfSignedFromRequest(tlscert.Request{
152+
Name: "ca",
153+
Host: host,
154+
IsCA: true,
155+
ParentDir: path,
156+
})
157+
if caCert == nil {
158+
return nil, errors.New("failed to generate ca certificate")
159+
}
160+
161+
cert := tlscert.SelfSignedFromRequest(tlscert.Request{
162+
Name: "server",
163+
Host: host,
164+
IsCA: true,
165+
Parent: caCert,
166+
ParentDir: path,
167+
})
168+
if cert == nil {
169+
return nil, errors.New("failed to generate server certificate")
170+
}
171+
172+
return &CertPaths{
173+
CaCertFile: caCert.CertPath,
174+
CertFile: cert.CertPath,
175+
KeyFile: cert.KeyPath,
176+
}, nil
177+
}
178+
97179
func runGeneratorContainer(
98180
ctx context.Context,
99181
networkName string,

internal/e2e/go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/solarwinds/solarwinds-otel-collector/internal/e2e
33
go 1.23.4
44

55
require (
6+
github.com/mdelapenya/tlscert v0.1.0
67
github.com/stretchr/testify v1.10.0
78
github.com/testcontainers/testcontainers-go v0.34.0
89
go.opentelemetry.io/collector/pdata v1.19.0

internal/e2e/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ
6666
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
6767
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
6868
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
69+
github.com/mdelapenya/tlscert v0.1.0 h1:YTpF579PYUX475eOL+6zyEO3ngLTOUWck78NBuJVXaM=
70+
github.com/mdelapenya/tlscert v0.1.0/go.mod h1:wrbyM/DwbFCeCeqdPX/8c6hNOqQgbf0rUDErE1uD+64=
6971
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
7072
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
7173
github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=

internal/e2e/signals_processing_test.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,12 @@ import (
2727
"time"
2828

2929
"github.com/stretchr/testify/require"
30+
"github.com/testcontainers/testcontainers-go"
31+
"github.com/testcontainers/testcontainers-go/network"
3032
"go.opentelemetry.io/collector/pdata/pcommon"
3133
"go.opentelemetry.io/collector/pdata/plog"
3234
"go.opentelemetry.io/collector/pdata/pmetric"
3335
"go.opentelemetry.io/collector/pdata/ptrace"
34-
35-
"github.com/testcontainers/testcontainers-go"
36-
"github.com/testcontainers/testcontainers-go/network"
3736
)
3837

3938
const (
@@ -48,11 +47,15 @@ func TestMetricStream(t *testing.T) {
4847
require.NoError(t, err)
4948
testcontainers.CleanupNetwork(t, net)
5049

51-
rContainer, err := runReceivingSolarWindsOTELCollector(ctx, net.Name)
50+
certPath := t.TempDir()
51+
_, err = generateCertificates(receivingContainer, certPath)
52+
require.NoError(t, err)
53+
54+
rContainer, err := runReceivingSolarWindsOTELCollector(ctx, certPath, net.Name)
5255
require.NoError(t, err)
5356
testcontainers.CleanupContainer(t, rContainer)
5457

55-
eContainer, err := runTestedSolarWindsOTELCollector(ctx, net.Name)
58+
eContainer, err := runTestedSolarWindsOTELCollector(ctx, certPath, net.Name)
5659
require.NoError(t, err)
5760
testcontainers.CleanupContainer(t, eContainer)
5861

@@ -80,11 +83,15 @@ func TestTracesStream(t *testing.T) {
8083
require.NoError(t, err)
8184
testcontainers.CleanupNetwork(t, net)
8285

83-
rContainer, err := runReceivingSolarWindsOTELCollector(ctx, net.Name)
86+
certPath := t.TempDir()
87+
_, err = generateCertificates(receivingContainer, certPath)
88+
require.NoError(t, err)
89+
90+
rContainer, err := runReceivingSolarWindsOTELCollector(ctx, certPath, net.Name)
8491
require.NoError(t, err)
8592
testcontainers.CleanupContainer(t, rContainer)
8693

87-
eContainer, err := runTestedSolarWindsOTELCollector(ctx, net.Name)
94+
eContainer, err := runTestedSolarWindsOTELCollector(ctx, certPath, net.Name)
8895
require.NoError(t, err)
8996
testcontainers.CleanupContainer(t, eContainer)
9097

@@ -114,11 +121,15 @@ func TestLogsStream(t *testing.T) {
114121
require.NoError(t, err)
115122
testcontainers.CleanupNetwork(t, net)
116123

117-
rContainer, err := runReceivingSolarWindsOTELCollector(ctx, net.Name)
124+
certPath := t.TempDir()
125+
_, err = generateCertificates(receivingContainer, certPath)
126+
require.NoError(t, err)
127+
128+
rContainer, err := runReceivingSolarWindsOTELCollector(ctx, certPath, net.Name)
118129
require.NoError(t, err)
119130
testcontainers.CleanupContainer(t, rContainer)
120131

121-
eContainer, err := runTestedSolarWindsOTELCollector(ctx, net.Name)
132+
eContainer, err := runTestedSolarWindsOTELCollector(ctx, certPath, net.Name)
122133
require.NoError(t, err)
123134
testcontainers.CleanupContainer(t, eContainer)
124135

internal/e2e/testdata/emitting_collector.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ extensions:
2222
token: <no-matter-in-test>
2323
collector_name: "testing_collector_name"
2424
endpoint_url_override: receiver:17016
25-
insecure: true
2625

2726
exporters:
2827
solarwinds:

internal/e2e/testdata/receiving_collector.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ receivers:
1515
protocols:
1616
grpc:
1717
endpoint: :17016
18+
tls:
19+
cert_file: /opt/cert-server.pem
20+
key_file: /opt/key-server.pem
1821
exporters:
1922
file:
2023
path: /tmp/result.json

0 commit comments

Comments
 (0)