From b511fa86279f313e06b530f99f85d81e7e191322 Mon Sep 17 00:00:00 2001 From: Rafal Wicha Date: Thu, 16 Apr 2020 12:18:02 +0100 Subject: [PATCH] Add PodTopologySpread plugin arg types to kube-scheduler.config.k8s.io --- pkg/scheduler/apis/config/BUILD | 1 + pkg/scheduler/apis/config/register.go | 1 + pkg/scheduler/apis/config/types_pluginargs.go | 18 +++++++++- pkg/scheduler/apis/config/v1alpha2/BUILD | 1 + .../v1alpha2/zz_generated.conversion.go | 31 +++++++++++++++++ .../apis/config/zz_generated.deepcopy.go | 33 +++++++++++++++++++ .../framework/plugins/podtopologyspread/BUILD | 2 ++ .../plugins/podtopologyspread/common.go | 2 +- .../podtopologyspread/filtering_test.go | 3 +- .../plugins/podtopologyspread/plugin.go | 28 +++++----------- .../plugins/podtopologyspread/plugin_test.go | 5 +-- .../plugins/podtopologyspread/scoring_test.go | 5 +-- .../kube-scheduler/config/v1alpha2/BUILD | 1 + .../config/v1alpha2/register.go | 1 + .../config/v1alpha2/types_pluginargs.go | 20 ++++++++++- .../config/v1alpha2/zz_generated.deepcopy.go | 33 +++++++++++++++++++ 16 files changed, 157 insertions(+), 28 deletions(-) diff --git a/pkg/scheduler/apis/config/BUILD b/pkg/scheduler/apis/config/BUILD index 24c1f3970cc..7851b1307ef 100644 --- a/pkg/scheduler/apis/config/BUILD +++ b/pkg/scheduler/apis/config/BUILD @@ -13,6 +13,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/scheduler/apis/config", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/pkg/scheduler/apis/config/register.go b/pkg/scheduler/apis/config/register.go index 681777f691b..9f41a57a4d4 100644 --- a/pkg/scheduler/apis/config/register.go +++ b/pkg/scheduler/apis/config/register.go @@ -42,6 +42,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { &InterPodAffinityArgs{}, &NodeLabelArgs{}, &NodeResourcesFitArgs{}, + &PodTopologySpreadArgs{}, &RequestedToCapacityRatioArgs{}, &ServiceAffinityArgs{}, ) diff --git a/pkg/scheduler/apis/config/types_pluginargs.go b/pkg/scheduler/apis/config/types_pluginargs.go index 308119fbd48..7d5c18d4f87 100644 --- a/pkg/scheduler/apis/config/types_pluginargs.go +++ b/pkg/scheduler/apis/config/types_pluginargs.go @@ -17,6 +17,7 @@ limitations under the License. package config import ( + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -33,7 +34,7 @@ type InterPodAffinityArgs struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// NodeLabelArgs holds arguments that used to configure the NodeLabel plugin. +// NodeLabelArgs holds arguments used to configure the NodeLabel plugin. type NodeLabelArgs struct { metav1.TypeMeta @@ -60,6 +61,21 @@ type NodeResourcesFitArgs struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// PodTopologySpreadArgs holds arguments used to configure the PodTopologySpread plugin. +type PodTopologySpreadArgs struct { + metav1.TypeMeta + + // DefaultConstraints defines topology spread constraints to be applied to + // pods that don't define any in `pod.spec.topologySpreadConstraints`. + // `topologySpreadConstraint.labelSelectors` must be empty, as they are + // deduced the pods' membership to Services, Replication Controllers, Replica + // Sets or Stateful Sets. + // Empty by default. + DefaultConstraints []v1.TopologySpreadConstraint +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + // RequestedToCapacityRatioArgs holds arguments used to configure RequestedToCapacityRatio plugin. type RequestedToCapacityRatioArgs struct { metav1.TypeMeta diff --git a/pkg/scheduler/apis/config/v1alpha2/BUILD b/pkg/scheduler/apis/config/v1alpha2/BUILD index 17ae8846fc6..ee1ca8a65dc 100644 --- a/pkg/scheduler/apis/config/v1alpha2/BUILD +++ b/pkg/scheduler/apis/config/v1alpha2/BUILD @@ -16,6 +16,7 @@ go_library( deps = [ "//pkg/apis/core:go_default_library", "//pkg/scheduler/apis/config:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/scheduler/apis/config/v1alpha2/zz_generated.conversion.go b/pkg/scheduler/apis/config/v1alpha2/zz_generated.conversion.go index 0bf56f8b98a..533158fa282 100644 --- a/pkg/scheduler/apis/config/v1alpha2/zz_generated.conversion.go +++ b/pkg/scheduler/apis/config/v1alpha2/zz_generated.conversion.go @@ -23,6 +23,7 @@ package v1alpha2 import ( unsafe "unsafe" + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" @@ -129,6 +130,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1alpha2.PodTopologySpreadArgs)(nil), (*config.PodTopologySpreadArgs)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha2_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(a.(*v1alpha2.PodTopologySpreadArgs), b.(*config.PodTopologySpreadArgs), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.PodTopologySpreadArgs)(nil), (*v1alpha2.PodTopologySpreadArgs)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_PodTopologySpreadArgs_To_v1alpha2_PodTopologySpreadArgs(a.(*config.PodTopologySpreadArgs), b.(*v1alpha2.PodTopologySpreadArgs), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*v1alpha2.RequestedToCapacityRatioArgs)(nil), (*config.RequestedToCapacityRatioArgs)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha2_RequestedToCapacityRatioArgs_To_config_RequestedToCapacityRatioArgs(a.(*v1alpha2.RequestedToCapacityRatioArgs), b.(*config.RequestedToCapacityRatioArgs), scope) }); err != nil { @@ -763,6 +774,26 @@ func Convert_config_Plugins_To_v1alpha2_Plugins(in *config.Plugins, out *v1alpha return autoConvert_config_Plugins_To_v1alpha2_Plugins(in, out, s) } +func autoConvert_v1alpha2_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in *v1alpha2.PodTopologySpreadArgs, out *config.PodTopologySpreadArgs, s conversion.Scope) error { + out.DefaultConstraints = *(*[]corev1.TopologySpreadConstraint)(unsafe.Pointer(&in.DefaultConstraints)) + return nil +} + +// Convert_v1alpha2_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs is an autogenerated conversion function. +func Convert_v1alpha2_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in *v1alpha2.PodTopologySpreadArgs, out *config.PodTopologySpreadArgs, s conversion.Scope) error { + return autoConvert_v1alpha2_PodTopologySpreadArgs_To_config_PodTopologySpreadArgs(in, out, s) +} + +func autoConvert_config_PodTopologySpreadArgs_To_v1alpha2_PodTopologySpreadArgs(in *config.PodTopologySpreadArgs, out *v1alpha2.PodTopologySpreadArgs, s conversion.Scope) error { + out.DefaultConstraints = *(*[]corev1.TopologySpreadConstraint)(unsafe.Pointer(&in.DefaultConstraints)) + return nil +} + +// Convert_config_PodTopologySpreadArgs_To_v1alpha2_PodTopologySpreadArgs is an autogenerated conversion function. +func Convert_config_PodTopologySpreadArgs_To_v1alpha2_PodTopologySpreadArgs(in *config.PodTopologySpreadArgs, out *v1alpha2.PodTopologySpreadArgs, s conversion.Scope) error { + return autoConvert_config_PodTopologySpreadArgs_To_v1alpha2_PodTopologySpreadArgs(in, out, s) +} + func autoConvert_v1alpha2_RequestedToCapacityRatioArgs_To_config_RequestedToCapacityRatioArgs(in *v1alpha2.RequestedToCapacityRatioArgs, out *config.RequestedToCapacityRatioArgs, s conversion.Scope) error { out.Shape = *(*[]config.UtilizationShapePoint)(unsafe.Pointer(&in.Shape)) out.Resources = *(*[]config.ResourceSpec)(unsafe.Pointer(&in.Resources)) diff --git a/pkg/scheduler/apis/config/zz_generated.deepcopy.go b/pkg/scheduler/apis/config/zz_generated.deepcopy.go index b5e159394a7..8b3d0a3f873 100644 --- a/pkg/scheduler/apis/config/zz_generated.deepcopy.go +++ b/pkg/scheduler/apis/config/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package config import ( + v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -454,6 +455,38 @@ func (in *Plugins) DeepCopy() *Plugins { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodTopologySpreadArgs) DeepCopyInto(out *PodTopologySpreadArgs) { + *out = *in + out.TypeMeta = in.TypeMeta + if in.DefaultConstraints != nil { + in, out := &in.DefaultConstraints, &out.DefaultConstraints + *out = make([]v1.TopologySpreadConstraint, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTopologySpreadArgs. +func (in *PodTopologySpreadArgs) DeepCopy() *PodTopologySpreadArgs { + if in == nil { + return nil + } + out := new(PodTopologySpreadArgs) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodTopologySpreadArgs) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Policy) DeepCopyInto(out *Policy) { *out = *in diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/BUILD b/pkg/scheduler/framework/plugins/podtopologyspread/BUILD index 69c4c98a042..b320a9ddaf3 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/BUILD +++ b/pkg/scheduler/framework/plugins/podtopologyspread/BUILD @@ -24,6 +24,7 @@ go_library( "//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", + "//staging/src/k8s.io/kube-scheduler/config/v1alpha2:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], ) @@ -49,6 +50,7 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/kube-scheduler/config/v1alpha2:go_default_library", "//vendor/github.com/google/go-cmp/cmp:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", ], diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/common.go b/pkg/scheduler/framework/plugins/podtopologyspread/common.go index b068a987877..df95d4dd64c 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/common.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/common.go @@ -42,7 +42,7 @@ type topologySpreadConstraint struct { // .DefaultConstraints and the selectors from the services, replication // controllers, replica sets and stateful sets that match the pod. func (pl *PodTopologySpread) defaultConstraints(p *v1.Pod, action v1.UnsatisfiableConstraintAction) ([]topologySpreadConstraint, error) { - constraints, err := filterTopologySpreadConstraints(pl.DefaultConstraints, action) + constraints, err := filterTopologySpreadConstraints(pl.args.DefaultConstraints, action) if err != nil || len(constraints) == 0 { return nil, err } diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go b/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go index 7aa73c2aa78..7b9af8eb96b 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/filtering_test.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" + schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" "k8s.io/kubernetes/pkg/scheduler/internal/cache" "k8s.io/kubernetes/pkg/scheduler/internal/parallelize" @@ -517,7 +518,7 @@ func TestPreFilterState(t *testing.T) { informerFactory := informers.NewSharedInformerFactory(fake.NewSimpleClientset(tt.objs...), 0) pl := PodTopologySpread{ sharedLister: cache.NewSnapshot(tt.existingPods, tt.nodes), - Args: Args{ + args: schedulerv1alpha2.PodTopologySpreadArgs{ DefaultConstraints: tt.defaultConstraints, }, } diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go b/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go index 5c5fa703f42..002819e8f42 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go @@ -19,7 +19,7 @@ package podtopologyspread import ( "fmt" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" @@ -27,6 +27,7 @@ import ( "k8s.io/client-go/informers" appslisters "k8s.io/client-go/listers/apps/v1" corelisters "k8s.io/client-go/listers/core/v1" + schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" ) @@ -39,22 +40,9 @@ var ( supportedScheduleActions = sets.NewString(string(v1.DoNotSchedule), string(v1.ScheduleAnyway)) ) -// Args holds the arguments to configure the plugin. -type Args struct { - // DefaultConstraints defines topology spread constraints to be applied to - // pods that don't define any in `pod.spec.topologySpreadConstraints`. - // `topologySpreadConstraint.labelSelectors` must be empty, as they are - // deduced the pods' membership to Services, Replication Controllers, Replica - // Sets or Stateful Sets. - // Empty by default. - // +optional - // +listType=atomic - DefaultConstraints []v1.TopologySpreadConstraint `json:"defaultConstraints"` -} - // PodTopologySpread is a plugin that ensures pod's topologySpreadConstraints is satisfied. type PodTopologySpread struct { - Args + args schedulerv1alpha2.PodTopologySpreadArgs sharedLister framework.SharedLister services corelisters.ServiceLister replicationCtrls corelisters.ReplicationControllerLister @@ -79,7 +67,7 @@ func (pl *PodTopologySpread) Name() string { // BuildArgs returns the arguments used to build the plugin. func (pl *PodTopologySpread) BuildArgs() interface{} { - return pl.Args + return pl.args } // New initializes a new plugin and returns it. @@ -88,13 +76,13 @@ func New(args runtime.Object, h framework.FrameworkHandle) (framework.Plugin, er return nil, fmt.Errorf("SnapshotSharedlister is nil") } pl := &PodTopologySpread{sharedLister: h.SnapshotSharedLister()} - if err := framework.DecodeInto(args, &pl.Args); err != nil { + if err := framework.DecodeInto(args, &pl.args); err != nil { return nil, err } - if err := validateArgs(&pl.Args); err != nil { + if err := validateArgs(&pl.args); err != nil { return nil, err } - if len(pl.DefaultConstraints) != 0 { + if len(pl.args.DefaultConstraints) != 0 { if h.SharedInformerFactory() == nil { return nil, fmt.Errorf("SharedInformerFactory is nil") } @@ -113,7 +101,7 @@ func (pl *PodTopologySpread) setListers(factory informers.SharedInformerFactory) // validateArgs replicates the validation from // pkg/apis/core/validation.validateTopologySpreadConstraints. // This has the additional check for .labelSelector to be nil. -func validateArgs(args *Args) error { +func validateArgs(args *schedulerv1alpha2.PodTopologySpreadArgs) error { var allErrs field.ErrorList path := field.NewPath("defaultConstraints") for i, c := range args.DefaultConstraints { diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/plugin_test.go b/pkg/scheduler/framework/plugins/podtopologyspread/plugin_test.go index 989cfdffacd..77a90449009 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/plugin_test.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/plugin_test.go @@ -25,6 +25,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" + schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" "k8s.io/kubernetes/pkg/scheduler/internal/cache" ) @@ -34,7 +35,7 @@ func TestNew(t *testing.T) { name string args runtime.Unknown wantErr string - wantArgs Args + wantArgs schedulerv1alpha2.PodTopologySpreadArgs }{ {name: "empty args"}, { @@ -50,7 +51,7 @@ func TestNew(t *testing.T) { whenUnsatisfiable: "DoNotSchedule" `), }, - wantArgs: Args{ + wantArgs: schedulerv1alpha2.PodTopologySpreadArgs{ DefaultConstraints: []v1.TopologySpreadConstraint{ { MaxSkew: 1, diff --git a/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go b/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go index c34503f02b5..d392554f1c6 100644 --- a/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go +++ b/pkg/scheduler/framework/plugins/podtopologyspread/scoring_test.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" + schedulerv1alpha2 "k8s.io/kube-scheduler/config/v1alpha2" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" "k8s.io/kubernetes/pkg/scheduler/internal/cache" "k8s.io/kubernetes/pkg/scheduler/internal/parallelize" @@ -194,7 +195,7 @@ func TestPreScoreStateEmptyNodes(t *testing.T) { informerFactory := informers.NewSharedInformerFactory(fake.NewSimpleClientset(tt.objs...), 0) pl := PodTopologySpread{ sharedLister: cache.NewSnapshot(nil, tt.nodes), - Args: Args{ + args: schedulerv1alpha2.PodTopologySpreadArgs{ DefaultConstraints: tt.defaultConstraints, }, } @@ -728,7 +729,7 @@ func BenchmarkTestDefaultEvenPodsSpreadPriority(b *testing.B) { snapshot := cache.NewSnapshot(existingPods, allNodes) p := &PodTopologySpread{ sharedLister: snapshot, - Args: Args{ + args: schedulerv1alpha2.PodTopologySpreadArgs{ DefaultConstraints: []v1.TopologySpreadConstraint{ {MaxSkew: 1, TopologyKey: v1.LabelHostname, WhenUnsatisfiable: v1.ScheduleAnyway}, {MaxSkew: 1, TopologyKey: v1.LabelZoneFailureDomain, WhenUnsatisfiable: v1.ScheduleAnyway}, diff --git a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/BUILD b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/BUILD index 1d450e57236..c8d942359f1 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/BUILD +++ b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/BUILD @@ -13,6 +13,7 @@ go_library( importpath = "k8s.io/kube-scheduler/config/v1alpha2", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/register.go b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/register.go index 944d5d295db..5ce991a7d51 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/register.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/register.go @@ -41,6 +41,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { &InterPodAffinityArgs{}, &NodeLabelArgs{}, &NodeResourcesFitArgs{}, + &PodTopologySpreadArgs{}, &RequestedToCapacityRatioArgs{}, &ServiceAffinityArgs{}, ) diff --git a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/types_pluginargs.go b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/types_pluginargs.go index c36c1f37504..99b1c764ac7 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/types_pluginargs.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/types_pluginargs.go @@ -17,6 +17,7 @@ limitations under the License. package v1alpha2 import ( + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -33,7 +34,7 @@ type InterPodAffinityArgs struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// NodeLabelArgs holds arguments that used to configure the NodeLabel plugin. +// NodeLabelArgs holds arguments used to configure the NodeLabel plugin. type NodeLabelArgs struct { metav1.TypeMeta `json:",inline"` @@ -65,6 +66,23 @@ type NodeResourcesFitArgs struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// PodTopologySpreadArgs holds arguments used to configure the PodTopologySpread plugin. +type PodTopologySpreadArgs struct { + metav1.TypeMeta `json:",inline"` + + // DefaultConstraints defines topology spread constraints to be applied to + // pods that don't define any in `pod.spec.topologySpreadConstraints`. + // `topologySpreadConstraint.labelSelectors` must be empty, as they are + // deduced the pods' membership to Services, Replication Controllers, Replica + // Sets or Stateful Sets. + // Empty by default. + // +optional + // +listType=atomic + DefaultConstraints []v1.TopologySpreadConstraint `json:"defaultConstraints"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + // RequestedToCapacityRatioArgs holds arguments used to configure RequestedToCapacityRatio plugin. type RequestedToCapacityRatioArgs struct { metav1.TypeMeta `json:",inline"` diff --git a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/zz_generated.deepcopy.go b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/zz_generated.deepcopy.go index f0189d8fdf4..88bbaba8bd9 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1alpha2/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1alpha2/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package v1alpha2 import ( + corev1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" v1 "k8s.io/kube-scheduler/config/v1" ) @@ -396,6 +397,38 @@ func (in *Plugins) DeepCopy() *Plugins { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodTopologySpreadArgs) DeepCopyInto(out *PodTopologySpreadArgs) { + *out = *in + out.TypeMeta = in.TypeMeta + if in.DefaultConstraints != nil { + in, out := &in.DefaultConstraints, &out.DefaultConstraints + *out = make([]corev1.TopologySpreadConstraint, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodTopologySpreadArgs. +func (in *PodTopologySpreadArgs) DeepCopy() *PodTopologySpreadArgs { + if in == nil { + return nil + } + out := new(PodTopologySpreadArgs) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodTopologySpreadArgs) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RequestedToCapacityRatioArgs) DeepCopyInto(out *RequestedToCapacityRatioArgs) { *out = *in