From 1d656d46a2b87898e7c3449be37de1ac925ccb9c Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 14 Sep 2021 11:11:18 +0200 Subject: [PATCH] scheduler: avoid repeated boilerplate code when registering plugins Some plugins expect the new feature gate struct. We can inject that additional parameter via a helper function instead of having to repeat the same anonymous function for each plugin. --- pkg/scheduler/framework/plugins/registry.go | 76 ++++++++------------- pkg/scheduler/framework/runtime/registry.go | 12 ++++ 2 files changed, 40 insertions(+), 48 deletions(-) diff --git a/pkg/scheduler/framework/plugins/registry.go b/pkg/scheduler/framework/plugins/registry.go index 9b3ccf5ed5b..6476c7a9bd9 100644 --- a/pkg/scheduler/framework/plugins/registry.go +++ b/pkg/scheduler/framework/plugins/registry.go @@ -17,10 +17,8 @@ limitations under the License. package plugins import ( - apiruntime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/scheduler/framework" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption" plfeature "k8s.io/kubernetes/pkg/scheduler/framework/plugins/feature" @@ -60,51 +58,33 @@ func NewInTreeRegistry() runtime.Registry { } return runtime.Registry{ - selectorspread.Name: selectorspread.New, - imagelocality.Name: imagelocality.New, - tainttoleration.Name: tainttoleration.New, - nodename.Name: nodename.New, - nodeports.Name: nodeports.New, - nodepreferavoidpods.Name: nodepreferavoidpods.New, - nodeaffinity.Name: nodeaffinity.New, - podtopologyspread.Name: podtopologyspread.New, - nodeunschedulable.Name: nodeunschedulable.New, - noderesources.FitName: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return noderesources.NewFit(plArgs, fh, fts) - }, - noderesources.BalancedAllocationName: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return noderesources.NewBalancedAllocation(plArgs, fh, fts) - }, - noderesources.MostAllocatedName: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return noderesources.NewMostAllocated(plArgs, fh, fts) - }, - noderesources.LeastAllocatedName: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return noderesources.NewLeastAllocated(plArgs, fh, fts) - }, - noderesources.RequestedToCapacityRatioName: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return noderesources.NewRequestedToCapacityRatio(plArgs, fh, fts) - }, - volumebinding.Name: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return volumebinding.New(plArgs, fh, fts) - }, - volumerestrictions.Name: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return volumerestrictions.New(plArgs, fh, fts) - }, - volumezone.Name: volumezone.New, - nodevolumelimits.CSIName: nodevolumelimits.NewCSI, - nodevolumelimits.EBSName: nodevolumelimits.NewEBS, - nodevolumelimits.GCEPDName: nodevolumelimits.NewGCEPD, - nodevolumelimits.AzureDiskName: nodevolumelimits.NewAzureDisk, - nodevolumelimits.CinderName: nodevolumelimits.NewCinder, - interpodaffinity.Name: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return interpodaffinity.New(plArgs, fh, fts) - }, - nodelabel.Name: nodelabel.New, - serviceaffinity.Name: serviceaffinity.New, - queuesort.Name: queuesort.New, - defaultbinder.Name: defaultbinder.New, - defaultpreemption.Name: func(plArgs apiruntime.Object, fh framework.Handle) (framework.Plugin, error) { - return defaultpreemption.New(plArgs, fh, fts) - }, + selectorspread.Name: selectorspread.New, + imagelocality.Name: imagelocality.New, + tainttoleration.Name: tainttoleration.New, + nodename.Name: nodename.New, + nodeports.Name: nodeports.New, + nodepreferavoidpods.Name: nodepreferavoidpods.New, + nodeaffinity.Name: nodeaffinity.New, + podtopologyspread.Name: podtopologyspread.New, + nodeunschedulable.Name: nodeunschedulable.New, + noderesources.FitName: runtime.FactoryAdapter(fts, noderesources.NewFit), + noderesources.BalancedAllocationName: runtime.FactoryAdapter(fts, noderesources.NewBalancedAllocation), + noderesources.MostAllocatedName: runtime.FactoryAdapter(fts, noderesources.NewMostAllocated), + noderesources.LeastAllocatedName: runtime.FactoryAdapter(fts, noderesources.NewLeastAllocated), + noderesources.RequestedToCapacityRatioName: runtime.FactoryAdapter(fts, noderesources.NewRequestedToCapacityRatio), + volumebinding.Name: runtime.FactoryAdapter(fts, volumebinding.New), + volumerestrictions.Name: runtime.FactoryAdapter(fts, volumerestrictions.New), + volumezone.Name: volumezone.New, + nodevolumelimits.CSIName: nodevolumelimits.NewCSI, + nodevolumelimits.EBSName: nodevolumelimits.NewEBS, + nodevolumelimits.GCEPDName: nodevolumelimits.NewGCEPD, + nodevolumelimits.AzureDiskName: nodevolumelimits.NewAzureDisk, + nodevolumelimits.CinderName: nodevolumelimits.NewCinder, + interpodaffinity.Name: runtime.FactoryAdapter(fts, interpodaffinity.New), + nodelabel.Name: nodelabel.New, + serviceaffinity.Name: serviceaffinity.New, + queuesort.Name: queuesort.New, + defaultbinder.Name: defaultbinder.New, + defaultpreemption.Name: runtime.FactoryAdapter(fts, defaultpreemption.New), } } diff --git a/pkg/scheduler/framework/runtime/registry.go b/pkg/scheduler/framework/runtime/registry.go index 8c8fcb4cee6..b0b1d855751 100644 --- a/pkg/scheduler/framework/runtime/registry.go +++ b/pkg/scheduler/framework/runtime/registry.go @@ -22,12 +22,24 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/json" "k8s.io/kubernetes/pkg/scheduler/framework" + plfeature "k8s.io/kubernetes/pkg/scheduler/framework/plugins/feature" "sigs.k8s.io/yaml" ) // PluginFactory is a function that builds a plugin. type PluginFactory = func(configuration runtime.Object, f framework.Handle) (framework.Plugin, error) +// PluginFactoryWithFts is a function that builds a plugin with certain feature gates. +type PluginFactoryWithFts func(runtime.Object, framework.Handle, plfeature.Features) (framework.Plugin, error) + +// FactoryAdapter can be used to inject feature gates for a plugin that needs +// them when the caller expects the older PluginFactory method. +func FactoryAdapter(fts plfeature.Features, withFts PluginFactoryWithFts) PluginFactory { + return func(plArgs runtime.Object, fh framework.Handle) (framework.Plugin, error) { + return withFts(plArgs, fh, fts) + } +} + // DecodeInto decodes configuration whose type is *runtime.Unknown to the interface into. func DecodeInto(obj runtime.Object, into interface{}) error { if obj == nil {