Skip to content

Commit c3ebb64

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

File tree

8 files changed

+376
-123
lines changed

8 files changed

+376
-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

+164-118
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/open-telemetry/opentelemetry-operator/internal/config"
2727
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
2828
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils"
29+
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
2930
)
3031

3132
func TestExtractPortNumbersAndNames(t *testing.T) {
@@ -322,158 +323,203 @@ func TestMonitoringService(t *testing.T) {
322323
}
323324

324325
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",
326+
testCases := []struct {
327+
name string
328+
params manifests.Params
329+
expectedPorts []v1.ServicePort
330+
}{
331+
{
332+
name: "when the extension has http endpoint",
333+
params: manifests.Params{
334+
Config: config.Config{},
335+
Log: logger,
336+
OtelCol: v1beta1.OpenTelemetryCollector{
337+
ObjectMeta: metav1.ObjectMeta{
338+
Name: "test",
339+
},
340+
Spec: v1beta1.OpenTelemetryCollectorSpec{
341+
Config: v1beta1.Config{
342+
Service: v1beta1.Service{
343+
Extensions: []string{"jaeger_query"},
344+
},
345+
Extensions: &v1beta1.AnyConfig{
346+
Object: map[string]interface{}{
347+
"jaeger_query": map[string]interface{}{
348+
"http": map[string]interface{}{
349+
"endpoint": "0.0.0.0:16686",
350+
},
343351
},
344352
},
345353
},
346354
},
347355
},
348356
},
349357
},
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",
358+
expectedPorts: []v1.ServicePort{
359+
{
360+
Name: "jaeger-query",
361+
Port: 16686,
362+
TargetPort: intstr.IntOrString{
363+
IntVal: 16686,
364+
},
364365
},
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",
366+
},
367+
},
368+
{
369+
name: "when the extension has grpc endpoint",
370+
params: manifests.Params{
371+
Config: config.Config{},
372+
Log: logger,
373+
OtelCol: v1beta1.OpenTelemetryCollector{
374+
ObjectMeta: metav1.ObjectMeta{
375+
Name: "test",
376+
},
377+
Spec: v1beta1.OpenTelemetryCollectorSpec{
378+
Config: v1beta1.Config{
379+
Service: v1beta1.Service{
380+
Extensions: []string{"jaeger_query"},
381+
},
382+
Extensions: &v1beta1.AnyConfig{
383+
Object: map[string]interface{}{
384+
"jaeger_query": map[string]interface{}{
385+
"http": map[string]interface{}{
386+
"endpoint": "0.0.0.0:16686",
387+
},
375388
},
376389
},
377390
},
378391
},
379392
},
380393
},
381394
},
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",
395+
expectedPorts: []v1.ServicePort{
396+
{
397+
Name: "jaeger-query",
398+
Port: 16686,
399+
TargetPort: intstr.IntOrString{
400+
IntVal: 16686,
401+
},
396402
},
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",
403+
},
404+
},
405+
{
406+
name: "when the extension has both http and grpc endpoint",
407+
params: manifests.Params{
408+
Config: config.Config{},
409+
Log: logger,
410+
OtelCol: v1beta1.OpenTelemetryCollector{
411+
ObjectMeta: metav1.ObjectMeta{
412+
Name: "test",
413+
},
414+
Spec: v1beta1.OpenTelemetryCollectorSpec{
415+
Config: v1beta1.Config{
416+
Service: v1beta1.Service{
417+
Extensions: []string{"jaeger_query"},
418+
},
419+
Extensions: &v1beta1.AnyConfig{
420+
Object: map[string]interface{}{
421+
"jaeger_query": map[string]interface{}{
422+
"http": map[string]interface{}{
423+
"endpoint": "0.0.0.0:16686",
424+
},
425+
"grpc": map[string]interface{}{
426+
"endpoint": "0.0.0.0:16686",
427+
},
410428
},
411429
},
412430
},
413431
},
414432
},
415433
},
416434
},
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",
435+
expectedPorts: []v1.ServicePort{
436+
{
437+
Name: "jaeger-query",
438+
Port: 16686,
439+
TargetPort: intstr.IntOrString{
440+
IntVal: 16686,
441+
},
431442
},
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{}{},
443+
},
444+
},
445+
{
446+
name: "when the extension has no extensions defined",
447+
params: manifests.Params{
448+
Config: config.Config{},
449+
Log: logger,
450+
OtelCol: v1beta1.OpenTelemetryCollector{
451+
ObjectMeta: metav1.ObjectMeta{
452+
Name: "test",
453+
},
454+
Spec: v1beta1.OpenTelemetryCollectorSpec{
455+
Config: v1beta1.Config{
456+
Service: v1beta1.Service{
457+
Extensions: []string{"jaeger_query"},
458+
},
459+
Extensions: &v1beta1.AnyConfig{
460+
Object: map[string]interface{}{},
461+
},
439462
},
440463
},
441464
},
442465
},
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{}{},
466+
expectedPorts: []v1.ServicePort{},
467+
},
468+
{
469+
name: "when the extension has no endpoint defined",
470+
params: manifests.Params{
471+
Config: config.Config{},
472+
Log: logger,
473+
OtelCol: v1beta1.OpenTelemetryCollector{
474+
ObjectMeta: metav1.ObjectMeta{
475+
Name: "test",
476+
},
477+
Spec: v1beta1.OpenTelemetryCollectorSpec{
478+
Config: v1beta1.Config{
479+
Service: v1beta1.Service{
480+
Extensions: []string{"jaeger_query"},
481+
},
482+
Extensions: &v1beta1.AnyConfig{
483+
Object: map[string]interface{}{
484+
"jaeger_query": map[string]interface{}{},
485+
},
466486
},
467487
},
468488
},
469489
},
470490
},
471-
}
491+
expectedPorts: []v1.ServicePort{
492+
{
493+
Name: "jaeger-query",
494+
Port: 16686,
495+
TargetPort: intstr.IntOrString{
496+
IntVal: 16686,
497+
},
498+
},
499+
},
500+
},
501+
}
472502

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

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

0 commit comments

Comments
 (0)