Skip to content

Commit 78b78b9

Browse files
authored
Merge pull request #467 from ingvagabund/extend-the-list-of-protected-ns-with-openshift
Extend the list of explictly protected namespaces with openshift namespace
2 parents 7c82e14 + 5e07072 commit 78b78b9

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)