Skip to content

Commit 6e44119

Browse files
committed
chore: implemented unit tests for ingress for extensions
Signed-off-by: Ankit152 <[email protected]>
1 parent 1859ede commit 6e44119

File tree

9 files changed

+338
-21
lines changed

9 files changed

+338
-21
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:

apis/v1beta1/config.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -323,12 +323,12 @@ func (c *Config) GetExporterPorts(logger logr.Logger) ([]corev1.ServicePort, err
323323
return c.getPortsForComponentKinds(logger, KindExporter)
324324
}
325325

326-
func (c *Config) GetReceiverAndExporterPorts(logger logr.Logger) ([]corev1.ServicePort, error) {
327-
return c.getPortsForComponentKinds(logger, KindReceiver, KindExporter)
326+
func (c *Config) GetExtensionPorts(logger logr.Logger) ([]corev1.ServicePort, error) {
327+
return c.getPortsForComponentKinds(logger, KindExtension)
328328
}
329329

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

334334
func (c *Config) GetAllPorts(logger logr.Logger) ([]corev1.ServicePort, error) {

apis/v1beta1/opentelemetrycollector_types.go

+5
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ type OpenTelemetryCollectorSpec struct {
111111
// Valid modes are: deployment, daemonset and statefulset.
112112
// +optional
113113
Ingress Ingress `json:"ingress,omitempty"`
114+
// ExtensionIngress is used to specify how OpenTelemetry Collector is exposed. This
115+
// functionality is only available if one of the valid modes is set.
116+
// Valid modes are: deployment, daemonset and statefulset.
117+
// +optional
118+
ExtensionIngress Ingress `json:"extensionIngress,omitempty"`
114119
// Liveness config for the OpenTelemetry Collector except the probe handler which is auto generated from the health extension of the collector.
115120
// It is only effective when healthcheckextension is configured in the OpenTelemetry Collector pipeline.
116121
// +optional

apis/v1beta1/zz_generated.deepcopy.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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/collector.go

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func Build(params manifests.Params) ([]client.Object, error) {
5555
manifests.Factory(MonitoringService),
5656
manifests.Factory(ExtensionService),
5757
manifests.Factory(Ingress),
58+
manifests.Factory(ExtensionIngress),
5859
}...)
5960

6061
if featuregate.CollectorUsesTargetAllocatorCR.IsEnabled() {

internal/manifests/collector/ingress.go

+37-17
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ func Ingress(params manifests.Params) (*networkingv1.Ingress, error) {
5050
var rules []networkingv1.IngressRule
5151
switch params.OtelCol.Spec.Ingress.RuleType {
5252
case v1beta1.IngressRuleTypePath, "":
53-
rules = []networkingv1.IngressRule{createPathIngressRules(params.OtelCol.Name, params.OtelCol.Spec.Ingress.Hostname, ports)}
53+
rules = []networkingv1.IngressRule{createPathIngressRules(params.OtelCol.Name, params.OtelCol.Spec.Ingress.Hostname, ports, "service")}
5454
case v1beta1.IngressRuleTypeSubdomain:
55-
rules = createSubdomainIngressRules(params.OtelCol.Name, params.OtelCol.Spec.Ingress.Hostname, ports)
55+
rules = createSubdomainIngressRules(params.OtelCol.Name, params.OtelCol.Spec.Ingress.Hostname, ports, "service")
5656
}
5757

5858
return &networkingv1.Ingress{
@@ -71,48 +71,60 @@ func Ingress(params manifests.Params) (*networkingv1.Ingress, error) {
7171
}
7272

7373
func ExtensionIngress(params manifests.Params) (*networkingv1.Ingress, error) {
74-
name := naming.Ingress(params.OtelCol.Name)
74+
name := naming.ExtensionIngress(params.OtelCol.Name)
7575
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter())
7676

77-
ports, err := extensionServicePortsFromCfg(params.Log, params.OtelCol)
77+
if params.OtelCol.Spec.ExtensionIngress.Type != v1beta1.IngressTypeIngress {
78+
return nil, nil
79+
}
7880

79-
if err != nil {
81+
ports, err := extensionServicePortsFromCfg(params.Log, params.OtelCol)
82+
if err != nil || len(ports) == 0 {
8083
return nil, err
8184
}
8285

83-
// if there are no ports, no ingress required
84-
if len(ports) == 0 {
85-
return nil, nil
86+
var rules []networkingv1.IngressRule
87+
switch params.OtelCol.Spec.Ingress.RuleType {
88+
case v1beta1.IngressRuleTypePath, "":
89+
rules = []networkingv1.IngressRule{createPathIngressRules(params.OtelCol.Name, params.OtelCol.Spec.ExtensionIngress.Hostname, ports, "extension")}
90+
case v1beta1.IngressRuleTypeSubdomain:
91+
rules = createSubdomainIngressRules(params.OtelCol.Name, params.OtelCol.Spec.ExtensionIngress.Hostname, ports, "extension")
8692
}
8793

88-
rules := createSubdomainIngressRules(name, "", ports)
89-
9094
return &networkingv1.Ingress{
9195
ObjectMeta: metav1.ObjectMeta{
9296
Name: name,
9397
Namespace: params.OtelCol.Namespace,
94-
Annotations: params.OtelCol.Spec.Ingress.Annotations, // can the spec annotations be used?
98+
Annotations: params.OtelCol.Spec.ExtensionIngress.Annotations,
9599
Labels: labels,
96100
},
97101
Spec: networkingv1.IngressSpec{
98-
TLS: params.OtelCol.Spec.Ingress.TLS,
102+
TLS: params.OtelCol.Spec.ExtensionIngress.TLS,
99103
Rules: rules,
100-
IngressClassName: params.OtelCol.Spec.Ingress.IngressClassName,
104+
IngressClassName: params.OtelCol.Spec.ExtensionIngress.IngressClassName,
101105
},
102106
}, nil
103107
}
104108

105-
func createPathIngressRules(otelcol string, hostname string, ports []corev1.ServicePort) networkingv1.IngressRule {
109+
func createPathIngressRules(otelcol string, hostname string, ports []corev1.ServicePort, serviceType string) networkingv1.IngressRule {
106110
pathType := networkingv1.PathTypePrefix
107111
paths := make([]networkingv1.HTTPIngressPath, len(ports))
112+
113+
var name string
114+
if serviceType == "extension" {
115+
name = naming.ExtensionService(otelcol)
116+
} else {
117+
name = naming.Service(otelcol)
118+
}
119+
108120
for i, port := range ports {
109121
portName := naming.PortName(port.Name, port.Port)
110122
paths[i] = networkingv1.HTTPIngressPath{
111123
Path: "/" + port.Name,
112124
PathType: &pathType,
113125
Backend: networkingv1.IngressBackend{
114126
Service: &networkingv1.IngressServiceBackend{
115-
Name: naming.Service(otelcol),
127+
Name: name,
116128
Port: networkingv1.ServiceBackendPort{
117129
Name: portName,
118130
},
@@ -130,9 +142,17 @@ func createPathIngressRules(otelcol string, hostname string, ports []corev1.Serv
130142
}
131143
}
132144

133-
func createSubdomainIngressRules(otelcol string, hostname string, ports []corev1.ServicePort) []networkingv1.IngressRule {
145+
func createSubdomainIngressRules(otelcol string, hostname string, ports []corev1.ServicePort, serviceType string) []networkingv1.IngressRule {
134146
var rules []networkingv1.IngressRule
135147
pathType := networkingv1.PathTypePrefix
148+
149+
var name string
150+
if serviceType == "extension" {
151+
name = naming.ExtensionService(otelcol)
152+
} else {
153+
name = naming.Service(otelcol)
154+
}
155+
136156
for _, port := range ports {
137157
portName := naming.PortName(port.Name, port.Port)
138158

@@ -151,7 +171,7 @@ func createSubdomainIngressRules(otelcol string, hostname string, ports []corev1
151171
PathType: &pathType,
152172
Backend: networkingv1.IngressBackend{
153173
Service: &networkingv1.IngressServiceBackend{
154-
Name: naming.Service(otelcol),
174+
Name: name,
155175
Port: networkingv1.ServiceBackendPort{
156176
Name: portName,
157177
},

0 commit comments

Comments
 (0)