From 991eddb691ea85f3a690cd901b09952e461494c6 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Thu, 13 Feb 2020 12:38:18 +0100 Subject: [PATCH] Turn StrategyParameters.NodeResourceUtilizationThresholds field into a pointer The field is intended to be omitempty when not set. Without a pointer the strategy serialized into json string looks like: ```json strategies: LowNodeUtilization: enabled: true params: nodeResourceUtilizationThresholds: numberOfNodes: 1 targetThresholds: cpu: 50 memory: 50 pods: 20 thresholds: cpu: 50 memory: 50 pods: 20 RemoveDuplicates: enabled: true params: nodeResourceUtilizationThresholds: {} RemovePodsViolatingInterPodAntiAffinity: enabled: true params: nodeResourceUtilizationThresholds: {} RemovePodsViolatingNodeAffinity: enabled: true params: nodeAffinityType: - requiredDuringSchedulingIgnoredDuringExecution nodeResourceUtilizationThresholds: {} RemovePodsViolatingNodeTaints: enabled: true params: nodeResourceUtilizationThresholds: {} ``` It's preferred to have the following json string instead: ``` strategies: LowNodeUtilization: enabled: true params: nodeResourceUtilizationThresholds: numberOfNodes: 1 targetThresholds: cpu: 50 memory: 50 pods: 20 thresholds: cpu: 50 memory: 50 pods: 20 RemoveDuplicates: enabled: true RemovePodsViolatingInterPodAntiAffinity: enabled: true RemovePodsViolatingNodeAffinity: enabled: true params: nodeAffinityType: - requiredDuringSchedulingIgnoredDuringExecution RemovePodsViolatingNodeTaints: enabled: true ``` --- pkg/api/types.go | 2 +- pkg/api/v1alpha1/types.go | 6 +++--- pkg/api/v1alpha1/zz_generated.conversion.go | 8 ++------ pkg/api/v1alpha1/zz_generated.deepcopy.go | 6 +++++- pkg/api/zz_generated.deepcopy.go | 6 +++++- pkg/descheduler/strategies/lownodeutilization.go | 4 ++++ pkg/descheduler/strategies/lownodeutilization_test.go | 2 +- test/e2e/e2e_test.go | 2 +- 8 files changed, 22 insertions(+), 14 deletions(-) diff --git a/pkg/api/types.go b/pkg/api/types.go index 5d814f55c..e7777fc50 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -46,7 +46,7 @@ type DeschedulerStrategy struct { // Only one of its members may be specified type StrategyParameters struct { - NodeResourceUtilizationThresholds NodeResourceUtilizationThresholds + NodeResourceUtilizationThresholds *NodeResourceUtilizationThresholds NodeAffinityType []string PodsHavingTooManyRestarts PodsHavingTooManyRestarts } diff --git a/pkg/api/v1alpha1/types.go b/pkg/api/v1alpha1/types.go index 213b63fcf..148c2c672 100644 --- a/pkg/api/v1alpha1/types.go +++ b/pkg/api/v1alpha1/types.go @@ -46,9 +46,9 @@ type DeschedulerStrategy struct { // Only one of its members may be specified type StrategyParameters struct { - NodeResourceUtilizationThresholds NodeResourceUtilizationThresholds `json:"nodeResourceUtilizationThresholds,omitempty"` - NodeAffinityType []string `json:"nodeAffinityType,omitempty"` - PodsHavingTooManyRestarts PodsHavingTooManyRestarts `json:"podsHavingTooManyRestarts,omitempty"` + NodeResourceUtilizationThresholds *NodeResourceUtilizationThresholds `json:"nodeResourceUtilizationThresholds,omitempty"` + NodeAffinityType []string `json:"nodeAffinityType,omitempty"` + PodsHavingTooManyRestarts PodsHavingTooManyRestarts `json:"podsHavingTooManyRestarts,omitempty"` } type Percentage float64 diff --git a/pkg/api/v1alpha1/zz_generated.conversion.go b/pkg/api/v1alpha1/zz_generated.conversion.go index d251ac64a..1ecb0f215 100644 --- a/pkg/api/v1alpha1/zz_generated.conversion.go +++ b/pkg/api/v1alpha1/zz_generated.conversion.go @@ -183,9 +183,7 @@ func Convert_api_PodsHavingTooManyRestarts_To_v1alpha1_PodsHavingTooManyRestarts } func autoConvert_v1alpha1_StrategyParameters_To_api_StrategyParameters(in *StrategyParameters, out *api.StrategyParameters, s conversion.Scope) error { - if err := Convert_v1alpha1_NodeResourceUtilizationThresholds_To_api_NodeResourceUtilizationThresholds(&in.NodeResourceUtilizationThresholds, &out.NodeResourceUtilizationThresholds, s); err != nil { - return err - } + out.NodeResourceUtilizationThresholds = (*api.NodeResourceUtilizationThresholds)(unsafe.Pointer(in.NodeResourceUtilizationThresholds)) out.NodeAffinityType = *(*[]string)(unsafe.Pointer(&in.NodeAffinityType)) if err := Convert_v1alpha1_PodsHavingTooManyRestarts_To_api_PodsHavingTooManyRestarts(&in.PodsHavingTooManyRestarts, &out.PodsHavingTooManyRestarts, s); err != nil { return err @@ -199,9 +197,7 @@ func Convert_v1alpha1_StrategyParameters_To_api_StrategyParameters(in *StrategyP } func autoConvert_api_StrategyParameters_To_v1alpha1_StrategyParameters(in *api.StrategyParameters, out *StrategyParameters, s conversion.Scope) error { - if err := Convert_api_NodeResourceUtilizationThresholds_To_v1alpha1_NodeResourceUtilizationThresholds(&in.NodeResourceUtilizationThresholds, &out.NodeResourceUtilizationThresholds, s); err != nil { - return err - } + out.NodeResourceUtilizationThresholds = (*NodeResourceUtilizationThresholds)(unsafe.Pointer(in.NodeResourceUtilizationThresholds)) out.NodeAffinityType = *(*[]string)(unsafe.Pointer(&in.NodeAffinityType)) if err := Convert_api_PodsHavingTooManyRestarts_To_v1alpha1_PodsHavingTooManyRestarts(&in.PodsHavingTooManyRestarts, &out.PodsHavingTooManyRestarts, s); err != nil { return err diff --git a/pkg/api/v1alpha1/zz_generated.deepcopy.go b/pkg/api/v1alpha1/zz_generated.deepcopy.go index 37420ba13..1f14a02fc 100644 --- a/pkg/api/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/api/v1alpha1/zz_generated.deepcopy.go @@ -166,7 +166,11 @@ func (in StrategyList) DeepCopy() StrategyList { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StrategyParameters) DeepCopyInto(out *StrategyParameters) { *out = *in - in.NodeResourceUtilizationThresholds.DeepCopyInto(&out.NodeResourceUtilizationThresholds) + if in.NodeResourceUtilizationThresholds != nil { + in, out := &in.NodeResourceUtilizationThresholds, &out.NodeResourceUtilizationThresholds + *out = new(NodeResourceUtilizationThresholds) + (*in).DeepCopyInto(*out) + } if in.NodeAffinityType != nil { in, out := &in.NodeAffinityType, &out.NodeAffinityType *out = make([]string, len(*in)) diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index e046e70c1..8cae1a071 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -166,7 +166,11 @@ func (in StrategyList) DeepCopy() StrategyList { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StrategyParameters) DeepCopyInto(out *StrategyParameters) { *out = *in - in.NodeResourceUtilizationThresholds.DeepCopyInto(&out.NodeResourceUtilizationThresholds) + if in.NodeResourceUtilizationThresholds != nil { + in, out := &in.NodeResourceUtilizationThresholds, &out.NodeResourceUtilizationThresholds + *out = new(NodeResourceUtilizationThresholds) + (*in).DeepCopyInto(*out) + } if in.NodeAffinityType != nil { in, out := &in.NodeAffinityType, &out.NodeAffinityType *out = make([]string, len(*in)) diff --git a/pkg/descheduler/strategies/lownodeutilization.go b/pkg/descheduler/strategies/lownodeutilization.go index 2208cb7de..1673d57b5 100644 --- a/pkg/descheduler/strategies/lownodeutilization.go +++ b/pkg/descheduler/strategies/lownodeutilization.go @@ -46,6 +46,10 @@ func LowNodeUtilization(ds *options.DeschedulerServer, strategy api.DeschedulerS } // todo: move to config validation? // TODO: May be create a struct for the strategy as well, so that we don't have to pass along the all the params? + if strategy.Params.NodeResourceUtilizationThresholds == nil { + klog.V(1).Infof("NodeResourceUtilizationThresholds not set") + return + } thresholds := strategy.Params.NodeResourceUtilizationThresholds.Thresholds if !validateThresholds(thresholds) { diff --git a/pkg/descheduler/strategies/lownodeutilization_test.go b/pkg/descheduler/strategies/lownodeutilization_test.go index 40f6cb4be..7625f86ff 100644 --- a/pkg/descheduler/strategies/lownodeutilization_test.go +++ b/pkg/descheduler/strategies/lownodeutilization_test.go @@ -509,7 +509,7 @@ func TestWithTaints(t *testing.T) { strategy := api.DeschedulerStrategy{ Enabled: true, Params: api.StrategyParameters{ - NodeResourceUtilizationThresholds: api.NodeResourceUtilizationThresholds{ + NodeResourceUtilizationThresholds: &api.NodeResourceUtilizationThresholds{ Thresholds: api.ResourceThresholds{ v1.ResourcePods: 20, }, diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 3325ad1f8..92e3e267f 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -118,7 +118,7 @@ func startEndToEndForLowNodeUtilization(clientset clientset.Interface, nodeInfor lowNodeUtilizationStrategy := deschedulerapi.DeschedulerStrategy{ Enabled: true, Params: deschedulerapi.StrategyParameters{ - NodeResourceUtilizationThresholds: deschedulerapi.NodeResourceUtilizationThresholds{ + NodeResourceUtilizationThresholds: &deschedulerapi.NodeResourceUtilizationThresholds{ Thresholds: thresholds, TargetThresholds: targetThresholds, },