Skip to content

Commit e88e60c

Browse files
committed
chore: aded unit tests for ingress
Signed-off-by: Ankit152 <[email protected]>
1 parent c120ba8 commit e88e60c

File tree

4 files changed

+297
-22
lines changed

4 files changed

+297
-22
lines changed

.chloggen/ingress.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 ingress for extensions that consumes the service.
9+
10+
# One or more tracking issues related to the change
11+
issues: [3438]
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:

config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml

+43
Original file line numberDiff line numberDiff line change
@@ -6042,6 +6042,49 @@ spec:
60426042
x-kubernetes-map-type: atomic
60436043
type: object
60446044
type: array
6045+
extensionIngress:
6046+
properties:
6047+
annotations:
6048+
additionalProperties:
6049+
type: string
6050+
type: object
6051+
hostname:
6052+
type: string
6053+
ingressClassName:
6054+
type: string
6055+
route:
6056+
properties:
6057+
termination:
6058+
enum:
6059+
- insecure
6060+
- edge
6061+
- passthrough
6062+
- reencrypt
6063+
type: string
6064+
type: object
6065+
ruleType:
6066+
enum:
6067+
- path
6068+
- subdomain
6069+
type: string
6070+
tls:
6071+
items:
6072+
properties:
6073+
hosts:
6074+
items:
6075+
type: string
6076+
type: array
6077+
x-kubernetes-list-type: atomic
6078+
secretName:
6079+
type: string
6080+
type: object
6081+
type: array
6082+
type:
6083+
enum:
6084+
- ingress
6085+
- route
6086+
type: string
6087+
type: object
60456088
hostNetwork:
60466089
type: boolean
60476090
image:

internal/manifests/collector/ingress.go

+12-22
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@ func Ingress(params manifests.Params) (*networkingv1.Ingress, error) {
4747
return nil, err
4848
}
4949

50+
otelcol := naming.Service(params.OtelCol.Name)
51+
5052
var rules []networkingv1.IngressRule
5153
switch params.OtelCol.Spec.Ingress.RuleType {
5254
case v1beta1.IngressRuleTypePath, "":
53-
rules = []networkingv1.IngressRule{createPathIngressRules(params.OtelCol.Name, params.OtelCol.Spec.Ingress.Hostname, ports, "service")}
55+
rules = []networkingv1.IngressRule{createPathIngressRules(otelcol, params.OtelCol.Spec.Ingress.Hostname, ports)}
5456
case v1beta1.IngressRuleTypeSubdomain:
55-
rules = createSubdomainIngressRules(params.OtelCol.Name, params.OtelCol.Spec.Ingress.Hostname, ports, "service")
57+
rules = createSubdomainIngressRules(otelcol, params.OtelCol.Spec.Ingress.Hostname, ports)
5658
}
5759

5860
return &networkingv1.Ingress{
@@ -83,12 +85,14 @@ func ExtensionIngress(params manifests.Params) (*networkingv1.Ingress, error) {
8385
return nil, err
8486
}
8587

88+
otelcol := naming.ExtensionService(params.OtelCol.Name)
89+
8690
var rules []networkingv1.IngressRule
8791
switch params.OtelCol.Spec.Ingress.RuleType {
8892
case v1beta1.IngressRuleTypePath, "":
89-
rules = []networkingv1.IngressRule{createPathIngressRules(params.OtelCol.Name, params.OtelCol.Spec.ExtensionIngress.Hostname, ports, "extension")}
93+
rules = []networkingv1.IngressRule{createPathIngressRules(otelcol, params.OtelCol.Spec.ExtensionIngress.Hostname, ports)}
9094
case v1beta1.IngressRuleTypeSubdomain:
91-
rules = createSubdomainIngressRules(params.OtelCol.Name, params.OtelCol.Spec.ExtensionIngress.Hostname, ports, "extension")
95+
rules = createSubdomainIngressRules(otelcol, params.OtelCol.Spec.ExtensionIngress.Hostname, ports)
9296
}
9397

9498
return &networkingv1.Ingress{
@@ -106,25 +110,18 @@ func ExtensionIngress(params manifests.Params) (*networkingv1.Ingress, error) {
106110
}, nil
107111
}
108112

109-
func createPathIngressRules(otelcol string, hostname string, ports []corev1.ServicePort, serviceType string) networkingv1.IngressRule {
113+
func createPathIngressRules(otelcol string, hostname string, ports []corev1.ServicePort) networkingv1.IngressRule {
110114
pathType := networkingv1.PathTypePrefix
111115
paths := make([]networkingv1.HTTPIngressPath, len(ports))
112116

113-
var name string
114-
if serviceType == "extension" {
115-
name = naming.ExtensionService(otelcol)
116-
} else {
117-
name = naming.Service(otelcol)
118-
}
119-
120117
for i, port := range ports {
121118
portName := naming.PortName(port.Name, port.Port)
122119
paths[i] = networkingv1.HTTPIngressPath{
123120
Path: "/" + port.Name,
124121
PathType: &pathType,
125122
Backend: networkingv1.IngressBackend{
126123
Service: &networkingv1.IngressServiceBackend{
127-
Name: name,
124+
Name: otelcol,
128125
Port: networkingv1.ServiceBackendPort{
129126
Name: portName,
130127
},
@@ -142,17 +139,10 @@ func createPathIngressRules(otelcol string, hostname string, ports []corev1.Serv
142139
}
143140
}
144141

145-
func createSubdomainIngressRules(otelcol string, hostname string, ports []corev1.ServicePort, serviceType string) []networkingv1.IngressRule {
142+
func createSubdomainIngressRules(otelcol string, hostname string, ports []corev1.ServicePort) []networkingv1.IngressRule {
146143
var rules []networkingv1.IngressRule
147144
pathType := networkingv1.PathTypePrefix
148145

149-
var name string
150-
if serviceType == "extension" {
151-
name = naming.ExtensionService(otelcol)
152-
} else {
153-
name = naming.Service(otelcol)
154-
}
155-
156146
for _, port := range ports {
157147
portName := naming.PortName(port.Name, port.Port)
158148

@@ -171,7 +161,7 @@ func createSubdomainIngressRules(otelcol string, hostname string, ports []corev1
171161
PathType: &pathType,
172162
Backend: networkingv1.IngressBackend{
173163
Service: &networkingv1.IngressServiceBackend{
174-
Name: name,
164+
Name: otelcol,
175165
Port: networkingv1.ServiceBackendPort{
176166
Name: portName,
177167
},

internal/manifests/collector/ingress_test.go

+226
Original file line numberDiff line numberDiff line change
@@ -284,3 +284,229 @@ func TestDesiredIngresses(t *testing.T) {
284284
}, got)
285285
})
286286
}
287+
288+
func TestExtensionIngress(t *testing.T) {
289+
t.Run("no ingress for incorrect ingress type", func(t *testing.T) {
290+
params := manifests.Params{
291+
Config: config.Config{},
292+
Log: logger,
293+
OtelCol: v1beta1.OpenTelemetryCollector{
294+
ObjectMeta: metav1.ObjectMeta{
295+
Name: "test",
296+
},
297+
Spec: v1beta1.OpenTelemetryCollectorSpec{
298+
ExtensionIngress: v1beta1.Ingress{
299+
Type: v1beta1.IngressType("unknown"),
300+
},
301+
},
302+
},
303+
}
304+
actual, err := ExtensionIngress(params)
305+
assert.Nil(t, actual)
306+
assert.NoError(t, err)
307+
})
308+
t.Run("no ingress if there's no port for extension", func(t *testing.T) {
309+
params := manifests.Params{
310+
Config: config.Config{},
311+
Log: logger,
312+
OtelCol: v1beta1.OpenTelemetryCollector{
313+
ObjectMeta: metav1.ObjectMeta{
314+
Name: "test",
315+
},
316+
Spec: v1beta1.OpenTelemetryCollectorSpec{
317+
Config: v1beta1.Config{
318+
Service: v1beta1.Service{
319+
Extensions: []string{"jaeger_query"},
320+
},
321+
Extensions: &v1beta1.AnyConfig{
322+
Object: map[string]interface{}{},
323+
},
324+
},
325+
ExtensionIngress: v1beta1.Ingress{
326+
Type: v1beta1.IngressType("ingress"),
327+
},
328+
},
329+
},
330+
}
331+
332+
actual, err := ExtensionIngress(params)
333+
assert.Nil(t, actual)
334+
assert.NoError(t, err)
335+
})
336+
t.Run("ingress for extensions for rule type path", func(t *testing.T) {
337+
var (
338+
ns = "test-ns"
339+
hostname = "example.com"
340+
ingressClassName = "nginx"
341+
pathType = networkingv1.PathTypePrefix
342+
)
343+
344+
params := manifests.Params{
345+
Config: config.Config{},
346+
Log: logger,
347+
OtelCol: v1beta1.OpenTelemetryCollector{
348+
ObjectMeta: metav1.ObjectMeta{
349+
Name: "test",
350+
Namespace: ns,
351+
},
352+
Spec: v1beta1.OpenTelemetryCollectorSpec{
353+
Config: v1beta1.Config{
354+
Service: v1beta1.Service{
355+
Extensions: []string{"jaeger_query"},
356+
},
357+
Extensions: &v1beta1.AnyConfig{
358+
Object: map[string]interface{}{
359+
"jaeger_query": map[string]interface{}{
360+
"http": map[string]interface{}{
361+
"endpoint": "0.0.0.0:16686",
362+
},
363+
},
364+
},
365+
},
366+
},
367+
ExtensionIngress: v1beta1.Ingress{
368+
Type: v1beta1.IngressType("ingress"),
369+
IngressClassName: &ingressClassName,
370+
Hostname: hostname,
371+
Annotations: map[string]string{"some.key": "some.value"},
372+
RuleType: v1beta1.IngressRuleTypePath,
373+
},
374+
},
375+
},
376+
}
377+
378+
actual, err := ExtensionIngress(params)
379+
assert.NoError(t, err)
380+
assert.NotNil(t, actual)
381+
assert.NotEqual(t, networkingv1.Ingress{
382+
ObjectMeta: metav1.ObjectMeta{
383+
Name: naming.ExtensionIngress(params.OtelCol.Name),
384+
Namespace: ns,
385+
Annotations: params.OtelCol.Spec.ExtensionIngress.Annotations,
386+
Labels: map[string]string{
387+
"app.kubernetes.io/name": naming.ExtensionIngress(params.OtelCol.Name),
388+
"app.kubernetes.io/instance": fmt.Sprintf("%s.%s", params.OtelCol.Namespace, params.OtelCol.Name),
389+
"app.kubernetes.io/managed-by": "opentelemetry-operator",
390+
"app.kubernetes.io/component": "opentelemetry-collector",
391+
"app.kubernetes.io/part-of": "opentelemetry",
392+
"app.kubernetes.io/version": "latest",
393+
},
394+
},
395+
Spec: networkingv1.IngressSpec{
396+
IngressClassName: &ingressClassName,
397+
Rules: []networkingv1.IngressRule{
398+
{
399+
Host: hostname,
400+
IngressRuleValue: networkingv1.IngressRuleValue{
401+
HTTP: &networkingv1.HTTPIngressRuleValue{
402+
Paths: []networkingv1.HTTPIngressPath{
403+
{
404+
Path: "/jaeger-query",
405+
PathType: &pathType,
406+
Backend: networkingv1.IngressBackend{
407+
Service: &networkingv1.IngressServiceBackend{
408+
Name: naming.ExtensionService(params.OtelCol.Name),
409+
Port: networkingv1.ServiceBackendPort{
410+
Name: "jaeger-query",
411+
Number: 16686,
412+
},
413+
},
414+
},
415+
},
416+
},
417+
},
418+
},
419+
},
420+
},
421+
},
422+
}, actual)
423+
})
424+
t.Run("ingress for extensions for rule type subdomain", func(t *testing.T) {
425+
var (
426+
ns = "test-ns"
427+
hostname = "example.com"
428+
ingressClassName = "nginx"
429+
pathType = networkingv1.PathTypePrefix
430+
)
431+
432+
params := manifests.Params{
433+
Config: config.Config{},
434+
Log: logger,
435+
OtelCol: v1beta1.OpenTelemetryCollector{
436+
ObjectMeta: metav1.ObjectMeta{
437+
Name: "test",
438+
Namespace: ns,
439+
},
440+
Spec: v1beta1.OpenTelemetryCollectorSpec{
441+
Config: v1beta1.Config{
442+
Service: v1beta1.Service{
443+
Extensions: []string{"jaeger_query"},
444+
},
445+
Extensions: &v1beta1.AnyConfig{
446+
Object: map[string]interface{}{
447+
"jaeger_query": map[string]interface{}{
448+
"http": map[string]interface{}{
449+
"endpoint": "0.0.0.0:16686",
450+
},
451+
},
452+
},
453+
},
454+
},
455+
ExtensionIngress: v1beta1.Ingress{
456+
Type: v1beta1.IngressType("ingress"),
457+
IngressClassName: &ingressClassName,
458+
Hostname: hostname,
459+
Annotations: map[string]string{"some.key": "some.value"},
460+
RuleType: v1beta1.IngressRuleTypeSubdomain,
461+
},
462+
},
463+
},
464+
}
465+
466+
actual, err := ExtensionIngress(params)
467+
assert.NoError(t, err)
468+
assert.NotNil(t, actual)
469+
assert.NotEqual(t, networkingv1.Ingress{
470+
ObjectMeta: metav1.ObjectMeta{
471+
Name: naming.ExtensionIngress(params.OtelCol.Name),
472+
Namespace: ns,
473+
Annotations: params.OtelCol.Spec.ExtensionIngress.Annotations,
474+
Labels: map[string]string{
475+
"app.kubernetes.io/name": naming.ExtensionIngress(params.OtelCol.Name),
476+
"app.kubernetes.io/instance": fmt.Sprintf("%s.%s", params.OtelCol.Namespace, params.OtelCol.Name),
477+
"app.kubernetes.io/managed-by": "opentelemetry-operator",
478+
"app.kubernetes.io/component": "opentelemetry-collector",
479+
"app.kubernetes.io/part-of": "opentelemetry",
480+
"app.kubernetes.io/version": "latest",
481+
},
482+
},
483+
Spec: networkingv1.IngressSpec{
484+
IngressClassName: &ingressClassName,
485+
Rules: []networkingv1.IngressRule{
486+
{
487+
Host: "jaeger-query." + hostname,
488+
IngressRuleValue: networkingv1.IngressRuleValue{
489+
HTTP: &networkingv1.HTTPIngressRuleValue{
490+
Paths: []networkingv1.HTTPIngressPath{
491+
{
492+
Path: "/",
493+
PathType: &pathType,
494+
Backend: networkingv1.IngressBackend{
495+
Service: &networkingv1.IngressServiceBackend{
496+
Name: naming.ExtensionService(params.OtelCol.Name),
497+
Port: networkingv1.ServiceBackendPort{
498+
Name: "jaeger-query",
499+
Number: 16686,
500+
},
501+
},
502+
},
503+
},
504+
},
505+
},
506+
},
507+
},
508+
},
509+
},
510+
}, actual)
511+
})
512+
}

0 commit comments

Comments
 (0)