Move predicates and priorities configuration creation to Policy mapping

For separation of concerns. Also make the producers receive the
existing configuration so they can take decisions based on them.

Change-Id: Id5db5588aabb90e7b8f087bd3f3c967e86dc4acc
This commit is contained in:
Aldo Culquicondor
2020-09-29 17:31:03 -04:00
parent 4373d9aadd
commit a0b72dbef9
4 changed files with 177 additions and 256 deletions

View File

@@ -17,104 +17,76 @@ limitations under the License.
package plugins
import (
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/kubernetes/pkg/scheduler/apis/config"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeunschedulable"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/tainttoleration"
)
func produceConfig(keys []string, producersMap map[string]ConfigProducer, args ConfigProducerArgs) (*config.Plugins, []config.PluginConfig, error) {
var plugins config.Plugins
var pluginConfig []config.PluginConfig
for _, k := range keys {
p, exist := producersMap[k]
if !exist {
return nil, nil, fmt.Errorf("finding key %q", k)
}
pl, plc := p(args)
plugins.Append(&pl)
pluginConfig = append(pluginConfig, plc...)
}
return &plugins, pluginConfig, nil
}
func TestRegisterConfigProducers(t *testing.T) {
registry := NewLegacyRegistry()
testPredicateName1 := "testPredicate1"
testFilterName1 := "testFilter1"
registry.registerPredicateConfigProducer(testPredicateName1,
func(_ ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
func(_ ConfigProducerArgs, plugins *config.Plugins, _ *[]config.PluginConfig) {
plugins.Filter = appendToPluginSet(plugins.Filter, testFilterName1, nil)
return
})
testPredicateName2 := "testPredicate2"
testFilterName2 := "testFilter2"
registry.registerPredicateConfigProducer(testPredicateName2,
func(_ ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
func(_ ConfigProducerArgs, plugins *config.Plugins, _ *[]config.PluginConfig) {
plugins.Filter = appendToPluginSet(plugins.Filter, testFilterName2, nil)
return
})
testPriorityName1 := "testPriority1"
testScoreName1 := "testScore1"
registry.registerPriorityConfigProducer(testPriorityName1,
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
func(args ConfigProducerArgs, plugins *config.Plugins, _ *[]config.PluginConfig) {
plugins.Score = appendToPluginSet(plugins.Score, testScoreName1, &args.Weight)
return
})
testPriorityName2 := "testPriority2"
testScoreName2 := "testScore2"
registry.registerPriorityConfigProducer(testPriorityName2,
func(args ConfigProducerArgs) (plugins config.Plugins, pluginConfig []config.PluginConfig) {
func(args ConfigProducerArgs, plugins *config.Plugins, _ *[]config.PluginConfig) {
plugins.Score = appendToPluginSet(plugins.Score, testScoreName2, &args.Weight)
return
})
args := ConfigProducerArgs{Weight: 1}
predicatePlugins, _, err := produceConfig(
[]string{testPredicateName1, testPredicateName2}, registry.PredicateToConfigProducer, args)
if err != nil {
t.Fatalf("producing predicate framework configs: %v.", err)
}
priorityPlugins, _, err := produceConfig(
[]string{testPriorityName1, testPriorityName2}, registry.PriorityToConfigProducer, args)
if err != nil {
t.Fatalf("producing predicate framework configs: %v.", err)
}
// Verify that predicates and priorities are in the map and produce the expected score configurations.
var gotPlugins config.Plugins
gotPlugins.Append(predicatePlugins)
gotPlugins.Append(priorityPlugins)
gotPlugins, _, err := registry.AppendPredicateConfigs(sets.NewString(testPredicateName1, testPredicateName2), &args, gotPlugins, nil)
if err != nil {
t.Fatalf("producing predicate framework configs: %v.", err)
}
priorities := map[string]int64{
testPriorityName1: 1,
testPriorityName2: 1,
}
gotPlugins, _, err = registry.AppendPriorityConfigs(priorities, &args, gotPlugins, nil)
if err != nil {
t.Fatalf("producing priority framework configs: %v.", err)
}
// Verify the aggregated configuration.
wantPlugins := config.Plugins{
QueueSort: &config.PluginSet{},
PreFilter: &config.PluginSet{},
Filter: &config.PluginSet{
Enabled: []config.Plugin{
{Name: nodeunschedulable.Name},
{Name: tainttoleration.Name},
{Name: testFilterName1},
{Name: testFilterName2},
},
},
PostFilter: &config.PluginSet{},
PreScore: &config.PluginSet{},
Score: &config.PluginSet{
Enabled: []config.Plugin{
{Name: testScoreName1, Weight: 1},
{Name: testScoreName2, Weight: 1},
},
},
Reserve: &config.PluginSet{},
Permit: &config.PluginSet{},
PreBind: &config.PluginSet{},
Bind: &config.PluginSet{},
PostBind: &config.PluginSet{},
}
if diff := cmp.Diff(wantPlugins, gotPlugins); diff != "" {