Custom plugin config should take precedence over default plugin config

Signed-off-by: Dave Chen <dave.chen@arm.com>
This commit is contained in:
Dave Chen 2021-03-01 18:05:41 +08:00
parent 7ad7c0757a
commit 9a5237ca63
3 changed files with 71 additions and 2 deletions

View File

@ -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)
}
}

View File

@ -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 {

View File

@ -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"`