Skip to content

Commit 904b7ec

Browse files
authored
Fix Pod NodeSelector changes from OpenTelemetryCollector (#2941)
* Add node-selector test case Signed-off-by: Janario Oliveira <[email protected]> * Change to use merge WithOverwriteWithEmptyValue Signed-off-by: Janario Oliveira <[email protected]> * Add changelog Signed-off-by: Janario Oliveira <[email protected]> * Add changelog Signed-off-by: Janario Oliveira <[email protected]> * Change to merge-override-empty only the nodeSelector Signed-off-by: Janario Oliveira <[email protected]> * Invert order of nodeSelector override Signed-off-by: Janario Oliveira <[email protected]> --------- Signed-off-by: Janario Oliveira <[email protected]>
1 parent edae5b4 commit 904b7ec

11 files changed

+321
-1
lines changed
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: bug_fix
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: Fix to reflect changes of OpenTelemetryCollector.spec.nodeSelector in the collector Pods
9+
10+
# One or more tracking issues related to the change
11+
issues: [2940]
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: |
17+
When updating `OpenTelemetryCollector.spec.nodeSelector` it was not removing previous selector from the final collector pod (Deployment/Daemonset/Statefulset).

internal/manifests/mutate.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ func mergeWithOverride(dst, src interface{}) error {
178178
return mergo.Merge(dst, src, mergo.WithOverride)
179179
}
180180

181+
func mergeWithOverwriteWithEmptyValue(dst, src interface{}) error {
182+
return mergo.Merge(dst, src, mergo.WithOverwriteWithEmptyValue)
183+
}
184+
181185
func mutateSecret(existing, desired *corev1.Secret) {
182186
existing.Labels = desired.Labels
183187
existing.Annotations = desired.Annotations
@@ -270,10 +274,12 @@ func mutateDaemonset(existing, desired *appsv1.DaemonSet) error {
270274
if existing.CreationTimestamp.IsZero() {
271275
existing.Spec.Selector = desired.Spec.Selector
272276
}
273-
274277
if err := mergeWithOverride(&existing.Spec, desired.Spec); err != nil {
275278
return err
276279
}
280+
if err := mergeWithOverwriteWithEmptyValue(&existing.Spec.Template.Spec.NodeSelector, desired.Spec.Template.Spec.NodeSelector); err != nil {
281+
return err
282+
}
277283
return nil
278284
}
279285

@@ -290,6 +296,9 @@ func mutateDeployment(existing, desired *appsv1.Deployment) error {
290296
if err := mergeWithOverride(&existing.Spec.Template, desired.Spec.Template); err != nil {
291297
return err
292298
}
299+
if err := mergeWithOverwriteWithEmptyValue(&existing.Spec.Template.Spec.NodeSelector, desired.Spec.Template.Spec.NodeSelector); err != nil {
300+
return err
301+
}
293302
if err := mergeWithOverride(&existing.Spec.Strategy, desired.Spec.Strategy); err != nil {
294303
return err
295304
}
@@ -316,6 +325,9 @@ func mutateStatefulSet(existing, desired *appsv1.StatefulSet) error {
316325
if err := mergeWithOverride(&existing.Spec.Template, desired.Spec.Template); err != nil {
317326
return err
318327
}
328+
if err := mergeWithOverwriteWithEmptyValue(&existing.Spec.Template.Spec.NodeSelector, desired.Spec.Template.Spec.NodeSelector); err != nil {
329+
return err
330+
}
319331
return nil
320332
}
321333

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
labels:
5+
app.kubernetes.io/component: opentelemetry-collector
6+
app.kubernetes.io/managed-by: opentelemetry-operator
7+
app.kubernetes.io/name: daemonset-collector
8+
app.kubernetes.io/part-of: opentelemetry
9+
node-selector-mode: without
10+
spec:
11+
(nodeSelector == null): true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
labels:
5+
app.kubernetes.io/component: opentelemetry-collector
6+
app.kubernetes.io/managed-by: opentelemetry-operator
7+
app.kubernetes.io/name: deployment-collector
8+
app.kubernetes.io/part-of: opentelemetry
9+
node-selector-mode: without
10+
spec:
11+
(nodeSelector == null): true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
labels:
5+
app.kubernetes.io/component: opentelemetry-collector
6+
app.kubernetes.io/managed-by: opentelemetry-operator
7+
app.kubernetes.io/name: statefulset-collector
8+
app.kubernetes.io/part-of: opentelemetry
9+
node-selector-mode: without
10+
spec:
11+
(nodeSelector == null): true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
apiVersion: opentelemetry.io/v1alpha1
2+
kind: OpenTelemetryCollector
3+
metadata:
4+
name: deployment
5+
labels:
6+
node-selector-mode: without
7+
spec:
8+
mode: deployment
9+
config: |
10+
receivers:
11+
otlp:
12+
protocols:
13+
grpc:
14+
http:
15+
processors:
16+
17+
exporters:
18+
debug:
19+
20+
service:
21+
pipelines:
22+
traces:
23+
receivers: [otlp]
24+
processors: []
25+
exporters: [debug]
26+
27+
---
28+
apiVersion: opentelemetry.io/v1alpha1
29+
kind: OpenTelemetryCollector
30+
metadata:
31+
name: daemonset
32+
labels:
33+
node-selector-mode: without
34+
spec:
35+
mode: daemonset
36+
config: |
37+
receivers:
38+
otlp:
39+
protocols:
40+
grpc:
41+
http:
42+
processors:
43+
44+
exporters:
45+
debug:
46+
47+
service:
48+
pipelines:
49+
traces:
50+
receivers: [otlp]
51+
processors: []
52+
exporters: [debug]
53+
54+
---
55+
apiVersion: opentelemetry.io/v1alpha1
56+
kind: OpenTelemetryCollector
57+
metadata:
58+
name: statefulset
59+
labels:
60+
node-selector-mode: without
61+
spec:
62+
mode: statefulset
63+
config: |
64+
receivers:
65+
otlp:
66+
protocols:
67+
grpc:
68+
http:
69+
processors:
70+
71+
exporters:
72+
debug:
73+
74+
service:
75+
pipelines:
76+
traces:
77+
receivers: [otlp]
78+
processors: []
79+
exporters: [debug]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
labels:
5+
app.kubernetes.io/component: opentelemetry-collector
6+
app.kubernetes.io/managed-by: opentelemetry-operator
7+
app.kubernetes.io/name: daemonset-collector
8+
app.kubernetes.io/part-of: opentelemetry
9+
node-selector-mode: with
10+
spec:
11+
nodeSelector:
12+
kubernetes.io/os: linux
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
labels:
5+
app.kubernetes.io/component: opentelemetry-collector
6+
app.kubernetes.io/managed-by: opentelemetry-operator
7+
app.kubernetes.io/name: deployment-collector
8+
app.kubernetes.io/part-of: opentelemetry
9+
node-selector-mode: with
10+
spec:
11+
nodeSelector:
12+
kubernetes.io/os: linux
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
labels:
5+
app.kubernetes.io/component: opentelemetry-collector
6+
app.kubernetes.io/managed-by: opentelemetry-operator
7+
app.kubernetes.io/name: statefulset-collector
8+
app.kubernetes.io/part-of: opentelemetry
9+
node-selector-mode: with
10+
spec:
11+
nodeSelector:
12+
kubernetes.io/os: linux
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
apiVersion: opentelemetry.io/v1alpha1
2+
kind: OpenTelemetryCollector
3+
metadata:
4+
name: deployment
5+
labels:
6+
node-selector-mode: with
7+
spec:
8+
mode: deployment
9+
nodeSelector:
10+
kubernetes.io/os: linux
11+
config: |
12+
receivers:
13+
otlp:
14+
protocols:
15+
grpc:
16+
http:
17+
processors:
18+
19+
exporters:
20+
debug:
21+
22+
service:
23+
pipelines:
24+
traces:
25+
receivers: [otlp]
26+
processors: []
27+
exporters: [debug]
28+
29+
---
30+
apiVersion: opentelemetry.io/v1alpha1
31+
kind: OpenTelemetryCollector
32+
metadata:
33+
name: daemonset
34+
labels:
35+
node-selector-mode: with
36+
spec:
37+
mode: daemonset
38+
nodeSelector:
39+
kubernetes.io/os: linux
40+
config: |
41+
receivers:
42+
otlp:
43+
protocols:
44+
grpc:
45+
http:
46+
processors:
47+
48+
exporters:
49+
debug:
50+
51+
service:
52+
pipelines:
53+
traces:
54+
receivers: [otlp]
55+
processors: []
56+
exporters: [debug]
57+
58+
---
59+
apiVersion: opentelemetry.io/v1alpha1
60+
kind: OpenTelemetryCollector
61+
metadata:
62+
name: statefulset
63+
labels:
64+
node-selector-mode: with
65+
spec:
66+
mode: statefulset
67+
nodeSelector:
68+
kubernetes.io/os: linux
69+
config: |
70+
receivers:
71+
otlp:
72+
protocols:
73+
grpc:
74+
http:
75+
processors:
76+
77+
exporters:
78+
debug:
79+
80+
service:
81+
pipelines:
82+
traces:
83+
receivers: [otlp]
84+
processors: []
85+
exporters: [debug]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json
2+
apiVersion: chainsaw.kyverno.io/v1alpha1
3+
kind: Test
4+
metadata:
5+
creationTimestamp: null
6+
name: node-selector-collector
7+
spec:
8+
steps:
9+
- name: step-00
10+
description: collectors without nodeSelector
11+
try:
12+
- apply:
13+
file: 00-install-collectors-without-node-selector.yaml
14+
# deployment
15+
- assert:
16+
file: 00-assert-deployment-without-node-selector.yaml
17+
# daemonset
18+
- assert:
19+
file: 00-assert-daemonset-without-node-selector.yaml
20+
# statefulset
21+
- assert:
22+
file: 00-assert-statefulset-without-node-selector.yaml
23+
24+
- name: step-01
25+
description: collectors with nodeSelector
26+
try:
27+
- apply:
28+
file: 01-install-collectors-with-node-selector.yaml
29+
# deployment
30+
- assert:
31+
file: 01-assert-deployment-with-node-selector.yaml
32+
# daemonset
33+
- assert:
34+
file: 01-assert-daemonset-with-node-selector.yaml
35+
# statefulset
36+
- assert:
37+
file: 01-assert-statefulset-with-node-selector.yaml
38+
39+
- name: step-02
40+
description: back to no nodeSelector
41+
try:
42+
- command: # while update is not supported on 0.1.7, but 0.1.9 https://kyverno.github.io/chainsaw/0.1.9/operations/update/
43+
entrypoint: kubectl
44+
args:
45+
- -n
46+
- ${NAMESPACE}
47+
- replace
48+
- -f
49+
- 00-install-collectors-without-node-selector.yaml
50+
# deployment
51+
- assert:
52+
file: 00-assert-deployment-without-node-selector.yaml
53+
# daemonset
54+
- assert:
55+
file: 00-assert-daemonset-without-node-selector.yaml
56+
# statefulset
57+
- assert:
58+
file: 00-assert-statefulset-without-node-selector.yaml

0 commit comments

Comments
 (0)