Commit f69eaa3b authored by Yang Guo's avatar Yang Guo

kube-scheduler: Use default predicates/prioritizers if policy config does not specify them

parent 1105751c
...@@ -37,9 +37,14 @@ const ( ...@@ -37,9 +37,14 @@ const (
type Policy struct { type Policy struct {
metav1.TypeMeta metav1.TypeMeta
// Holds the information to configure the fit predicate functions // Holds the information to configure the fit predicate functions.
// If unspecified, the default predicate functions will be applied.
// If empty list, all predicates (except the mandatory ones) will be
// bypassed.
Predicates []PredicatePolicy Predicates []PredicatePolicy
// Holds the information to configure the priority functions // Holds the information to configure the priority functions.
// If unspecified, the default priority functions will be applied.
// If empty list, all priority functions will be bypassed.
Priorities []PriorityPolicy Priorities []PriorityPolicy
// Holds the information to communicate with the extender(s) // Holds the information to communicate with the extender(s)
ExtenderConfigs []ExtenderConfig ExtenderConfigs []ExtenderConfig
......
...@@ -67,6 +67,7 @@ go_test( ...@@ -67,6 +67,7 @@ go_test(
deps = [ deps = [
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/api/testing:go_default_library", "//pkg/api/testing:go_default_library",
"//pkg/scheduler:go_default_library",
"//pkg/scheduler/algorithm:go_default_library", "//pkg/scheduler/algorithm:go_default_library",
"//pkg/scheduler/api:go_default_library", "//pkg/scheduler/api:go_default_library",
"//pkg/scheduler/api/latest:go_default_library", "//pkg/scheduler/api/latest:go_default_library",
...@@ -77,6 +78,7 @@ go_test( ...@@ -77,6 +78,7 @@ go_test(
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library",
"//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library",
......
...@@ -892,16 +892,34 @@ func (f *configFactory) CreateFromConfig(policy schedulerapi.Policy) (*scheduler ...@@ -892,16 +892,34 @@ func (f *configFactory) CreateFromConfig(policy schedulerapi.Policy) (*scheduler
} }
predicateKeys := sets.NewString() predicateKeys := sets.NewString()
if policy.Predicates == nil {
glog.V(2).Infof("Using predicates from algorithm provider '%v'", DefaultProvider)
provider, err := GetAlgorithmProvider(DefaultProvider)
if err != nil {
return nil, err
}
predicateKeys = provider.FitPredicateKeys
} else {
for _, predicate := range policy.Predicates { for _, predicate := range policy.Predicates {
glog.V(2).Infof("Registering predicate: %s", predicate.Name) glog.V(2).Infof("Registering predicate: %s", predicate.Name)
predicateKeys.Insert(RegisterCustomFitPredicate(predicate)) predicateKeys.Insert(RegisterCustomFitPredicate(predicate))
} }
}
priorityKeys := sets.NewString() priorityKeys := sets.NewString()
if policy.Priorities == nil {
glog.V(2).Infof("Using priorities from algorithm provider '%v'", DefaultProvider)
provider, err := GetAlgorithmProvider(DefaultProvider)
if err != nil {
return nil, err
}
priorityKeys = provider.PriorityFunctionKeys
} else {
for _, priority := range policy.Priorities { for _, priority := range policy.Priorities {
glog.V(2).Infof("Registering priority: %s", priority.Name) glog.V(2).Infof("Registering priority: %s", priority.Name)
priorityKeys.Insert(RegisterCustomPriorityFunction(priority)) priorityKeys.Insert(RegisterCustomPriorityFunction(priority))
} }
}
extenders := make([]algorithm.SchedulerExtender, 0) extenders := make([]algorithm.SchedulerExtender, 0)
if len(policy.ExtenderConfigs) != 0 { if len(policy.ExtenderConfigs) != 0 {
......
...@@ -57,6 +57,7 @@ go_test( ...@@ -57,6 +57,7 @@ go_test(
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library",
......
...@@ -31,6 +31,7 @@ import ( ...@@ -31,6 +31,7 @@ import (
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/diff"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
...@@ -97,12 +98,13 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { ...@@ -97,12 +98,13 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) {
factory.RegisterPriorityFunction("PriorityOne", PriorityOne, 1) factory.RegisterPriorityFunction("PriorityOne", PriorityOne, 1)
factory.RegisterPriorityFunction("PriorityTwo", PriorityTwo, 1) factory.RegisterPriorityFunction("PriorityTwo", PriorityTwo, 1)
// Add a ConfigMap object. for i, test := range []struct {
configPolicyName := "scheduler-custom-policy-config" policy string
policyConfigMap := v1.ConfigMap{ expectedPredicates sets.String
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: configPolicyName}, expectedPrioritizers sets.String
Data: map[string]string{ }{
componentconfig.SchedulerPolicyConfigMapKey: `{ {
policy: `{
"kind" : "Policy", "kind" : "Policy",
"apiVersion" : "v1", "apiVersion" : "v1",
"predicates" : [ "predicates" : [
...@@ -114,7 +116,63 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { ...@@ -114,7 +116,63 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) {
{"name" : "PriorityTwo", "weight" : 5} {"name" : "PriorityTwo", "weight" : 5}
] ]
}`, }`,
expectedPredicates: sets.NewString(
"CheckNodeCondition", // mandatory predicate
"PredicateOne",
"PredicateTwo",
),
expectedPrioritizers: sets.NewString(
"PriorityOne",
"PriorityTwo",
),
},
{
policy: `{
"kind" : "Policy",
"apiVersion" : "v1"
}`,
expectedPredicates: sets.NewString(
"CheckNodeCondition", // mandatory predicate
"CheckNodeDiskPressure",
"CheckNodeMemoryPressure",
"CheckVolumeBinding",
"GeneralPredicates",
"MatchInterPodAffinity",
"MaxAzureDiskVolumeCount",
"MaxEBSVolumeCount",
"MaxGCEPDVolumeCount",
"NoDiskConflict",
"NoVolumeZoneConflict",
"PodToleratesNodeTaints",
),
expectedPrioritizers: sets.NewString(
"BalancedResourceAllocation",
"InterPodAffinityPriority",
"LeastRequestedPriority",
"NodeAffinityPriority",
"NodePreferAvoidPodsPriority",
"SelectorSpreadPriority",
"TaintTolerationPriority",
),
},
{
policy: `{
"kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [],
"priorities" : []
}`,
expectedPredicates: sets.NewString(
"CheckNodeCondition", // mandatory predicate
),
expectedPrioritizers: sets.NewString(),
}, },
} {
// Add a ConfigMap object.
configPolicyName := fmt.Sprintf("scheduler-custom-policy-config-%d", i)
policyConfigMap := v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: configPolicyName},
Data: map[string]string{componentconfig.SchedulerPolicyConfigMapKey: test.policy},
} }
policyConfigMap.APIVersion = testapi.Groups[v1.GroupName].GroupVersion().String() policyConfigMap.APIVersion = testapi.Groups[v1.GroupName].GroupVersion().String()
...@@ -148,18 +206,20 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { ...@@ -148,18 +206,20 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) {
} }
// Verify that the config is applied correctly. // Verify that the config is applied correctly.
schedPredicates := config.Algorithm.Predicates() schedPredicates := sets.NewString()
schedPrioritizers := config.Algorithm.Prioritizers() for k := range config.Algorithm.Predicates() {
// Includes one mandatory predicates. schedPredicates.Insert(k)
if len(schedPredicates) != 3 || len(schedPrioritizers) != 2 { }
t.Errorf("Unexpected number of predicates or priority functions. Number of predicates: %v, number of prioritizers: %v", len(schedPredicates), len(schedPrioritizers)) schedPrioritizers := sets.NewString()
} for _, p := range config.Algorithm.Prioritizers() {
// Check a predicate and a priority function. schedPrioritizers.Insert(p.Name)
if schedPredicates["PredicateTwo"] == nil { }
t.Errorf("Expected to have a PodFitsHostPorts predicate.") if !schedPredicates.Equal(test.expectedPredicates) {
} t.Errorf("Expected predicates %v, got %v", test.expectedPredicates, schedPredicates)
if schedPrioritizers[1].Function == nil || schedPrioritizers[1].Weight != 5 { }
t.Errorf("Unexpected prioritizer: func: %v, weight: %v", schedPrioritizers[1].Function, schedPrioritizers[1].Weight) if !schedPrioritizers.Equal(test.expectedPrioritizers) {
t.Errorf("Expected priority functions %v, got %v", test.expectedPrioritizers, schedPrioritizers)
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment