diff --git a/pkg/framework/plugins/nodeutilization/defaults.go b/pkg/framework/plugins/nodeutilization/defaults.go new file mode 100644 index 000000000..843033804 --- /dev/null +++ b/pkg/framework/plugins/nodeutilization/defaults.go @@ -0,0 +1,50 @@ +/* +Copyright 2022 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package nodeutilization + +import ( + "k8s.io/apimachinery/pkg/runtime" +) + +func addDefaultingFuncs(scheme *runtime.Scheme) error { + return RegisterDefaults(scheme) +} + +// SetDefaults_LowNodeUtilizationArgs +// TODO: the final default values would be discussed in community +func SetDefaults_LowNodeUtilizationArgs(obj *LowNodeUtilizationArgs) { + if obj.UseDeviationThresholds == false { + obj.UseDeviationThresholds = false + } + if obj.Thresholds == nil { + obj.Thresholds = nil + } + if obj.TargetThresholds == nil { + obj.TargetThresholds = nil + } + if obj.NumberOfNodes == 0 { + obj.NumberOfNodes = 0 + } +} + +// SetDefaults_HighNodeUtilizationArgs +// TODO: the final default values would be discussed in community +func SetDefaults_HighNodeUtilizationArgs(obj *HighNodeUtilizationArgs) { + if obj.Thresholds == nil { + obj.Thresholds = nil + } + if obj.NumberOfNodes == 0 { + obj.NumberOfNodes = 0 + } +} diff --git a/pkg/framework/plugins/nodeutilization/defaults_test.go b/pkg/framework/plugins/nodeutilization/defaults_test.go new file mode 100644 index 000000000..d3eb339a8 --- /dev/null +++ b/pkg/framework/plugins/nodeutilization/defaults_test.go @@ -0,0 +1,123 @@ +/* +Copyright 2022 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package nodeutilization + +import ( + "github.com/google/go-cmp/cmp" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "sigs.k8s.io/descheduler/pkg/api" + "testing" +) + +func TestSetDefaults_LowNodeUtilizationArgs(t *testing.T) { + tests := []struct { + name string + in runtime.Object + want runtime.Object + }{ + { + name: "LowNodeUtilizationArgs empty", + in: &LowNodeUtilizationArgs{}, + want: &LowNodeUtilizationArgs{ + UseDeviationThresholds: false, + Thresholds: nil, + TargetThresholds: nil, + NumberOfNodes: 0, + }, + }, + { + name: "LowNodeUtilizationArgs with value", + in: &LowNodeUtilizationArgs{ + UseDeviationThresholds: true, + Thresholds: api.ResourceThresholds{ + v1.ResourceCPU: 20, + v1.ResourceMemory: 120, + }, + TargetThresholds: api.ResourceThresholds{ + v1.ResourceCPU: 80, + v1.ResourceMemory: 80, + }, + NumberOfNodes: 10, + }, + want: &LowNodeUtilizationArgs{ + UseDeviationThresholds: true, + Thresholds: api.ResourceThresholds{ + v1.ResourceCPU: 20, + v1.ResourceMemory: 120, + }, + TargetThresholds: api.ResourceThresholds{ + v1.ResourceCPU: 80, + v1.ResourceMemory: 80, + }, + NumberOfNodes: 10, + }, + }, + } + for _, tc := range tests { + scheme := runtime.NewScheme() + utilruntime.Must(AddToScheme(scheme)) + t.Run(tc.name, func(t *testing.T) { + scheme.Default(tc.in) + if diff := cmp.Diff(tc.in, tc.want); diff != "" { + t.Errorf("Got unexpected defaults (-want, +got):\n%s", diff) + } + }) + } +} + +func TestSetDefaults_HighNodeUtilizationArgs(t *testing.T) { + tests := []struct { + name string + in runtime.Object + want runtime.Object + }{ + { + name: "HighNodeUtilizationArgs empty", + in: &HighNodeUtilizationArgs{}, + want: &HighNodeUtilizationArgs{ + Thresholds: nil, + NumberOfNodes: 0, + }, + }, + { + name: "HighNodeUtilizationArgs with value", + in: &HighNodeUtilizationArgs{ + Thresholds: api.ResourceThresholds{ + v1.ResourceCPU: 20, + v1.ResourceMemory: 120, + }, + NumberOfNodes: 10, + }, + want: &HighNodeUtilizationArgs{ + Thresholds: api.ResourceThresholds{ + v1.ResourceCPU: 20, + v1.ResourceMemory: 120, + }, + NumberOfNodes: 10, + }, + }, + } + for _, tc := range tests { + scheme := runtime.NewScheme() + utilruntime.Must(AddToScheme(scheme)) + t.Run(tc.name, func(t *testing.T) { + scheme.Default(tc.in) + if diff := cmp.Diff(tc.in, tc.want); diff != "" { + t.Errorf("Got unexpected defaults (-want, +got):\n%s", diff) + } + }) + } +} diff --git a/pkg/framework/plugins/nodeutilization/doc.go b/pkg/framework/plugins/nodeutilization/doc.go new file mode 100644 index 000000000..09d3bbc6d --- /dev/null +++ b/pkg/framework/plugins/nodeutilization/doc.go @@ -0,0 +1,16 @@ +/* +Copyright 2022 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:defaulter-gen=TypeMeta + +package nodeutilization diff --git a/pkg/framework/plugins/nodeutilization/register.go b/pkg/framework/plugins/nodeutilization/register.go new file mode 100644 index 000000000..5d9df2dbc --- /dev/null +++ b/pkg/framework/plugins/nodeutilization/register.go @@ -0,0 +1,31 @@ +/* +Copyright 2022 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package nodeutilization + +import ( + "k8s.io/apimachinery/pkg/runtime" +) + +var ( + SchemeBuilder = runtime.NewSchemeBuilder() + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +func init() { + // We only register manually written functions here. The registration of the + // generated functions takes place in the generated files. The separation + // makes the code compile even when the generated files are missing. + localSchemeBuilder.Register(addDefaultingFuncs) +} diff --git a/pkg/framework/plugins/nodeutilization/zz_generated.defaults.go b/pkg/framework/plugins/nodeutilization/zz_generated.defaults.go new file mode 100644 index 000000000..ede106f47 --- /dev/null +++ b/pkg/framework/plugins/nodeutilization/zz_generated.defaults.go @@ -0,0 +1,43 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright 2022 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by defaulter-gen. DO NOT EDIT. + +package nodeutilization + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&HighNodeUtilizationArgs{}, func(obj interface{}) { SetObjectDefaults_HighNodeUtilizationArgs(obj.(*HighNodeUtilizationArgs)) }) + scheme.AddTypeDefaultingFunc(&LowNodeUtilizationArgs{}, func(obj interface{}) { SetObjectDefaults_LowNodeUtilizationArgs(obj.(*LowNodeUtilizationArgs)) }) + return nil +} + +func SetObjectDefaults_HighNodeUtilizationArgs(in *HighNodeUtilizationArgs) { + SetDefaults_HighNodeUtilizationArgs(in) +} + +func SetObjectDefaults_LowNodeUtilizationArgs(in *LowNodeUtilizationArgs) { + SetDefaults_LowNodeUtilizationArgs(in) +}