diff --git a/pkg/scheduler/apis/config/v1beta2/default_plugins.go b/pkg/scheduler/apis/config/v1beta2/default_plugins.go index accbddd1eaf..f1305d29ec4 100644 --- a/pkg/scheduler/apis/config/v1beta2/default_plugins.go +++ b/pkg/scheduler/apis/config/v1beta2/default_plugins.go @@ -147,19 +147,34 @@ func mergePlugins(defaultPlugins, customPlugins *v1beta2.Plugins) *v1beta2.Plugi return defaultPlugins } +type pluginIndex struct { + index int + plugin v1beta2.Plugin +} + func mergePluginSet(defaultPluginSet, customPluginSet v1beta2.PluginSet) v1beta2.PluginSet { disabledPlugins := sets.NewString() + enabledCustomPlugins := make(map[string]pluginIndex) for _, disabledPlugin := range customPluginSet.Disabled { disabledPlugins.Insert(disabledPlugin.Name) } - + for index, enabledPlugin := range customPluginSet.Enabled { + enabledCustomPlugins[enabledPlugin.Name] = pluginIndex{index, enabledPlugin} + } var enabledPlugins []v1beta2.Plugin if !disabledPlugins.Has("*") { for _, defaultEnabledPlugin := range defaultPluginSet.Enabled { if disabledPlugins.Has(defaultEnabledPlugin.Name) { continue } - + // The default plugin is explicitly re-configured, update the default plugin accordingly. + if customPlugin, ok := enabledCustomPlugins[defaultEnabledPlugin.Name]; ok { + klog.InfoS("Defaut plugin is explicitly re-configured and is overriding.", "plugin", defaultEnabledPlugin.Name) + // update the default plugin in place to preserve order + defaultEnabledPlugin = customPlugin.plugin + // kick the plugin from the enabled list of custom plugins + customPluginSet.Enabled = append(customPluginSet.Enabled[:customPlugin.index], customPluginSet.Enabled[customPlugin.index+1:]...) + } enabledPlugins = append(enabledPlugins, defaultEnabledPlugin) } } diff --git a/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go b/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go index d1f609d0758..9ac0fab587c 100644 --- a/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go +++ b/pkg/scheduler/apis/config/v1beta2/default_plugins_test.go @@ -359,6 +359,58 @@ func TestMergePlugins(t *testing.T) { }, }, }, + { + name: "CustomPluginOverrideDefaultPlugin", + customPlugins: &v1beta2.Plugins{ + Filter: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: "Plugin1", Weight: pointer.Int32Ptr(2)}, + }, + }, + }, + defaultPlugins: &v1beta2.Plugins{ + Filter: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: "Plugin1"}, + }, + }, + }, + expectedPlugins: &v1beta2.Plugins{ + Filter: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: "Plugin1", Weight: pointer.Int32Ptr(2)}, + }, + }, + }, + }, + { + name: "OrderPreserveAfterOverride", + customPlugins: &v1beta2.Plugins{ + Filter: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: "Plugin2", Weight: pointer.Int32Ptr(2)}, + }, + }, + }, + defaultPlugins: &v1beta2.Plugins{ + Filter: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: "Plugin1"}, + {Name: "Plugin2"}, + {Name: "Plugin3"}, + }, + }, + }, + expectedPlugins: &v1beta2.Plugins{ + Filter: v1beta2.PluginSet{ + Enabled: []v1beta2.Plugin{ + {Name: "Plugin1"}, + {Name: "Plugin2", Weight: pointer.Int32Ptr(2)}, + {Name: "Plugin3"}, + }, + }, + }, + }, } for _, test := range tests { diff --git a/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go b/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go index bb9f217960a..4f132ea8d6d 100644 --- a/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go +++ b/staging/src/k8s.io/kube-scheduler/config/v1beta2/types.go @@ -197,6 +197,8 @@ type Plugins struct { // If an array is empty, missing, or nil, default plugins at that extension point will be used. type PluginSet struct { // Enabled specifies plugins that should be enabled in addition to default plugins. + // If the default plugin is also configured in the scheduler config file, the weight of plugin will + // be overridden accordingly. // These are called after default plugins and in the same order specified here. // +listType=atomic Enabled []Plugin `json:"enabled,omitempty"`