Skip to content

Commit 3b9603a

Browse files
ricardomaraschiniingvagabund
authored andcommitted
OCPBUGS-57338: error out on zeroed scheduling interval
as we fail when the scheduling interval isn't set we should also fail when it is set to an invalid value.
1 parent e0ce482 commit 3b9603a

File tree

4 files changed

+52
-16
lines changed

4 files changed

+52
-16
lines changed

pkg/operator/target_config_reconciler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ func (c TargetConfigReconciler) sync() error {
155155
return err
156156
}
157157

158-
if descheduler.Spec.DeschedulingIntervalSeconds == nil {
159-
return fmt.Errorf("descheduler should have an interval set")
158+
if descheduler.Spec.DeschedulingIntervalSeconds == nil || *descheduler.Spec.DeschedulingIntervalSeconds <= 0 {
159+
return fmt.Errorf("descheduler should have an interval set and it should be greater than 0")
160160
}
161161

162162
specAnnotations := map[string]string{

pkg/operator/target_config_reconciler_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,6 +1508,29 @@ func TestSync(t *testing.T) {
15081508
Reason: fmt.Sprintf("profile %v can only be used when KubeVirt is properly deployed", deschedulerv1.RelieveAndMigrate),
15091509
},
15101510
},
1511+
{
1512+
name: "Zeroed out descheduling interval",
1513+
targetConfigReconciler: &TargetConfigReconciler{
1514+
ctx: context.TODO(),
1515+
kubeClient: fake.NewSimpleClientset(),
1516+
eventRecorder: fakeRecorder,
1517+
configSchedulerLister: &fakeSchedConfigLister{
1518+
Items: map[string]*configv1.Scheduler{"cluster": configLowNodeUtilization},
1519+
},
1520+
},
1521+
descheduler: &deschedulerv1.KubeDescheduler{
1522+
ObjectMeta: metav1.ObjectMeta{
1523+
Name: "cluster",
1524+
Namespace: "openshift-kube-descheduler-operator",
1525+
},
1526+
Spec: deschedulerv1.KubeDeschedulerSpec{
1527+
DeschedulingIntervalSeconds: utilptr.To[int32](0),
1528+
Profiles: []deschedulerv1.DeschedulerProfile{"LifecycleAndUtilization"},
1529+
ProfileCustomizations: &deschedulerv1.ProfileCustomizations{ThresholdPriority: utilptr.To[int32](1000), ThresholdPriorityClassName: "className"},
1530+
},
1531+
},
1532+
err: fmt.Errorf("descheduler should have an interval set and it should be greater than 0"),
1533+
},
15111534
}
15121535

15131536
for _, tt := range tests {

pkg/softtainter/softtainter.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ func (st *softTainter) Reconcile(ctx context.Context, request reconcile.Request)
102102
return reconcile.Result{}, err
103103
}
104104

105-
if des.Spec.DeschedulingIntervalSeconds == nil {
106-
return reconcile.Result{}, fmt.Errorf("descheduler should have an interval set")
105+
if des.Spec.DeschedulingIntervalSeconds == nil || *des.Spec.DeschedulingIntervalSeconds <= 0 {
106+
return reconcile.Result{}, fmt.Errorf("descheduler should have an interval set and it should be greater than 0")
107107
}
108108
st.resyncPeriod = time.Duration(*des.Spec.DeschedulingIntervalSeconds) * time.Second
109109

pkg/softtainter/softtainter_test.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package softtainter
22

33
import (
44
"context"
5-
"errors"
65
"os"
76
"path"
87
"strings"
@@ -75,7 +74,7 @@ func TestReconcile(t *testing.T) {
7574
nodes []*corev1.Node
7675
expectednodes []*corev1.Node
7776
nodeUtilization MockNodeUtilization
78-
expectedErr error
77+
expectedErr string
7978
kubedescheduler deschedulerv1.KubeDescheduler
8079
testfilename string
8180
}{
@@ -99,7 +98,6 @@ func TestReconcile(t *testing.T) {
9998
},
10099
mockErrors: nil,
101100
},
102-
expectedErr: nil,
103101
kubedescheduler: deschedulerv1.KubeDescheduler{
104102
ObjectMeta: metav1.ObjectMeta{
105103
Namespace: operatorclient.OperatorNamespace,
@@ -135,7 +133,6 @@ func TestReconcile(t *testing.T) {
135133
},
136134
mockErrors: nil,
137135
},
138-
expectedErr: nil,
139136
kubedescheduler: deschedulerv1.KubeDescheduler{
140137
ObjectMeta: metav1.ObjectMeta{
141138
Namespace: operatorclient.OperatorNamespace,
@@ -171,7 +168,6 @@ func TestReconcile(t *testing.T) {
171168
},
172169
mockErrors: nil,
173170
},
174-
expectedErr: nil,
175171
kubedescheduler: deschedulerv1.KubeDescheduler{
176172
ObjectMeta: metav1.ObjectMeta{
177173
Namespace: operatorclient.OperatorNamespace,
@@ -213,7 +209,6 @@ func TestReconcile(t *testing.T) {
213209
},
214210
mockErrors: nil,
215211
},
216-
expectedErr: nil,
217212
kubedescheduler: deschedulerv1.KubeDescheduler{
218213
ObjectMeta: metav1.ObjectMeta{
219214
Namespace: operatorclient.OperatorNamespace,
@@ -249,7 +244,6 @@ func TestReconcile(t *testing.T) {
249244
},
250245
mockErrors: nil,
251246
},
252-
expectedErr: nil,
253247
kubedescheduler: deschedulerv1.KubeDescheduler{
254248
ObjectMeta: metav1.ObjectMeta{
255249
Namespace: operatorclient.OperatorNamespace,
@@ -285,7 +279,6 @@ func TestReconcile(t *testing.T) {
285279
},
286280
mockErrors: nil,
287281
},
288-
expectedErr: nil,
289282
kubedescheduler: deschedulerv1.KubeDescheduler{
290283
ObjectMeta: metav1.ObjectMeta{
291284
Namespace: operatorclient.OperatorNamespace,
@@ -321,7 +314,6 @@ func TestReconcile(t *testing.T) {
321314
},
322315
mockErrors: nil,
323316
},
324-
expectedErr: nil,
325317
kubedescheduler: deschedulerv1.KubeDescheduler{
326318
ObjectMeta: metav1.ObjectMeta{
327319
Namespace: operatorclient.OperatorNamespace,
@@ -357,7 +349,6 @@ func TestReconcile(t *testing.T) {
357349
},
358350
mockErrors: nil,
359351
},
360-
expectedErr: nil,
361352
kubedescheduler: deschedulerv1.KubeDescheduler{
362353
ObjectMeta: metav1.ObjectMeta{
363354
Namespace: operatorclient.OperatorNamespace,
@@ -373,6 +364,22 @@ func TestReconcile(t *testing.T) {
373364
},
374365
testfilename: "policyNoRelieveAndMigrate.yaml",
375366
},
367+
{
368+
description: "zeroed out descheduling interval",
369+
nodes: []*corev1.Node{},
370+
expectedErr: "descheduler should have an interval set and it should be greater than 0",
371+
kubedescheduler: deschedulerv1.KubeDescheduler{
372+
ObjectMeta: metav1.ObjectMeta{
373+
Namespace: operatorclient.OperatorNamespace,
374+
Name: operatorclient.OperatorConfigName,
375+
},
376+
Spec: deschedulerv1.KubeDeschedulerSpec{
377+
DeschedulingIntervalSeconds: pointer.Int32(0),
378+
Mode: deschedulerv1.Automatic,
379+
},
380+
},
381+
testfilename: "policy.yaml",
382+
},
376383
}
377384
for _, tc := range tests {
378385
t.Run(tc.description, func(t *testing.T) {
@@ -389,8 +396,14 @@ func TestReconcile(t *testing.T) {
389396
nodeUtilizationFactory: tc.nodeUtilization.newNodeUtilizationFactory,
390397
}
391398
result, err := st.Reconcile(ctx, reconcile.Request{})
392-
if !errors.Is(err, tc.expectedErr) {
393-
t.Errorf("Test %#v failed, test case error: %v, expected error: %v", tc.description, err, tc.expectedErr)
399+
if err != nil {
400+
if tc.expectedErr == "" {
401+
t.Errorf("Test %#v failed, unexpected error: %v", tc.description, err)
402+
} else if !strings.Contains(err.Error(), tc.expectedErr) {
403+
t.Errorf("Test %#v failed, test case error: %v, expected error to contain: %v", tc.description, err, tc.expectedErr)
404+
}
405+
} else if tc.expectedErr != "" {
406+
t.Errorf("Test %#v failed, expected error: %v, but got no error", tc.description, tc.expectedErr)
394407
}
395408

396409
if tc.kubedescheduler.Spec.DeschedulingIntervalSeconds == nil || result.RequeueAfter != time.Duration(*tc.kubedescheduler.Spec.DeschedulingIntervalSeconds)*time.Second {

0 commit comments

Comments
 (0)