Skip to content

Commit b90db6c

Browse files
committed
chore: added e2e tests for extensions
Signed-off-by: Ankit152 <[email protected]>
1 parent 619128f commit b90db6c

File tree

8 files changed

+377
-123
lines changed

8 files changed

+377
-123
lines changed

.chloggen/service-extension.yaml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: enhancement
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: collector
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: support for creating a service for extensions when ports are specified.
9+
10+
# One or more tracking issues related to the change
11+
issues: [3460]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext:

apis/v1beta1/config.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -327,10 +327,14 @@ func (c *Config) GetExtensionPorts(logger logr.Logger) ([]corev1.ServicePort, er
327327
return c.getPortsForComponentKinds(logger, KindExtension)
328328
}
329329

330-
func (c *Config) GetAllPorts(logger logr.Logger) ([]corev1.ServicePort, error) {
330+
func (c *Config) GetReceiverAndExporterPorts(logger logr.Logger) ([]corev1.ServicePort, error) {
331331
return c.getPortsForComponentKinds(logger, KindReceiver, KindExporter)
332332
}
333333

334+
func (c *Config) GetAllPorts(logger logr.Logger) ([]corev1.ServicePort, error) {
335+
return c.getPortsForComponentKinds(logger, KindReceiver, KindExporter, KindExtension)
336+
}
337+
334338
func (c *Config) GetEnvironmentVariables(logger logr.Logger) ([]corev1.EnvVar, error) {
335339
return c.getEnvironmentVariablesForComponentKinds(logger, KindReceiver)
336340
}

internal/manifests/collector/service.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import (
3232
const (
3333
headlessLabel = "operator.opentelemetry.io/collector-headless-service"
3434
monitoringLabel = "operator.opentelemetry.io/collector-monitoring-service"
35-
extensionService = "operator.opentelemetry.io/collector-extension-service"
3635
serviceTypeLabel = "operator.opentelemetry.io/collector-service-type"
3736
valueExists = "Exists"
3837
)
@@ -111,9 +110,8 @@ func MonitoringService(params manifests.Params) (*corev1.Service, error) {
111110
}
112111

113112
func ExtensionService(params manifests.Params) (*corev1.Service, error) {
114-
name := naming.Service(params.OtelCol.Name)
113+
name := naming.ExtensionService(params.OtelCol.Name)
115114
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{})
116-
labels[extensionService] = valueExists
117115
labels[serviceTypeLabel] = ExtensionServiceType.String()
118116

119117
annotations, err := manifestutils.Annotations(params.OtelCol, params.Config.AnnotationsFilter())
@@ -154,7 +152,7 @@ func Service(params manifests.Params) (*corev1.Service, error) {
154152
return nil, err
155153
}
156154

157-
ports, err := params.OtelCol.Spec.Config.GetAllPorts(params.Log)
155+
ports, err := params.OtelCol.Spec.Config.GetReceiverAndExporterPorts(params.Log)
158156
if err != nil {
159157
return nil, err
160158
}

internal/manifests/collector/service_test.go

+165-118
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"testing"
1919

2020
"github.com/stretchr/testify/assert"
21+
corev1 "k8s.io/api/core/v1"
2122
v1 "k8s.io/api/core/v1"
2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2324
"k8s.io/apimachinery/pkg/util/intstr"
@@ -26,6 +27,7 @@ import (
2627
"github.com/open-telemetry/opentelemetry-operator/internal/config"
2728
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
2829
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils"
30+
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
2931
)
3032

3133
func TestExtractPortNumbersAndNames(t *testing.T) {
@@ -322,158 +324,203 @@ func TestMonitoringService(t *testing.T) {
322324
}
323325

324326
func TestExtensionService(t *testing.T) {
325-
t.Run("when the extension has http endpoint", func(t *testing.T) {
326-
params := manifests.Params{
327-
Config: config.Config{},
328-
Log: logger,
329-
OtelCol: v1beta1.OpenTelemetryCollector{
330-
ObjectMeta: metav1.ObjectMeta{
331-
Name: "test",
332-
},
333-
Spec: v1beta1.OpenTelemetryCollectorSpec{
334-
Config: v1beta1.Config{
335-
Service: v1beta1.Service{
336-
Extensions: []string{"jaeger_query"},
337-
},
338-
Extensions: &v1beta1.AnyConfig{
339-
Object: map[string]interface{}{
340-
"jaeger_query": map[string]interface{}{
341-
"http": map[string]interface{}{
342-
"endpoint": "0.0.0.0:16686",
327+
testCases := []struct {
328+
name string
329+
params manifests.Params
330+
expectedPorts []corev1.ServicePort
331+
}{
332+
{
333+
name: "when the extension has http endpoint",
334+
params: manifests.Params{
335+
Config: config.Config{},
336+
Log: logger,
337+
OtelCol: v1beta1.OpenTelemetryCollector{
338+
ObjectMeta: metav1.ObjectMeta{
339+
Name: "test",
340+
},
341+
Spec: v1beta1.OpenTelemetryCollectorSpec{
342+
Config: v1beta1.Config{
343+
Service: v1beta1.Service{
344+
Extensions: []string{"jaeger_query"},
345+
},
346+
Extensions: &v1beta1.AnyConfig{
347+
Object: map[string]interface{}{
348+
"jaeger_query": map[string]interface{}{
349+
"http": map[string]interface{}{
350+
"endpoint": "0.0.0.0:16686",
351+
},
343352
},
344353
},
345354
},
346355
},
347356
},
348357
},
349358
},
350-
}
351-
352-
actual, err := ExtensionService(params)
353-
assert.NotNil(t, actual)
354-
assert.NoError(t, err)
355-
})
356-
357-
t.Run("when the extension has grpc endpoint", func(t *testing.T) {
358-
params := manifests.Params{
359-
Config: config.Config{},
360-
Log: logger,
361-
OtelCol: v1beta1.OpenTelemetryCollector{
362-
ObjectMeta: metav1.ObjectMeta{
363-
Name: "test",
359+
expectedPorts: []corev1.ServicePort{
360+
{
361+
Name: "jaeger-query",
362+
Port: 16686,
363+
TargetPort: intstr.IntOrString{
364+
IntVal: 16686,
365+
},
364366
},
365-
Spec: v1beta1.OpenTelemetryCollectorSpec{
366-
Config: v1beta1.Config{
367-
Service: v1beta1.Service{
368-
Extensions: []string{"jaeger_query"},
369-
},
370-
Extensions: &v1beta1.AnyConfig{
371-
Object: map[string]interface{}{
372-
"jaeger_query": map[string]interface{}{
373-
"grpc": map[string]interface{}{
374-
"endpoint": "0.0.0.0:16686",
367+
},
368+
},
369+
{
370+
name: "when the extension has grpc endpoint",
371+
params: manifests.Params{
372+
Config: config.Config{},
373+
Log: logger,
374+
OtelCol: v1beta1.OpenTelemetryCollector{
375+
ObjectMeta: metav1.ObjectMeta{
376+
Name: "test",
377+
},
378+
Spec: v1beta1.OpenTelemetryCollectorSpec{
379+
Config: v1beta1.Config{
380+
Service: v1beta1.Service{
381+
Extensions: []string{"jaeger_query"},
382+
},
383+
Extensions: &v1beta1.AnyConfig{
384+
Object: map[string]interface{}{
385+
"jaeger_query": map[string]interface{}{
386+
"http": map[string]interface{}{
387+
"endpoint": "0.0.0.0:16686",
388+
},
375389
},
376390
},
377391
},
378392
},
379393
},
380394
},
381395
},
382-
}
383-
384-
actual, err := ExtensionService(params)
385-
assert.NotNil(t, actual)
386-
assert.NoError(t, err)
387-
})
388-
389-
t.Run("when the extension has both http and grpc endpoint", func(t *testing.T) {
390-
params := manifests.Params{
391-
Config: config.Config{},
392-
Log: logger,
393-
OtelCol: v1beta1.OpenTelemetryCollector{
394-
ObjectMeta: metav1.ObjectMeta{
395-
Name: "test",
396+
expectedPorts: []corev1.ServicePort{
397+
{
398+
Name: "jaeger-query",
399+
Port: 16686,
400+
TargetPort: intstr.IntOrString{
401+
IntVal: 16686,
402+
},
396403
},
397-
Spec: v1beta1.OpenTelemetryCollectorSpec{
398-
Config: v1beta1.Config{
399-
Service: v1beta1.Service{
400-
Extensions: []string{"jaeger_query"},
401-
},
402-
Extensions: &v1beta1.AnyConfig{
403-
Object: map[string]interface{}{
404-
"jaeger_query": map[string]interface{}{
405-
"http": map[string]interface{}{
406-
"endpoint": "0.0.0.0:16686",
407-
},
408-
"grpc": map[string]interface{}{
409-
"endpoint": "0.0.0.0:16686",
404+
},
405+
},
406+
{
407+
name: "when the extension has both http and grpc endpoint",
408+
params: manifests.Params{
409+
Config: config.Config{},
410+
Log: logger,
411+
OtelCol: v1beta1.OpenTelemetryCollector{
412+
ObjectMeta: metav1.ObjectMeta{
413+
Name: "test",
414+
},
415+
Spec: v1beta1.OpenTelemetryCollectorSpec{
416+
Config: v1beta1.Config{
417+
Service: v1beta1.Service{
418+
Extensions: []string{"jaeger_query"},
419+
},
420+
Extensions: &v1beta1.AnyConfig{
421+
Object: map[string]interface{}{
422+
"jaeger_query": map[string]interface{}{
423+
"http": map[string]interface{}{
424+
"endpoint": "0.0.0.0:16686",
425+
},
426+
"grpc": map[string]interface{}{
427+
"endpoint": "0.0.0.0:16686",
428+
},
410429
},
411430
},
412431
},
413432
},
414433
},
415434
},
416435
},
417-
}
418-
419-
actual, err := ExtensionService(params)
420-
assert.NotNil(t, actual)
421-
assert.NoError(t, err)
422-
})
423-
424-
t.Run("when the extension has no extensions defined", func(t *testing.T) {
425-
params := manifests.Params{
426-
Config: config.Config{},
427-
Log: logger,
428-
OtelCol: v1beta1.OpenTelemetryCollector{
429-
ObjectMeta: metav1.ObjectMeta{
430-
Name: "test",
436+
expectedPorts: []corev1.ServicePort{
437+
{
438+
Name: "jaeger-query",
439+
Port: 16686,
440+
TargetPort: intstr.IntOrString{
441+
IntVal: 16686,
442+
},
431443
},
432-
Spec: v1beta1.OpenTelemetryCollectorSpec{
433-
Config: v1beta1.Config{
434-
Service: v1beta1.Service{
435-
Extensions: []string{"jaeger_query"},
436-
},
437-
Extensions: &v1beta1.AnyConfig{
438-
Object: map[string]interface{}{},
444+
},
445+
},
446+
{
447+
name: "when the extension has no extensions defined",
448+
params: manifests.Params{
449+
Config: config.Config{},
450+
Log: logger,
451+
OtelCol: v1beta1.OpenTelemetryCollector{
452+
ObjectMeta: metav1.ObjectMeta{
453+
Name: "test",
454+
},
455+
Spec: v1beta1.OpenTelemetryCollectorSpec{
456+
Config: v1beta1.Config{
457+
Service: v1beta1.Service{
458+
Extensions: []string{"jaeger_query"},
459+
},
460+
Extensions: &v1beta1.AnyConfig{
461+
Object: map[string]interface{}{},
462+
},
439463
},
440464
},
441465
},
442466
},
443-
}
444-
445-
actual, err := ExtensionService(params)
446-
assert.Nil(t, actual)
447-
assert.NoError(t, err)
448-
})
449-
450-
t.Run("when the extension has no endpoint defined", func(t *testing.T) {
451-
params := manifests.Params{
452-
Config: config.Config{},
453-
Log: logger,
454-
OtelCol: v1beta1.OpenTelemetryCollector{
455-
ObjectMeta: metav1.ObjectMeta{
456-
Name: "test",
457-
},
458-
Spec: v1beta1.OpenTelemetryCollectorSpec{
459-
Config: v1beta1.Config{
460-
Service: v1beta1.Service{
461-
Extensions: []string{"jaeger_query"},
462-
},
463-
Extensions: &v1beta1.AnyConfig{
464-
Object: map[string]interface{}{
465-
"jaeger_query": map[string]interface{}{},
467+
expectedPorts: []corev1.ServicePort{},
468+
},
469+
{
470+
name: "when the extension has no endpoint defined",
471+
params: manifests.Params{
472+
Config: config.Config{},
473+
Log: logger,
474+
OtelCol: v1beta1.OpenTelemetryCollector{
475+
ObjectMeta: metav1.ObjectMeta{
476+
Name: "test",
477+
},
478+
Spec: v1beta1.OpenTelemetryCollectorSpec{
479+
Config: v1beta1.Config{
480+
Service: v1beta1.Service{
481+
Extensions: []string{"jaeger_query"},
482+
},
483+
Extensions: &v1beta1.AnyConfig{
484+
Object: map[string]interface{}{
485+
"jaeger_query": map[string]interface{}{},
486+
},
466487
},
467488
},
468489
},
469490
},
470491
},
471-
}
492+
expectedPorts: []corev1.ServicePort{
493+
{
494+
Name: "jaeger-query",
495+
Port: 16686,
496+
TargetPort: intstr.IntOrString{
497+
IntVal: 16686,
498+
},
499+
},
500+
},
501+
},
502+
}
472503

473-
actual, err := ExtensionService(params)
474-
assert.NotNil(t, actual)
475-
assert.NoError(t, err)
476-
})
504+
for _, tc := range testCases {
505+
tc := tc
506+
t.Run(tc.name, func(t *testing.T) {
507+
actual, err := ExtensionService(tc.params)
508+
assert.NoError(t, err)
509+
510+
if len(tc.expectedPorts) > 0 {
511+
assert.NotNil(t, actual)
512+
assert.Equal(t, actual.Name, naming.ExtensionService(tc.params.OtelCol.Name))
513+
// ports assertion
514+
assert.Equal(t, len(tc.expectedPorts), len(actual.Spec.Ports))
515+
assert.Equal(t, tc.expectedPorts[0].Name, actual.Spec.Ports[0].Name)
516+
assert.Equal(t, tc.expectedPorts[0].Port, actual.Spec.Ports[0].Port)
517+
assert.Equal(t, tc.expectedPorts[0].TargetPort.IntVal, actual.Spec.Ports[0].TargetPort.IntVal)
518+
} else {
519+
// no ports, no service
520+
assert.Nil(t, actual)
521+
}
522+
})
523+
}
477524
}
478525

479526
func service(name string, ports []v1beta1.PortsSpec) v1.Service {

0 commit comments

Comments
 (0)