Skip to content

Commit 5e07072

Browse files
committed
Extend the list of explictly protected namespaces with openshift namespace
This namespaces ("openshift") is created by default as well. It needs to be protected.
1 parent 7c82e14 commit 5e07072

File tree

58 files changed

+2192
-78
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+2192
-78
lines changed

pkg/operator/target_config_reconciler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func NewTargetConfigReconciler(
9595
klog.ErrorS(err, "error listing namespaces")
9696
return nil
9797
}
98-
protectedNamespaces := []string{"kube-system", "hypershift"}
98+
protectedNamespaces := []string{"kube-system", "hypershift", "openshift"}
9999
for _, ns := range allNamespaces.Items {
100100
if strings.HasPrefix(ns.Name, "openshift-") {
101101
protectedNamespaces = append(protectedNamespaces, ns.Name)

pkg/operator/target_config_reconciler_test.go

Lines changed: 84 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,36 @@ import (
1717
"k8s.io/apimachinery/pkg/api/resource"
1818
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1919
"k8s.io/apimachinery/pkg/labels"
20+
"k8s.io/apimachinery/pkg/runtime"
2021
"k8s.io/apimachinery/pkg/runtime/schema"
22+
dynamicfake "k8s.io/client-go/dynamic/fake"
2123
"k8s.io/client-go/kubernetes/fake"
2224
utilptr "k8s.io/utils/ptr"
2325

26+
fakeconfigv1client "github.com/openshift/client-go/config/clientset/versioned/fake"
27+
configv1informers "github.com/openshift/client-go/config/informers/externalversions"
28+
fakeroutev1client "github.com/openshift/client-go/route/clientset/versioned/fake"
29+
routev1informers "github.com/openshift/client-go/route/informers/externalversions"
2430
deschedulerv1 "github.com/openshift/cluster-kube-descheduler-operator/pkg/apis/descheduler/v1"
2531
operatorconfigclient "github.com/openshift/cluster-kube-descheduler-operator/pkg/generated/clientset/versioned/fake"
32+
operatorclientinformers "github.com/openshift/cluster-kube-descheduler-operator/pkg/generated/informers/externalversions"
33+
"github.com/openshift/cluster-kube-descheduler-operator/pkg/operator/operatorclient"
2634
bindata "github.com/openshift/cluster-kube-descheduler-operator/pkg/operator/testdata"
2735
)
2836

2937
var configLowNodeUtilization = &configv1.Scheduler{
38+
ObjectMeta: metav1.ObjectMeta{
39+
Name: "cluster",
40+
},
3041
Spec: configv1.SchedulerSpec{Policy: configv1.ConfigMapNameReference{Name: ""},
3142
Profile: configv1.LowNodeUtilization,
3243
},
3344
}
3445

3546
var configHighNodeUtilization = &configv1.Scheduler{
47+
ObjectMeta: metav1.ObjectMeta{
48+
Name: "cluster",
49+
},
3650
Spec: configv1.SchedulerSpec{Policy: configv1.ConfigMapNameReference{Name: ""},
3751
Profile: configv1.HighNodeUtilization,
3852
},
@@ -45,12 +59,12 @@ func TestManageConfigMap(t *testing.T) {
4559

4660
fakeRecorder := NewFakeRecorder(1024)
4761
tests := []struct {
48-
name string
49-
targetConfigReconciler *TargetConfigReconciler
50-
want *corev1.ConfigMap
51-
descheduler *deschedulerv1.KubeDescheduler
52-
err error
53-
forceDeployment bool
62+
name string
63+
schedulerConfig *configv1.Scheduler
64+
want *corev1.ConfigMap
65+
descheduler *deschedulerv1.KubeDescheduler
66+
err error
67+
forceDeployment bool
5468
}{
5569
{
5670
name: "Podlifetime",
@@ -179,9 +193,6 @@ func TestManageConfigMap(t *testing.T) {
179193
},
180194
{
181195
name: "AffinityAndTaintsWithNamespaces",
182-
targetConfigReconciler: &TargetConfigReconciler{
183-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
184-
},
185196
descheduler: &deschedulerv1.KubeDescheduler{
186197
Spec: deschedulerv1.KubeDeschedulerSpec{
187198
Profiles: []deschedulerv1.DeschedulerProfile{"AffinityAndTaints"},
@@ -197,9 +208,6 @@ func TestManageConfigMap(t *testing.T) {
197208
},
198209
{
199210
name: "LongLifecycleWithNamespaces",
200-
targetConfigReconciler: &TargetConfigReconciler{
201-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
202-
},
203211
descheduler: &deschedulerv1.KubeDescheduler{
204212
Spec: deschedulerv1.KubeDeschedulerSpec{
205213
Profiles: []deschedulerv1.DeschedulerProfile{"LongLifecycle"},
@@ -215,9 +223,6 @@ func TestManageConfigMap(t *testing.T) {
215223
},
216224
{
217225
name: "LongLifecycleWithLocalStorage",
218-
targetConfigReconciler: &TargetConfigReconciler{
219-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
220-
},
221226
descheduler: &deschedulerv1.KubeDescheduler{
222227
Spec: deschedulerv1.KubeDeschedulerSpec{
223228
Profiles: []deschedulerv1.DeschedulerProfile{"LongLifecycle", "EvictPodsWithLocalStorage"},
@@ -230,9 +235,6 @@ func TestManageConfigMap(t *testing.T) {
230235
},
231236
{
232237
name: "SoftTopologyAndDuplicates",
233-
targetConfigReconciler: &TargetConfigReconciler{
234-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
235-
},
236238
descheduler: &deschedulerv1.KubeDescheduler{
237239
Spec: deschedulerv1.KubeDeschedulerSpec{
238240
Profiles: []deschedulerv1.DeschedulerProfile{"SoftTopologyAndDuplicates"},
@@ -245,9 +247,6 @@ func TestManageConfigMap(t *testing.T) {
245247
},
246248
{
247249
name: "TopologyAndDuplicates",
248-
targetConfigReconciler: &TargetConfigReconciler{
249-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
250-
},
251250
descheduler: &deschedulerv1.KubeDescheduler{
252251
Spec: deschedulerv1.KubeDeschedulerSpec{
253252
Profiles: []deschedulerv1.DeschedulerProfile{"TopologyAndDuplicates"},
@@ -259,13 +258,8 @@ func TestManageConfigMap(t *testing.T) {
259258
},
260259
},
261260
{
262-
name: "CompactAndScaleWithNamespaces",
263-
targetConfigReconciler: &TargetConfigReconciler{
264-
configSchedulerLister: &fakeSchedConfigLister{
265-
Items: map[string]*configv1.Scheduler{"cluster": configHighNodeUtilization},
266-
},
267-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
268-
},
261+
name: "CompactAndScaleWithNamespaces",
262+
schedulerConfig: configHighNodeUtilization,
269263
descheduler: &deschedulerv1.KubeDescheduler{
270264
Spec: deschedulerv1.KubeDeschedulerSpec{
271265
Profiles: []deschedulerv1.DeschedulerProfile{"CompactAndScale"},
@@ -280,13 +274,8 @@ func TestManageConfigMap(t *testing.T) {
280274
},
281275
},
282276
{
283-
name: "CompactAndScaleMinimal",
284-
targetConfigReconciler: &TargetConfigReconciler{
285-
configSchedulerLister: &fakeSchedConfigLister{
286-
Items: map[string]*configv1.Scheduler{"cluster": configHighNodeUtilization},
287-
},
288-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
289-
},
277+
name: "CompactAndScaleMinimal",
278+
schedulerConfig: configHighNodeUtilization,
290279
descheduler: &deschedulerv1.KubeDescheduler{
291280
Spec: deschedulerv1.KubeDeschedulerSpec{
292281
Profiles: []deschedulerv1.DeschedulerProfile{"CompactAndScale"},
@@ -301,13 +290,8 @@ func TestManageConfigMap(t *testing.T) {
301290
},
302291
},
303292
{
304-
name: "CompactAndScaleModest",
305-
targetConfigReconciler: &TargetConfigReconciler{
306-
configSchedulerLister: &fakeSchedConfigLister{
307-
Items: map[string]*configv1.Scheduler{"cluster": configHighNodeUtilization},
308-
},
309-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
310-
},
293+
name: "CompactAndScaleModest",
294+
schedulerConfig: configHighNodeUtilization,
311295
descheduler: &deschedulerv1.KubeDescheduler{
312296
Spec: deschedulerv1.KubeDeschedulerSpec{
313297
Profiles: []deschedulerv1.DeschedulerProfile{"CompactAndScale"},
@@ -322,13 +306,8 @@ func TestManageConfigMap(t *testing.T) {
322306
},
323307
},
324308
{
325-
name: "CompactAndScaleDefault",
326-
targetConfigReconciler: &TargetConfigReconciler{
327-
configSchedulerLister: &fakeSchedConfigLister{
328-
Items: map[string]*configv1.Scheduler{"cluster": configHighNodeUtilization},
329-
},
330-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
331-
},
309+
name: "CompactAndScaleDefault",
310+
schedulerConfig: configHighNodeUtilization,
332311
descheduler: &deschedulerv1.KubeDescheduler{
333312
Spec: deschedulerv1.KubeDeschedulerSpec{
334313
Profiles: []deschedulerv1.DeschedulerProfile{"CompactAndScale"},
@@ -343,13 +322,8 @@ func TestManageConfigMap(t *testing.T) {
343322
},
344323
},
345324
{
346-
name: "CompactAndScaleModerate",
347-
targetConfigReconciler: &TargetConfigReconciler{
348-
configSchedulerLister: &fakeSchedConfigLister{
349-
Items: map[string]*configv1.Scheduler{"cluster": configHighNodeUtilization},
350-
},
351-
protectedNamespaces: []string{"openshift-kube-scheduler", "kube-system"},
352-
},
325+
name: "CompactAndScaleModerate",
326+
schedulerConfig: configHighNodeUtilization,
353327
descheduler: &deschedulerv1.KubeDescheduler{
354328
Spec: deschedulerv1.KubeDeschedulerSpec{
355329
Profiles: []deschedulerv1.DeschedulerProfile{"CompactAndScale"},
@@ -437,18 +411,62 @@ func TestManageConfigMap(t *testing.T) {
437411

438412
for _, tt := range tests {
439413
t.Run(tt.name, func(t *testing.T) {
440-
if tt.targetConfigReconciler == nil {
441-
tt.targetConfigReconciler = &TargetConfigReconciler{}
414+
if tt.schedulerConfig == nil {
415+
tt.schedulerConfig = configLowNodeUtilization
442416
}
443-
tt.targetConfigReconciler.ctx = context.TODO()
444-
tt.targetConfigReconciler.kubeClient = fake.NewSimpleClientset()
445-
tt.targetConfigReconciler.eventRecorder = fakeRecorder
446-
if tt.targetConfigReconciler.configSchedulerLister == nil {
447-
tt.targetConfigReconciler.configSchedulerLister = &fakeSchedConfigLister{
448-
Items: map[string]*configv1.Scheduler{"cluster": configLowNodeUtilization},
449-
}
417+
418+
objects := []runtime.Object{
419+
&corev1.Namespace{
420+
ObjectMeta: metav1.ObjectMeta{
421+
Name: "openshift-kube-scheduler",
422+
},
423+
},
424+
&corev1.Namespace{
425+
ObjectMeta: metav1.ObjectMeta{
426+
Name: "kube-system",
427+
},
428+
},
429+
}
430+
431+
ctx, cancelFunc := context.WithCancel(context.TODO())
432+
defer cancelFunc()
433+
operatorConfigClient := operatorconfigclient.NewSimpleClientset()
434+
operatorConfigInformers := operatorclientinformers.NewSharedInformerFactory(operatorConfigClient, 10*time.Minute)
435+
deschedulerClient := &operatorclient.DeschedulerClient{
436+
Ctx: ctx,
437+
SharedInformer: operatorConfigInformers.Kubedeschedulers().V1().KubeDeschedulers().Informer(),
438+
OperatorClient: operatorConfigClient.KubedeschedulersV1(),
450439
}
451-
got, forceDeployment, err := tt.targetConfigReconciler.manageConfigMap(tt.descheduler)
440+
441+
openshiftConfigClient := fakeconfigv1client.NewSimpleClientset(tt.schedulerConfig)
442+
configInformers := configv1informers.NewSharedInformerFactory(openshiftConfigClient, 10*time.Minute)
443+
openshiftRouteClient := fakeroutev1client.NewSimpleClientset()
444+
routeInformers := routev1informers.NewSharedInformerFactory(openshiftRouteClient, 10*time.Minute)
445+
446+
scheme := runtime.NewScheme()
447+
448+
targetConfigReconciler := NewTargetConfigReconciler(
449+
ctx,
450+
"RELATED_IMAGE_OPERAND_IMAGE",
451+
operatorConfigClient.KubedeschedulersV1(),
452+
operatorConfigInformers.Kubedeschedulers().V1().KubeDeschedulers(),
453+
deschedulerClient,
454+
fake.NewSimpleClientset(objects...),
455+
dynamicfake.NewSimpleDynamicClient(scheme),
456+
configInformers,
457+
routeInformers,
458+
fakeRecorder,
459+
)
460+
461+
operatorConfigInformers.Start(ctx.Done())
462+
configInformers.Start(ctx.Done())
463+
routeInformers.Start(ctx.Done())
464+
465+
operatorConfigInformers.WaitForCacheSync(ctx.Done())
466+
configInformers.WaitForCacheSync(ctx.Done())
467+
routeInformers.WaitForCacheSync(ctx.Done())
468+
469+
got, forceDeployment, err := targetConfigReconciler.manageConfigMap(tt.descheduler)
452470
if tt.err != nil {
453471
if err == nil {
454472
t.Fatalf("Expected error, not nil\n")

pkg/operator/testdata/assets/highNodeUtilization.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ profiles:
77
- args:
88
evictableNamespaces:
99
exclude:
10-
- openshift-kube-scheduler
1110
- kube-system
11+
- hypershift
12+
- openshift
13+
- openshift-kube-scheduler
1214
metricsUtilization:
1315
prometheus: {}
1416
thresholds:

pkg/operator/testdata/assets/highNodeUtilizationMinimal.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ profiles:
77
- args:
88
evictableNamespaces:
99
exclude:
10-
- openshift-kube-scheduler
1110
- kube-system
11+
- hypershift
12+
- openshift
13+
- openshift-kube-scheduler
1214
metricsUtilization:
1315
prometheus: {}
1416
thresholds:

pkg/operator/testdata/assets/highNodeUtilizationModerate.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ profiles:
77
- args:
88
evictableNamespaces:
99
exclude:
10-
- openshift-kube-scheduler
1110
- kube-system
11+
- hypershift
12+
- openshift
13+
- openshift-kube-scheduler
1214
metricsUtilization:
1315
prometheus: {}
1416
thresholds:

pkg/operator/testdata/assets/lifecycleAndUtilizationEvictPvcPodsConfig.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,30 @@ profiles:
66
pluginConfig:
77
- args:
88
maxPodLifeTimeSeconds: 86400
9+
namespaces:
10+
exclude:
11+
- kube-system
12+
- hypershift
13+
- openshift
14+
- openshift-kube-scheduler
915
name: PodLifeTime
1016
- args:
1117
includingInitContainers: true
18+
namespaces:
19+
exclude:
20+
- kube-system
21+
- hypershift
22+
- openshift
23+
- openshift-kube-scheduler
1224
podRestartThreshold: 100
1325
name: RemovePodsHavingTooManyRestarts
1426
- args:
27+
evictableNamespaces:
28+
exclude:
29+
- kube-system
30+
- hypershift
31+
- openshift
32+
- openshift-kube-scheduler
1533
metricsUtilization:
1634
prometheus: {}
1735
targetThresholds:

pkg/operator/testdata/assets/lifecycleAndUtilizationPodLifeTimeCustomizationConfig.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,30 @@ profiles:
66
pluginConfig:
77
- args:
88
maxPodLifeTimeSeconds: 300
9+
namespaces:
10+
exclude:
11+
- kube-system
12+
- hypershift
13+
- openshift
14+
- openshift-kube-scheduler
915
name: PodLifeTime
1016
- args:
1117
includingInitContainers: true
18+
namespaces:
19+
exclude:
20+
- kube-system
21+
- hypershift
22+
- openshift
23+
- openshift-kube-scheduler
1224
podRestartThreshold: 100
1325
name: RemovePodsHavingTooManyRestarts
1426
- args:
27+
evictableNamespaces:
28+
exclude:
29+
- kube-system
30+
- hypershift
31+
- openshift
32+
- openshift-kube-scheduler
1533
metricsUtilization:
1634
prometheus: {}
1735
targetThresholds:

pkg/operator/testdata/assets/lifecycleAndUtilizationPodLifeTimeWithThresholdPriorityClassNameConfig.yaml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,30 @@ profiles:
66
pluginConfig:
77
- args:
88
maxPodLifeTimeSeconds: 86400
9+
namespaces:
10+
exclude:
11+
- kube-system
12+
- hypershift
13+
- openshift
14+
- openshift-kube-scheduler
915
name: PodLifeTime
1016
- args:
1117
includingInitContainers: true
18+
namespaces:
19+
exclude:
20+
- kube-system
21+
- hypershift
22+
- openshift
23+
- openshift-kube-scheduler
1224
podRestartThreshold: 100
1325
name: RemovePodsHavingTooManyRestarts
1426
- args:
27+
evictableNamespaces:
28+
exclude:
29+
- kube-system
30+
- hypershift
31+
- openshift
32+
- openshift-kube-scheduler
1533
metricsUtilization:
1634
prometheus: {}
1735
targetThresholds:

0 commit comments

Comments
 (0)