From 104e368860ad843bd3ea95c164c516b5255a5057 Mon Sep 17 00:00:00 2001 From: Ahmad Diaa Date: Mon, 16 Sep 2019 04:06:41 +0200 Subject: [PATCH 1/3] remove factory.NewConfigFactory in compatibility test --- pkg/scheduler/api/compatibility/BUILD | 9 +-- .../api/compatibility/compatibility_test.go | 69 +++++++++++-------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/pkg/scheduler/api/compatibility/BUILD b/pkg/scheduler/api/compatibility/BUILD index 810e0b3115f..2442cfceb4f 100644 --- a/pkg/scheduler/api/compatibility/BUILD +++ b/pkg/scheduler/api/compatibility/BUILD @@ -5,18 +5,19 @@ go_test( srcs = ["compatibility_test.go"], deps = [ "//pkg/apis/core/install:go_default_library", + "//pkg/scheduler:go_default_library", "//pkg/scheduler/algorithmprovider/defaults:go_default_library", "//pkg/scheduler/api:go_default_library", "//pkg/scheduler/api/latest:go_default_library", + "//pkg/scheduler/apis/config:go_default_library", "//pkg/scheduler/factory:go_default_library", + "//pkg/scheduler/framework/plugins:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//staging/src/k8s.io/client-go/rest:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", ], ) diff --git a/pkg/scheduler/api/compatibility/compatibility_test.go b/pkg/scheduler/api/compatibility/compatibility_test.go index bda07434123..902ac57eba2 100644 --- a/pkg/scheduler/api/compatibility/compatibility_test.go +++ b/pkg/scheduler/api/compatibility/compatibility_test.go @@ -18,23 +18,24 @@ package compatibility import ( "fmt" - "net/http/httptest" "reflect" "testing" v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/informers" - clientset "k8s.io/client-go/kubernetes" - restclient "k8s.io/client-go/rest" - utiltesting "k8s.io/client-go/util/testing" + "k8s.io/client-go/kubernetes/fake" _ "k8s.io/kubernetes/pkg/apis/core/install" + "k8s.io/kubernetes/pkg/scheduler" _ "k8s.io/kubernetes/pkg/scheduler/algorithmprovider/defaults" schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" latestschedulerapi "k8s.io/kubernetes/pkg/scheduler/api/latest" + kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config" + schedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/factory" + schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework/plugins" ) func TestCompatibility_v1_Scheduler(t *testing.T) { @@ -1218,34 +1219,42 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { if !reflect.DeepEqual(policy, tc.ExpectedPolicy) { t.Errorf("%s: Expected:\n\t%#v\nGot:\n\t%#v", v, tc.ExpectedPolicy, policy) } - - handler := utiltesting.FakeHandler{ - StatusCode: 500, - ResponseBody: "", - T: t, + policyConfigMap := v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: "scheduler-custom-policy-config"}, + Data: map[string]string{schedulerconfig.SchedulerPolicyConfigMapKey: tc.JSON}, + } + policyConfigMap.APIVersion = "v1" + client := fake.NewSimpleClientset(&policyConfigMap) + algorithmSrc := schedulerconfig.SchedulerAlgorithmSource{ + Policy: &schedulerconfig.SchedulerPolicySource{ + ConfigMap: &kubeschedulerconfig.SchedulerPolicyConfigMapSource{ + Namespace: policyConfigMap.Namespace, + Name: policyConfigMap.Name, + }, + }, } - server := httptest.NewServer(&handler) - defer server.Close() - client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}}) informerFactory := informers.NewSharedInformerFactory(client, 0) - if _, err := factory.NewConfigFactory(&factory.ConfigFactoryArgs{ - Client: client, - NodeInformer: informerFactory.Core().V1().Nodes(), - PodInformer: informerFactory.Core().V1().Pods(), - PvInformer: informerFactory.Core().V1().PersistentVolumes(), - PvcInformer: informerFactory.Core().V1().PersistentVolumeClaims(), - ReplicationControllerInformer: informerFactory.Core().V1().ReplicationControllers(), - ReplicaSetInformer: informerFactory.Apps().V1().ReplicaSets(), - StatefulSetInformer: informerFactory.Apps().V1().StatefulSets(), - ServiceInformer: informerFactory.Core().V1().Services(), - PdbInformer: informerFactory.Policy().V1beta1().PodDisruptionBudgets(), - StorageClassInformer: informerFactory.Storage().V1().StorageClasses(), - CSINodeInformer: informerFactory.Storage().V1beta1().CSINodes(), - HardPodAffinitySymmetricWeight: v1.DefaultHardPodAffinitySymmetricWeight, - DisablePreemption: false, - PercentageOfNodesToScore: schedulerapi.DefaultPercentageOfNodesToScore, - }).CreateFromConfig(policy); err != nil { + if _, err := scheduler.New( + client, + informerFactory.Core().V1().Nodes(), + informerFactory.Core().V1().Pods(), + informerFactory.Core().V1().PersistentVolumes(), + informerFactory.Core().V1().PersistentVolumeClaims(), + informerFactory.Core().V1().ReplicationControllers(), + informerFactory.Apps().V1().ReplicaSets(), + informerFactory.Apps().V1().StatefulSets(), + informerFactory.Core().V1().Services(), + informerFactory.Policy().V1beta1().PodDisruptionBudgets(), + informerFactory.Storage().V1().StorageClasses(), + informerFactory.Storage().V1beta1().CSINodes(), + nil, + algorithmSrc, + make(chan struct{}), + schedulerframework.NewDefaultRegistry(), + nil, + []kubeschedulerconfig.PluginConfig{}, + ); err != nil { t.Errorf("%s: Error constructing: %v", v, err) continue } From 009ffaf80314529e4a6eb932da404fe9fb05185a Mon Sep 17 00:00:00 2001 From: Ahmad Diaa Date: Wed, 18 Sep 2019 19:21:41 +0200 Subject: [PATCH 2/3] validate scheduler policy instead of the decoded policy in compatibility_test --- pkg/scheduler/api/compatibility/BUILD | 1 + .../api/compatibility/compatibility_test.go | 57 ++++++++++++++----- pkg/scheduler/core/extender.go | 30 ++++++++++ pkg/scheduler/core/generic_scheduler.go | 7 +++ pkg/scheduler/scheduler_test.go | 3 + 5 files changed, 84 insertions(+), 14 deletions(-) diff --git a/pkg/scheduler/api/compatibility/BUILD b/pkg/scheduler/api/compatibility/BUILD index 2442cfceb4f..ad80f18ad43 100644 --- a/pkg/scheduler/api/compatibility/BUILD +++ b/pkg/scheduler/api/compatibility/BUILD @@ -10,6 +10,7 @@ go_test( "//pkg/scheduler/api:go_default_library", "//pkg/scheduler/api/latest:go_default_library", "//pkg/scheduler/apis/config:go_default_library", + "//pkg/scheduler/core:go_default_library", "//pkg/scheduler/factory:go_default_library", "//pkg/scheduler/framework/plugins:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/scheduler/api/compatibility/compatibility_test.go b/pkg/scheduler/api/compatibility/compatibility_test.go index 902ac57eba2..676792000b6 100644 --- a/pkg/scheduler/api/compatibility/compatibility_test.go +++ b/pkg/scheduler/api/compatibility/compatibility_test.go @@ -18,7 +18,6 @@ package compatibility import ( "fmt" - "reflect" "testing" v1 "k8s.io/api/core/v1" @@ -34,6 +33,7 @@ import ( latestschedulerapi "k8s.io/kubernetes/pkg/scheduler/api/latest" kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config" schedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config" + "k8s.io/kubernetes/pkg/scheduler/core" "k8s.io/kubernetes/pkg/scheduler/factory" schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework/plugins" ) @@ -1196,7 +1196,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { }, }, } - registeredPredicates := sets.NewString(factory.ListRegisteredFitPredicates()...) registeredPriorities := sets.NewString(factory.ListRegisteredPriorityFunctions()...) seenPredicates := sets.NewString() @@ -1210,20 +1209,10 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { t.Errorf("%s: Error decoding: %v", v, err) continue } - for _, predicate := range policy.Predicates { - seenPredicates.Insert(predicate.Name) - } - for _, priority := range policy.Priorities { - seenPriorities.Insert(priority.Name) - } - if !reflect.DeepEqual(policy, tc.ExpectedPolicy) { - t.Errorf("%s: Expected:\n\t%#v\nGot:\n\t%#v", v, tc.ExpectedPolicy, policy) - } policyConfigMap := v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: "scheduler-custom-policy-config"}, Data: map[string]string{schedulerconfig.SchedulerPolicyConfigMapKey: tc.JSON}, } - policyConfigMap.APIVersion = "v1" client := fake.NewSimpleClientset(&policyConfigMap) algorithmSrc := schedulerconfig.SchedulerAlgorithmSource{ Policy: &schedulerconfig.SchedulerPolicySource{ @@ -1235,7 +1224,7 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { } informerFactory := informers.NewSharedInformerFactory(client, 0) - if _, err := scheduler.New( + sched, err := scheduler.New( client, informerFactory.Core().V1().Nodes(), informerFactory.Core().V1().Pods(), @@ -1254,10 +1243,50 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { schedulerframework.NewDefaultRegistry(), nil, []kubeschedulerconfig.PluginConfig{}, - ); err != nil { + ) + if err != nil { t.Errorf("%s: Error constructing: %v", v, err) continue } + schedPredicates := sets.NewString() + for p := range sched.Algorithm.Predicates() { + schedPredicates.Insert(p) + } + wantPredicates := sets.NewString() + wantPredicates.Insert("CheckNodeCondition") // mandatory predicate + for _, p := range tc.ExpectedPolicy.Predicates { + wantPredicates.Insert(p.Name) + seenPredicates.Insert(p.Name) + } + if !schedPredicates.Equal(wantPredicates) { + t.Errorf("Expected predicates %v, got %v", wantPredicates, schedPredicates) + } + schedPrioritizers := sets.NewString() + for _, p := range sched.Algorithm.Prioritizers() { + schedPrioritizers.Insert(p.Name) + seenPriorities.Insert(p.Name) + } + wantPrioritizers := sets.NewString() + for _, p := range tc.ExpectedPolicy.Priorities { + wantPrioritizers.Insert(p.Name) + } + if !schedPrioritizers.Equal(wantPrioritizers) { + t.Errorf("Expected prioritizers %v, got %v", wantPrioritizers, schedPrioritizers) + } + schedExtenders := sched.Algorithm.Extenders() + var wantExtenders []*core.HTTPExtender + for _, e := range tc.ExpectedPolicy.ExtenderConfigs { + extender, err := core.NewHTTPExtender(&e) + if err != nil { + t.Errorf("Error transforming extender: %+v", e) + } + wantExtenders = append(wantExtenders, extender.(*core.HTTPExtender)) + } + for i := range schedExtenders { + if !core.Equal(wantExtenders[i], schedExtenders[i].(*core.HTTPExtender)) { + t.Errorf("Got extender #%d %+v, want %+v", i, schedExtenders[i], wantExtenders[i]) + } + } } if !seenPredicates.HasAll(registeredPredicates.List()...) { diff --git a/pkg/scheduler/core/extender.go b/pkg/scheduler/core/extender.go index 0b21d732ffa..8a1b10f51ff 100644 --- a/pkg/scheduler/core/extender.go +++ b/pkg/scheduler/core/extender.go @@ -114,6 +114,36 @@ func NewHTTPExtender(config *schedulerapi.ExtenderConfig) (algorithm.SchedulerEx }, nil } +// Equal is used to check if two extenders are equal +// ignoring the client field, exported for testing +func Equal(e1, e2 *HTTPExtender) bool { + if e1.extenderURL != e2.extenderURL { + return false + } + if e1.preemptVerb != e2.preemptVerb { + return false + } + if e1.prioritizeVerb != e2.prioritizeVerb { + return false + } + if e1.bindVerb != e2.bindVerb { + return false + } + if e1.weight != e2.weight { + return false + } + if e1.nodeCacheCapable != e2.nodeCacheCapable { + return false + } + if !e1.managedResources.Equal(e2.managedResources) { + return false + } + if e1.ignorable != e2.ignorable { + return false + } + return true +} + // Name returns extenderURL to identify the extender. func (h *HTTPExtender) Name() string { return h.extenderURL diff --git a/pkg/scheduler/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index fb24bf098a2..71ddd61a1ce 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -144,6 +144,9 @@ type ScheduleAlgorithm interface { // Prioritizers returns a slice of priority config. This is exposed for // testing. Prioritizers() []priorities.PriorityConfig + // Extenders returns a slice of extender config. This is exposed for + // testing. + Extenders() []algorithm.SchedulerExtender } // ScheduleResult represents the result of one pod scheduled. It will contain @@ -280,6 +283,10 @@ func (g *genericScheduler) Predicates() map[string]predicates.FitPredicate { return g.predicates } +func (g *genericScheduler) Extenders() []algorithm.SchedulerExtender { + return g.extenders +} + // selectHost takes a prioritized list of nodes and then picks one // in a reservoir sampling manner from the nodes that had the highest score. func (g *genericScheduler) selectHost(priorityList schedulerapi.HostPriorityList) (string, error) { diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go index e0e296b82f5..b02f8acee86 100644 --- a/pkg/scheduler/scheduler_test.go +++ b/pkg/scheduler/scheduler_test.go @@ -163,6 +163,9 @@ func (es mockScheduler) Predicates() map[string]predicates.FitPredicate { func (es mockScheduler) Prioritizers() []priorities.PriorityConfig { return nil } +func (es mockScheduler) Extenders() []algorithm.SchedulerExtender { + return nil +} func (es mockScheduler) Preempt(pc *framework.PluginContext, pod *v1.Pod, scheduleErr error) (*v1.Node, []*v1.Pod, []*v1.Pod, error) { return nil, nil, nil, nil From fda4d41ee53e611807f2f9cf58afcccbf989b57f Mon Sep 17 00:00:00 2001 From: Ahmad Diaa Date: Fri, 20 Sep 2019 17:47:33 +0200 Subject: [PATCH 3/3] change compatibility_test struct, remove ExpectedPolicy --- pkg/scheduler/api/compatibility/BUILD | 2 - .../api/compatibility/compatibility_test.go | 1180 ++++++++--------- 2 files changed, 548 insertions(+), 634 deletions(-) diff --git a/pkg/scheduler/api/compatibility/BUILD b/pkg/scheduler/api/compatibility/BUILD index ad80f18ad43..199c76388fb 100644 --- a/pkg/scheduler/api/compatibility/BUILD +++ b/pkg/scheduler/api/compatibility/BUILD @@ -8,14 +8,12 @@ go_test( "//pkg/scheduler:go_default_library", "//pkg/scheduler/algorithmprovider/defaults:go_default_library", "//pkg/scheduler/api:go_default_library", - "//pkg/scheduler/api/latest:go_default_library", "//pkg/scheduler/apis/config:go_default_library", "//pkg/scheduler/core:go_default_library", "//pkg/scheduler/factory:go_default_library", "//pkg/scheduler/framework/plugins:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", diff --git a/pkg/scheduler/api/compatibility/compatibility_test.go b/pkg/scheduler/api/compatibility/compatibility_test.go index 676792000b6..575d9635d71 100644 --- a/pkg/scheduler/api/compatibility/compatibility_test.go +++ b/pkg/scheduler/api/compatibility/compatibility_test.go @@ -17,12 +17,10 @@ limitations under the License. package compatibility import ( - "fmt" "testing" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" @@ -30,7 +28,6 @@ import ( "k8s.io/kubernetes/pkg/scheduler" _ "k8s.io/kubernetes/pkg/scheduler/algorithmprovider/defaults" schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" - latestschedulerapi "k8s.io/kubernetes/pkg/scheduler/api/latest" kubeschedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config" schedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/core" @@ -41,8 +38,10 @@ import ( func TestCompatibility_v1_Scheduler(t *testing.T) { // Add serialized versions of scheduler config that exercise available options to ensure compatibility between releases schedulerFiles := map[string]struct { - JSON string - ExpectedPolicy schedulerapi.Policy + JSON string + wantPredicates sets.String + wantPrioritizers sets.String + wantExtenders []schedulerapi.ExtenderConfig }{ // Do not change this JSON after the corresponding release has been tagged. // A failure indicates backwards compatibility with the specified release was broken. @@ -64,22 +63,20 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "TestLabelPreference", "weight": 4, "argument": {"labelPreference": {"label": "bar", "presence":true}}} ] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsPorts"}, - {Name: "NoDiskConflict"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "LeastRequestedPriority", Weight: 1}, - {Name: "ServiceSpreadingPriority", Weight: 2}, - {Name: "TestServiceAntiAffinity", Weight: 3, Argument: &schedulerapi.PriorityArgument{ServiceAntiAffinity: &schedulerapi.ServiceAntiAffinity{Label: "zone"}}}, - {Name: "TestLabelPreference", Weight: 4, Argument: &schedulerapi.PriorityArgument{LabelPreference: &schedulerapi.LabelPreference{Label: "bar", Presence: true}}}, - }, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsPorts", + "NoDiskConflict", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "LeastRequestedPriority", + "ServiceSpreadingPriority", + "TestServiceAntiAffinity", + "TestLabelPreference", + ), }, // Do not change this JSON after the corresponding release has been tagged. @@ -105,25 +102,23 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "TestLabelPreference", "weight": 4, "argument": {"labelPreference": {"label": "bar", "presence":true}}} ] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsHostPorts"}, - {Name: "PodFitsResources"}, - {Name: "NoDiskConflict"}, - {Name: "HostName"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "TestServiceAntiAffinity", Weight: 3, Argument: &schedulerapi.PriorityArgument{ServiceAntiAffinity: &schedulerapi.ServiceAntiAffinity{Label: "zone"}}}, - {Name: "TestLabelPreference", Weight: 4, Argument: &schedulerapi.PriorityArgument{LabelPreference: &schedulerapi.LabelPreference{Label: "bar", Presence: true}}}, - }, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsHostPorts", + "PodFitsResources", + "NoDiskConflict", + "HostName", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "TestServiceAntiAffinity", + "TestLabelPreference", + ), }, // Do not change this JSON after the corresponding release has been tagged. @@ -155,31 +150,29 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "TestLabelPreference", "weight": 4, "argument": {"labelPreference": {"label": "bar", "presence":true}}} ] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "TestServiceAntiAffinity", Weight: 3, Argument: &schedulerapi.PriorityArgument{ServiceAntiAffinity: &schedulerapi.ServiceAntiAffinity{Label: "zone"}}}, - {Name: "TestLabelPreference", Weight: 4, Argument: &schedulerapi.PriorityArgument{LabelPreference: &schedulerapi.LabelPreference{Label: "bar", Presence: true}}}, - }, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "NodeAffinityPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "TestServiceAntiAffinity", + "TestLabelPreference", + ), }, // Do not change this JSON after the corresponding release has been tagged. @@ -215,35 +208,33 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "InterPodAffinityPriority", "weight": 2} ] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - }, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + ), }, // Do not change this JSON after the corresponding release has been tagged. @@ -282,38 +273,36 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { {"name": "MostRequestedPriority", "weight": 2} ] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - }, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + ), }, // Do not change this JSON after the corresponding release has been tagged. // A failure indicates backwards compatibility with the specified release was broken. @@ -361,49 +350,47 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "nodeCacheCapable": true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.7 was missing json tags on the BindVerb field and required "BindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.7 was missing json tags on the BindVerb field and required "BindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + }}, }, // Do not change this JSON after the corresponding release has been tagged. // A failure indicates backwards compatibility with the specified release was broken. @@ -452,50 +439,48 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "nodeCacheCapable": true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.8 became case-insensitive and tolerated "bindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "CheckNodeCondition", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.8 became case-insensitive and tolerated "bindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + }}, }, // Do not change this JSON after the corresponding release has been tagged. // A failure indicates backwards compatibility with the specified release was broken. @@ -545,51 +530,49 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "nodeCacheCapable": true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "CheckVolumeBinding"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.9 was case-insensitive and tolerated "bindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "CheckNodeCondition", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "CheckVolumeBinding", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.9 was case-insensitive and tolerated "bindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + }}, }, // Do not change this JSON after the corresponding release has been tagged. @@ -643,54 +626,52 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "ignorable":true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodePIDPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "CheckVolumeBinding"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.10 was case-insensitive and tolerated "bindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, - Ignorable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "CheckNodePIDPressure", + "CheckNodeCondition", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "CheckVolumeBinding", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.10 was case-insensitive and tolerated "bindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, + Ignorable: true, + }}, }, // Do not change this JSON after the corresponding release has been tagged. // A failure indicates backwards compatibility with the specified release was broken. @@ -754,65 +735,53 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "ignorable":true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodePIDPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "CheckVolumeBinding"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - { - Name: "RequestedToCapacityRatioPriority", - Weight: 2, - Argument: &schedulerapi.PriorityArgument{ - RequestedToCapacityRatioArguments: &schedulerapi.RequestedToCapacityRatioArguments{ - UtilizationShape: []schedulerapi.UtilizationShapePoint{ - {Utilization: 0, Score: 0}, - {Utilization: 50, Score: 7}, - }}, - }, - }, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, - Ignorable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "CheckNodePIDPressure", + "CheckNodeCondition", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "CheckVolumeBinding", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + "RequestedToCapacityRatioPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, + Ignorable: true, + }}, }, // Do not change this JSON after the corresponding release has been tagged. // A failure indicates backwards compatibility with the specified release was broken. @@ -877,66 +846,54 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "ignorable":true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodePIDPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MaxCSIVolumeCountPred"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "CheckVolumeBinding"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - { - Name: "RequestedToCapacityRatioPriority", - Weight: 2, - Argument: &schedulerapi.PriorityArgument{ - RequestedToCapacityRatioArguments: &schedulerapi.RequestedToCapacityRatioArguments{ - UtilizationShape: []schedulerapi.UtilizationShapePoint{ - {Utilization: 0, Score: 0}, - {Utilization: 50, Score: 7}, - }}, - }, - }, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, - Ignorable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "CheckNodePIDPressure", + "CheckNodeCondition", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MaxCSIVolumeCountPred", + "MatchInterPodAffinity", + "GeneralPredicates", + "CheckVolumeBinding", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + "RequestedToCapacityRatioPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, + Ignorable: true, + }}, }, "1.14": { JSON: `{ @@ -1000,67 +957,55 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "ignorable":true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodePIDPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MaxCSIVolumeCountPred"}, - {Name: "MaxCinderVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "CheckVolumeBinding"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - { - Name: "RequestedToCapacityRatioPriority", - Weight: 2, - Argument: &schedulerapi.PriorityArgument{ - RequestedToCapacityRatioArguments: &schedulerapi.RequestedToCapacityRatioArguments{ - UtilizationShape: []schedulerapi.UtilizationShapePoint{ - {Utilization: 0, Score: 0}, - {Utilization: 50, Score: 7}, - }}, - }, - }, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, - Ignorable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "CheckNodePIDPressure", + "CheckNodeCondition", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MaxCSIVolumeCountPred", + "MaxCinderVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "CheckVolumeBinding", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + "RequestedToCapacityRatioPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, + Ignorable: true, + }}, }, "1.16": { JSON: `{ @@ -1128,165 +1073,136 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { "ignorable":true }] }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodePIDPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MaxCSIVolumeCountPred"}, - {Name: "MaxCinderVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "CheckVolumeBinding"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - { - Name: "RequestedToCapacityRatioPriority", - Weight: 2, - Argument: &schedulerapi.PriorityArgument{ - RequestedToCapacityRatioArguments: &schedulerapi.RequestedToCapacityRatioArguments{ - UtilizationShape: []schedulerapi.UtilizationShapePoint{ - {Utilization: 0, Score: 0}, - {Utilization: 50, Score: 7}, - }, - Resources: []schedulerapi.ResourceSpec{ - {Name: v1.ResourceName("intel.com/foo"), Weight: 3}, - {Name: v1.ResourceName("intel.com/bar"), Weight: 5}, - }, - }, - }, - }, - }, - ExtenderConfigs: []schedulerapi.ExtenderConfig{{ - URLPrefix: "/prefix", - FilterVerb: "filter", - PrioritizeVerb: "prioritize", - Weight: 1, - BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" - EnableHTTPS: true, - TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, - HTTPTimeout: 1, - NodeCacheCapable: true, - ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, - Ignorable: true, - }}, - }, + wantPredicates: sets.NewString( + "MatchNodeSelector", + "PodFitsResources", + "PodFitsHostPorts", + "HostName", + "NoDiskConflict", + "NoVolumeZoneConflict", + "PodToleratesNodeTaints", + "CheckNodeMemoryPressure", + "CheckNodeDiskPressure", + "CheckNodePIDPressure", + "CheckNodeCondition", + "MaxEBSVolumeCount", + "MaxGCEPDVolumeCount", + "MaxAzureDiskVolumeCount", + "MaxCSIVolumeCountPred", + "MaxCinderVolumeCount", + "MatchInterPodAffinity", + "GeneralPredicates", + "CheckVolumeBinding", + "TestServiceAffinity", + "TestLabelsPresence", + ), + wantPrioritizers: sets.NewString( + "EqualPriority", + "ImageLocalityPriority", + "LeastRequestedPriority", + "BalancedResourceAllocation", + "SelectorSpreadPriority", + "NodePreferAvoidPodsPriority", + "NodeAffinityPriority", + "TaintTolerationPriority", + "InterPodAffinityPriority", + "MostRequestedPriority", + "RequestedToCapacityRatioPriority", + ), + wantExtenders: []schedulerapi.ExtenderConfig{{ + URLPrefix: "/prefix", + FilterVerb: "filter", + PrioritizeVerb: "prioritize", + Weight: 1, + BindVerb: "bind", // 1.11 restored case-sensitivity, but allowed either "BindVerb" or "bindVerb" + EnableHTTPS: true, + TLSConfig: &schedulerapi.ExtenderTLSConfig{Insecure: true}, + HTTPTimeout: 1, + NodeCacheCapable: true, + ManagedResources: []schedulerapi.ExtenderManagedResource{{Name: v1.ResourceName("example.com/foo"), IgnoredByScheduler: true}}, + Ignorable: true, + }}, }, } registeredPredicates := sets.NewString(factory.ListRegisteredFitPredicates()...) registeredPriorities := sets.NewString(factory.ListRegisteredPriorityFunctions()...) seenPredicates := sets.NewString() seenPriorities := sets.NewString() + mandatoryPredicates := sets.NewString("CheckNodeCondition") for v, tc := range schedulerFiles { - fmt.Printf("%s: Testing scheduler config\n", v) - - policy := schedulerapi.Policy{} - if err := runtime.DecodeInto(latestschedulerapi.Codec, []byte(tc.JSON), &policy); err != nil { - t.Errorf("%s: Error decoding: %v", v, err) - continue - } - policyConfigMap := v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: "scheduler-custom-policy-config"}, - Data: map[string]string{schedulerconfig.SchedulerPolicyConfigMapKey: tc.JSON}, - } - client := fake.NewSimpleClientset(&policyConfigMap) - algorithmSrc := schedulerconfig.SchedulerAlgorithmSource{ - Policy: &schedulerconfig.SchedulerPolicySource{ - ConfigMap: &kubeschedulerconfig.SchedulerPolicyConfigMapSource{ - Namespace: policyConfigMap.Namespace, - Name: policyConfigMap.Name, + t.Run(v, func(t *testing.T) { + policyConfigMap := v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: "scheduler-custom-policy-config"}, + Data: map[string]string{schedulerconfig.SchedulerPolicyConfigMapKey: tc.JSON}, + } + client := fake.NewSimpleClientset(&policyConfigMap) + algorithmSrc := schedulerconfig.SchedulerAlgorithmSource{ + Policy: &schedulerconfig.SchedulerPolicySource{ + ConfigMap: &kubeschedulerconfig.SchedulerPolicyConfigMapSource{ + Namespace: policyConfigMap.Namespace, + Name: policyConfigMap.Name, + }, }, - }, - } - informerFactory := informers.NewSharedInformerFactory(client, 0) + } + informerFactory := informers.NewSharedInformerFactory(client, 0) - sched, err := scheduler.New( - client, - informerFactory.Core().V1().Nodes(), - informerFactory.Core().V1().Pods(), - informerFactory.Core().V1().PersistentVolumes(), - informerFactory.Core().V1().PersistentVolumeClaims(), - informerFactory.Core().V1().ReplicationControllers(), - informerFactory.Apps().V1().ReplicaSets(), - informerFactory.Apps().V1().StatefulSets(), - informerFactory.Core().V1().Services(), - informerFactory.Policy().V1beta1().PodDisruptionBudgets(), - informerFactory.Storage().V1().StorageClasses(), - informerFactory.Storage().V1beta1().CSINodes(), - nil, - algorithmSrc, - make(chan struct{}), - schedulerframework.NewDefaultRegistry(), - nil, - []kubeschedulerconfig.PluginConfig{}, - ) - if err != nil { - t.Errorf("%s: Error constructing: %v", v, err) - continue - } - schedPredicates := sets.NewString() - for p := range sched.Algorithm.Predicates() { - schedPredicates.Insert(p) - } - wantPredicates := sets.NewString() - wantPredicates.Insert("CheckNodeCondition") // mandatory predicate - for _, p := range tc.ExpectedPolicy.Predicates { - wantPredicates.Insert(p.Name) - seenPredicates.Insert(p.Name) - } - if !schedPredicates.Equal(wantPredicates) { - t.Errorf("Expected predicates %v, got %v", wantPredicates, schedPredicates) - } - schedPrioritizers := sets.NewString() - for _, p := range sched.Algorithm.Prioritizers() { - schedPrioritizers.Insert(p.Name) - seenPriorities.Insert(p.Name) - } - wantPrioritizers := sets.NewString() - for _, p := range tc.ExpectedPolicy.Priorities { - wantPrioritizers.Insert(p.Name) - } - if !schedPrioritizers.Equal(wantPrioritizers) { - t.Errorf("Expected prioritizers %v, got %v", wantPrioritizers, schedPrioritizers) - } - schedExtenders := sched.Algorithm.Extenders() - var wantExtenders []*core.HTTPExtender - for _, e := range tc.ExpectedPolicy.ExtenderConfigs { - extender, err := core.NewHTTPExtender(&e) + sched, err := scheduler.New( + client, + informerFactory.Core().V1().Nodes(), + informerFactory.Core().V1().Pods(), + informerFactory.Core().V1().PersistentVolumes(), + informerFactory.Core().V1().PersistentVolumeClaims(), + informerFactory.Core().V1().ReplicationControllers(), + informerFactory.Apps().V1().ReplicaSets(), + informerFactory.Apps().V1().StatefulSets(), + informerFactory.Core().V1().Services(), + informerFactory.Policy().V1beta1().PodDisruptionBudgets(), + informerFactory.Storage().V1().StorageClasses(), + informerFactory.Storage().V1beta1().CSINodes(), + nil, + algorithmSrc, + make(chan struct{}), + schedulerframework.NewDefaultRegistry(), + nil, + []kubeschedulerconfig.PluginConfig{}, + ) if err != nil { - t.Errorf("Error transforming extender: %+v", e) + t.Fatalf("%s: Error constructing: %v", v, err) } - wantExtenders = append(wantExtenders, extender.(*core.HTTPExtender)) - } - for i := range schedExtenders { - if !core.Equal(wantExtenders[i], schedExtenders[i].(*core.HTTPExtender)) { - t.Errorf("Got extender #%d %+v, want %+v", i, schedExtenders[i], wantExtenders[i]) + schedPredicates := sets.NewString() + for p := range sched.Algorithm.Predicates() { + schedPredicates.Insert(p) } - } + wantPredicates := tc.wantPredicates.Union(mandatoryPredicates) + if !schedPredicates.Equal(wantPredicates) { + t.Errorf("Got predicates %v, want %v", schedPredicates, wantPredicates) + } + schedPrioritizers := sets.NewString() + for _, p := range sched.Algorithm.Prioritizers() { + schedPrioritizers.Insert(p.Name) + } + + if !schedPrioritizers.Equal(tc.wantPrioritizers) { + t.Errorf("Got prioritizers %v, want %v", schedPrioritizers, tc.wantPrioritizers) + } + schedExtenders := sched.Algorithm.Extenders() + var wantExtenders []*core.HTTPExtender + for _, e := range tc.wantExtenders { + extender, err := core.NewHTTPExtender(&e) + if err != nil { + t.Errorf("Error transforming extender: %+v", e) + } + wantExtenders = append(wantExtenders, extender.(*core.HTTPExtender)) + } + for i := range schedExtenders { + if !core.Equal(wantExtenders[i], schedExtenders[i].(*core.HTTPExtender)) { + t.Errorf("Got extender #%d %+v, want %+v", i, schedExtenders[i], wantExtenders[i]) + } + } + seenPredicates = seenPredicates.Union(schedPredicates) + seenPriorities = seenPriorities.Union(schedPrioritizers) + }) } if !seenPredicates.HasAll(registeredPredicates.List()...) {