Skip to content

Commit 4763471

Browse files
Your Namebmiguel-teixeira
Your Name
authored andcommitted
feat/add support for hostPort in container
1 parent 2ddfe31 commit 4763471

21 files changed

+384
-131
lines changed
+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: operator
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: "Add support for adding/extending otc-collector container ports."
9+
10+
# One or more tracking issues related to the change
11+
issues: [2763]
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/v1alpha1/convert.go

+33-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
"gopkg.in/yaml.v3"
2222
appsv1 "k8s.io/api/apps/v1"
23+
v1 "k8s.io/api/core/v1"
2324
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2425
"sigs.k8s.io/controller-runtime/pkg/conversion"
2526

@@ -96,7 +97,7 @@ func tov1beta1(in OpenTelemetryCollector) (v1beta1.OpenTelemetryCollector, error
9697
Image: copy.Spec.Image,
9798
ImagePullPolicy: copy.Spec.ImagePullPolicy,
9899
VolumeMounts: copy.Spec.VolumeMounts,
99-
Ports: copy.Spec.Ports,
100+
Ports: tov1beta1Ports(copy.Spec.Ports),
100101
Env: copy.Spec.Env,
101102
EnvFrom: copy.Spec.EnvFrom,
102103
VolumeClaimTemplates: copy.Spec.VolumeClaimTemplates,
@@ -144,6 +145,26 @@ func tov1beta1(in OpenTelemetryCollector) (v1beta1.OpenTelemetryCollector, error
144145
}, nil
145146
}
146147

148+
func tov1beta1Ports(in []v1.ServicePort) []v1beta1.PortsSpec {
149+
var ports []v1beta1.PortsSpec
150+
151+
for _, p := range in {
152+
ports = append(ports, v1beta1.PortsSpec{
153+
ServicePort: v1.ServicePort{
154+
Name: p.Name,
155+
Protocol: p.Protocol,
156+
AppProtocol: p.AppProtocol,
157+
Port: p.Port,
158+
TargetPort: p.TargetPort,
159+
NodePort: p.NodePort,
160+
},
161+
HostPort: 0,
162+
})
163+
}
164+
165+
return ports
166+
}
167+
147168
func tov1beta1TA(in OpenTelemetryTargetAllocator) v1beta1.TargetAllocatorEmbedded {
148169
return v1beta1.TargetAllocatorEmbedded{
149170
Replicas: in.Replicas,
@@ -249,6 +270,16 @@ func tov1beta1ConfigMaps(in []ConfigMapsSpec) []v1beta1.ConfigMapsSpec {
249270
return mapsSpecs
250271
}
251272

273+
func tov1alpha1Ports(in []v1beta1.PortsSpec) []v1.ServicePort {
274+
var ports []v1.ServicePort
275+
276+
for _, p := range in {
277+
ports = append(ports, p.ServicePort)
278+
}
279+
280+
return ports
281+
}
282+
252283
func tov1alpha1(in v1beta1.OpenTelemetryCollector) (*OpenTelemetryCollector, error) {
253284
copy := in.DeepCopy()
254285
configYaml, err := copy.Spec.Config.Yaml()
@@ -287,7 +318,7 @@ func tov1alpha1(in v1beta1.OpenTelemetryCollector) (*OpenTelemetryCollector, err
287318
ImagePullPolicy: copy.Spec.ImagePullPolicy,
288319
Config: configYaml,
289320
VolumeMounts: copy.Spec.VolumeMounts,
290-
Ports: copy.Spec.Ports,
321+
Ports: tov1alpha1Ports(copy.Spec.Ports),
291322
Env: copy.Spec.Env,
292323
EnvFrom: copy.Spec.EnvFrom,
293324
VolumeClaimTemplates: copy.Spec.VolumeClaimTemplates,

apis/v1beta1/common.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ type PodDisruptionBudgetSpec struct {
8484
MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"`
8585
}
8686

87+
// PortsSpec defines the OpenTelemetryCollector's container/service ports additional specifications
88+
type PortsSpec struct {
89+
// Allows defining which port to bind to the host in the Container.
90+
// +optional
91+
HostPort int32 `json:"hostPort,omitempty"`
92+
93+
// Maintain previous fields in new struct
94+
v1.ServicePort `json:",inline"`
95+
}
96+
8797
type OpenTelemetryCommonFields struct {
8898
// ManagementState defines if the CR should be managed by the operator or not.
8999
// Default is managed.
@@ -151,12 +161,12 @@ type OpenTelemetryCommonFields struct {
151161
// +optional
152162
// +listType=atomic
153163
VolumeMounts []v1.VolumeMount `json:"volumeMounts,omitempty"`
154-
// Ports allows a set of ports to be exposed by the underlying v1.Service. By default, the operator
164+
// Ports allows a set of ports to be exposed by the underlying v1.Service & v1.ContainerPort. By default, the operator
155165
// will attempt to infer the required ports by parsing the .Spec.Config property but this property can be
156166
// used to open additional ports that can't be inferred by the operator, like for custom receivers.
157167
// +optional
158168
// +listType=atomic
159-
Ports []v1.ServicePort `json:"ports,omitempty"`
169+
Ports []PortsSpec `json:"ports,omitempty"`
160170
// Environment variables to set on the generated pods.
161171
// +optional
162172
Env []v1.EnvVar `json:"env,omitempty"`

apis/v1beta1/zz_generated.deepcopy.go

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

bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -6606,6 +6606,9 @@ spec:
66066606
properties:
66076607
appProtocol:
66086608
type: string
6609+
hostPort:
6610+
format: int32
6611+
type: integer
66096612
name:
66106613
type: string
66116614
nodePort:

config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -6592,6 +6592,9 @@ spec:
65926592
properties:
65936593
appProtocol:
65946594
type: string
6595+
hostPort:
6596+
format: int32
6597+
type: integer
65956598
name:
65966599
type: string
65976600
nodePort:

config/crd/bases/opentelemetry.io_targetallocators.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -2199,6 +2199,9 @@ spec:
21992199
properties:
22002200
appProtocol:
22012201
type: string
2202+
hostPort:
2203+
format: int32
2204+
type: integer
22022205
name:
22032206
type: string
22042207
nodePort:

config/manager/kustomization.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
11
resources:
22
- manager.yaml
3+
apiVersion: kustomize.config.k8s.io/v1beta1
4+
kind: Kustomization
5+
images:
6+
- name: controller
7+
newName: ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator

docs/api.md

+9
Original file line numberDiff line numberDiff line change
@@ -34018,6 +34018,15 @@ Resource Types:
3401834018
<br/>
3401934019
</td>
3402034020
<td>false</td>
34021+
</tr><tr>
34022+
<td><b>hostPort</b></td>
34023+
<td>integer</td>
34024+
<td>
34025+
<br/>
34026+
<br/>
34027+
<i>Format</i>: int32<br/>
34028+
</td>
34029+
<td>false</td>
3402134030
</tr><tr>
3402234031
<td><b>name</b></td>
3402334032
<td>string</td>

internal/manifests/collector/adapters/config_to_ports.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/mitchellh/mapstructure"
2626
corev1 "k8s.io/api/core/v1"
2727

28+
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
2829
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/parser"
2930
exporterParser "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/parser/exporter"
3031
receiverParser "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/parser/receiver"
@@ -43,7 +44,7 @@ func (c ComponentType) String() string {
4344
}
4445

4546
// ConfigToComponentPorts converts the incoming configuration object into a set of service ports required by the exporters.
46-
func ConfigToComponentPorts(logger logr.Logger, cType ComponentType, config map[interface{}]interface{}) ([]corev1.ServicePort, error) {
47+
func ConfigToComponentPorts(logger logr.Logger, cType ComponentType, config map[interface{}]interface{}) ([]v1beta1.PortsSpec, error) {
4748
// now, we gather which ports we might need to open
4849
// for that, we get all the exporters and check their `endpoint` properties,
4950
// extracting the port from it. The port name has to be a "DNS_LABEL", so, we try to make it follow the pattern:
@@ -119,10 +120,17 @@ func ConfigToComponentPorts(logger logr.Logger, cType ComponentType, config map[
119120
return ports[i].Name < ports[j].Name
120121
})
121122

122-
return ports, nil
123+
patchedPorts := []v1beta1.PortsSpec{}
124+
for _, p := range ports {
125+
patchedPorts = append(patchedPorts, v1beta1.PortsSpec{
126+
ServicePort: p,
127+
})
128+
}
129+
130+
return patchedPorts, nil
123131
}
124132

125-
func ConfigToPorts(logger logr.Logger, config map[interface{}]interface{}) ([]corev1.ServicePort, error) {
133+
func ConfigToPorts(logger logr.Logger, config map[interface{}]interface{}) ([]v1beta1.PortsSpec, error) {
126134
ports, err := ConfigToComponentPorts(logger, ComponentTypeReceiver, config)
127135
if err != nil {
128136
logger.Error(err, "there was a problem while getting the ports from the receivers")

internal/manifests/collector/adapters/config_to_ports_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ func TestExtractPortsFromConfig(t *testing.T) {
9595
targetPort4317 := intstr.IntOrString{Type: 0, IntVal: 4317, StrVal: ""}
9696
targetPort4318 := intstr.IntOrString{Type: 0, IntVal: 4318, StrVal: ""}
9797

98+
svcPorts := []corev1.ServicePort{}
99+
for _, p := range ports {
100+
svcPorts = append(svcPorts, p.ServicePort)
101+
}
102+
98103
expectedPorts := []corev1.ServicePort{
99104
{Name: "examplereceiver", Port: 12345},
100105
{Name: "port-12346", Port: 12346},
@@ -107,7 +112,7 @@ func TestExtractPortsFromConfig(t *testing.T) {
107112
{Name: "otlp-http", AppProtocol: &httpAppProtocol, Port: 4318, TargetPort: targetPort4318},
108113
{Name: "zipkin", AppProtocol: &httpAppProtocol, Protocol: "TCP", Port: 9411},
109114
}
110-
assert.ElementsMatch(t, expectedPorts, ports)
115+
assert.ElementsMatch(t, expectedPorts, svcPorts)
111116
}
112117

113118
func TestNoPortsParsed(t *testing.T) {

internal/manifests/collector/container.go

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func Container(cfg config.Config, logger logr.Logger, otelcol v1beta1.OpenTeleme
5959
Name: p.Name,
6060
ContainerPort: p.Port,
6161
Protocol: p.Protocol,
62+
HostPort: p.HostPort,
6263
}
6364
}
6465

0 commit comments

Comments
 (0)