Skip to content

Commit 0d37608

Browse files
committed
Fix tolerations API placement and implementation
Move tolerations from ContainerSpec to OperatorSpec level since tolerations are deployment/pod-level configuration, not container-level. Changes: - Move Tolerations field from ContainerSpec to OperatorSpec in API types - Update override logic to use correct field path (opOvr.Tolerations) - Fix test cases to use OperatorSpec.Tolerations instead of ControllerManager.Tolerations - Fix YAML indentation in sample configuration This corrects the API design to follow Kubernetes conventions where tolerations are specified at the pod template level, not per container. Signed-off-by: Martin Schuppert <[email protected]>
1 parent 06610ad commit 0d37608

File tree

7 files changed

+99
-113
lines changed

7 files changed

+99
-113
lines changed

apis/bases/operator.openstack.org_openstacks.yaml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,6 @@ spec:
7070
x-kubernetes-int-or-string: true
7171
type: object
7272
type: object
73-
tolerations:
74-
items:
75-
properties:
76-
effect:
77-
type: string
78-
key:
79-
type: string
80-
operator:
81-
type: string
82-
tolerationSeconds:
83-
format: int64
84-
type: integer
85-
value:
86-
type: string
87-
type: object
88-
type: array
8973
type: object
9074
name:
9175
enum:
@@ -118,6 +102,22 @@ spec:
118102
maximum: 1
119103
minimum: 0
120104
type: integer
105+
tolerations:
106+
items:
107+
properties:
108+
effect:
109+
type: string
110+
key:
111+
type: string
112+
operator:
113+
type: string
114+
tolerationSeconds:
115+
format: int64
116+
type: integer
117+
value:
118+
type: string
119+
type: object
120+
type: array
121121
required:
122122
- name
123123
type: object

apis/operator/v1beta1/openstack_types.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ type OperatorSpec struct {
220220
// +kubebuilder:validation:Optional
221221
// ControllerManager - tunings for the controller manager container
222222
ControllerManager ContainerSpec `json:"controllerManager,omitempty"`
223+
224+
// +kubebuilder:validation:Optional
225+
// Tolerations - Tolerations for the service operator deployment pods
226+
// https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
227+
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
223228
}
224229

225230
// ContainerSpec - customization for the container spec
@@ -228,11 +233,6 @@ type ContainerSpec struct {
228233
// Resources - Compute Resources for the service operator controller manager
229234
// https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
230235
Resources corev1.ResourceRequirements `json:"resources,omitempty"`
231-
232-
// +kubebuilder:validation:Optional
233-
// Tolerations - Tolerations for the service operator controller manager
234-
// https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
235-
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
236236
}
237237

238238
// OpenStackStatus defines the observed state of OpenStack

apis/operator/v1beta1/zz_generated.deepcopy.go

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/operator.openstack.org_openstacks.yaml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,6 @@ spec:
7070
x-kubernetes-int-or-string: true
7171
type: object
7272
type: object
73-
tolerations:
74-
items:
75-
properties:
76-
effect:
77-
type: string
78-
key:
79-
type: string
80-
operator:
81-
type: string
82-
tolerationSeconds:
83-
format: int64
84-
type: integer
85-
value:
86-
type: string
87-
type: object
88-
type: array
8973
type: object
9074
name:
9175
enum:
@@ -118,6 +102,22 @@ spec:
118102
maximum: 1
119103
minimum: 0
120104
type: integer
105+
tolerations:
106+
items:
107+
properties:
108+
effect:
109+
type: string
110+
key:
111+
type: string
112+
operator:
113+
type: string
114+
tolerationSeconds:
115+
format: int64
116+
type: integer
117+
value:
118+
type: string
119+
type: object
120+
type: array
121121
required:
122122
- name
123123
type: object

config/samples/operator_v1beta1_openstack_tolerations_example.yaml

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,36 +28,34 @@ spec:
2828
operatorOverrides:
2929
- name: "keystone"
3030
# Custom tolerations for keystone operator pods
31-
controllerManager:
32-
tolerations:
33-
- key: "example.com/special-nodes"
34-
operator: "Equal"
35-
value: "keystone"
36-
effect: "NoSchedule"
37-
- key: "node.kubernetes.io/memory-pressure"
38-
operator: "Exists"
39-
effect: "NoExecute"
40-
tolerationSeconds: 300
31+
tolerations:
32+
- key: "example.com/special-nodes"
33+
operator: "Equal"
34+
value: "keystone"
35+
effect: "NoSchedule"
36+
- key: "node.kubernetes.io/memory-pressure"
37+
operator: "Exists"
38+
effect: "NoExecute"
39+
tolerationSeconds: 300
4140
- name: "nova"
4241
# Example: Override default tolerations and add new ones
4342
# Result will be:
4443
# 1. node.kubernetes.io/not-ready (OVERRIDDEN - 600s instead of 120s)
4544
# 2. node.kubernetes.io/unreachable (OVERRIDDEN - 400s instead of 120s)
4645
# 3. node.example.com/compute (ADDED - new toleration)
47-
controllerManager:
48-
tolerations:
49-
- key: "node.kubernetes.io/not-ready"
50-
operator: "Exists"
51-
effect: "NoExecute"
52-
tolerationSeconds: 600 # Override default 120s
53-
- key: "node.kubernetes.io/unreachable"
54-
operator: "Exists"
55-
effect: "NoExecute"
56-
tolerationSeconds: 400 # Override default 120s
57-
- key: "node.example.com/compute" # Add new toleration
58-
operator: "Equal"
59-
value: "true"
60-
effect: "NoSchedule"
46+
tolerations:
47+
- key: "node.kubernetes.io/not-ready"
48+
operator: "Exists"
49+
effect: "NoExecute"
50+
tolerationSeconds: 600 # Override default 120s
51+
- key: "node.kubernetes.io/unreachable"
52+
operator: "Exists"
53+
effect: "NoExecute"
54+
tolerationSeconds: 400 # Override default 120s
55+
- key: "node.example.com/compute" # Add new toleration
56+
operator: "Equal"
57+
value: "true"
58+
effect: "NoSchedule"
6159
- name: "glance"
6260
# Custom resource limits AND tolerations example
6361
controllerManager:
@@ -68,9 +66,9 @@ spec:
6866
requests:
6967
cpu: "1"
7068
memory: "2Gi"
71-
tolerations:
72-
- key: "storage-node"
73-
operator: "Equal"
74-
value: "true"
75-
effect: "NoSchedule"
69+
tolerations:
70+
- key: "storage-node"
71+
operator: "Equal"
72+
value: "true"
73+
effect: "NoSchedule"
7674
# Note: Operators not listed (like mariadb, neutron, etc.) will use the default tolerations

pkg/operator/override.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ func SetOverrides(opOvr operatorv1beta1.OperatorSpec, op *Operator) {
109109
op.Deployment.Manager.Resources.Requests.Memory = opOvr.ControllerManager.Resources.Requests.Memory().String()
110110
}
111111
}
112-
if len(opOvr.ControllerManager.Tolerations) > 0 {
113-
op.Deployment.Tolerations = mergeTolerations(op.Deployment.Tolerations, opOvr.ControllerManager.Tolerations)
112+
if len(opOvr.Tolerations) > 0 {
113+
op.Deployment.Tolerations = mergeTolerations(op.Deployment.Tolerations, opOvr.Tolerations)
114114
}
115115
}
116116

pkg/operator/override_test.go

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,8 @@ func TestApplyOperatorOverrides(t *testing.T) {
157157
},
158158
},
159159
{
160-
Name: "nova",
161-
ControllerManager: operatorv1beta1.ContainerSpec{
162-
Tolerations: customTolerations,
163-
},
160+
Name: "nova",
161+
Tolerations: customTolerations,
164162
},
165163
}
166164

@@ -363,32 +361,26 @@ func TestTolerationsOverride(t *testing.T) {
363361
{
364362
name: "Add tolerations to empty list",
365363
operatorSpec: operatorv1beta1.OperatorSpec{
366-
Name: "test-operator",
367-
ControllerManager: operatorv1beta1.ContainerSpec{
368-
Tolerations: testTolerations,
369-
},
364+
Name: "test-operator",
365+
Tolerations: testTolerations,
370366
},
371367
initialTolerations: nil,
372368
expectedTolerations: testTolerations,
373369
},
374370
{
375371
name: "No custom tolerations, keep defaults unchanged",
376372
operatorSpec: operatorv1beta1.OperatorSpec{
377-
Name: "test-operator",
378-
ControllerManager: operatorv1beta1.ContainerSpec{
379-
// No tolerations specified
380-
},
373+
Name: "test-operator",
374+
// No tolerations specified
381375
},
382376
initialTolerations: defaultTolerations,
383377
expectedTolerations: defaultTolerations,
384378
},
385379
{
386380
name: "Merge custom tolerations with defaults (different keys)",
387381
operatorSpec: operatorv1beta1.OperatorSpec{
388-
Name: "test-operator",
389-
ControllerManager: operatorv1beta1.ContainerSpec{
390-
Tolerations: testTolerations, // Different keys than defaults
391-
},
382+
Name: "test-operator",
383+
Tolerations: testTolerations, // Different keys than defaults
392384
},
393385
initialTolerations: defaultTolerations,
394386
expectedTolerations: append(defaultTolerations, testTolerations...),
@@ -397,14 +389,12 @@ func TestTolerationsOverride(t *testing.T) {
397389
name: "Override default tolerations (same key)",
398390
operatorSpec: operatorv1beta1.OperatorSpec{
399391
Name: "test-operator",
400-
ControllerManager: operatorv1beta1.ContainerSpec{
401-
Tolerations: []corev1.Toleration{
402-
{
403-
Key: corev1.TaintNodeNotReady, // "node.kubernetes.io/not-ready", // Same key as default
404-
Operator: corev1.TolerationOpExists,
405-
Effect: corev1.TaintEffectNoExecute,
406-
TolerationSeconds: ptr.To[int64](600), // Different value
407-
},
392+
Tolerations: []corev1.Toleration{
393+
{
394+
Key: corev1.TaintNodeNotReady, // "node.kubernetes.io/not-ready", // Same key as default
395+
Operator: corev1.TolerationOpExists,
396+
Effect: corev1.TaintEffectNoExecute,
397+
TolerationSeconds: ptr.To[int64](600), // Different value
408398
},
409399
},
410400
},
@@ -428,20 +418,18 @@ func TestTolerationsOverride(t *testing.T) {
428418
name: "Mixed scenario: override one default, add new custom",
429419
operatorSpec: operatorv1beta1.OperatorSpec{
430420
Name: "test-operator",
431-
ControllerManager: operatorv1beta1.ContainerSpec{
432-
Tolerations: []corev1.Toleration{
433-
{
434-
Key: corev1.TaintNodeNotReady, // "node.kubernetes.io/not-ready", // Override default
435-
Operator: corev1.TolerationOpExists,
436-
Effect: corev1.TaintEffectNoExecute,
437-
TolerationSeconds: ptr.To[int64](300),
438-
},
439-
{
440-
Key: "node.example.com/gpu", // Add new
441-
Operator: corev1.TolerationOpEqual,
442-
Value: "nvidia",
443-
Effect: corev1.TaintEffectNoSchedule,
444-
},
421+
Tolerations: []corev1.Toleration{
422+
{
423+
Key: corev1.TaintNodeNotReady, // "node.kubernetes.io/not-ready", // Override default
424+
Operator: corev1.TolerationOpExists,
425+
Effect: corev1.TaintEffectNoExecute,
426+
TolerationSeconds: ptr.To[int64](300),
427+
},
428+
{
429+
Key: "node.example.com/gpu", // Add new
430+
Operator: corev1.TolerationOpEqual,
431+
Value: "nvidia",
432+
Effect: corev1.TaintEffectNoSchedule,
445433
},
446434
},
447435
},

0 commit comments

Comments
 (0)