From e1f86e346062e36aa03fc53ea4fb05d4a61ef458 Mon Sep 17 00:00:00 2001 From: draveness Date: Fri, 18 Oct 2019 15:24:35 +0800 Subject: [PATCH] feat(scheduler): replace several algorithm listers with client listers --- pkg/scheduler/algorithm/BUILD | 4 +- .../algorithm/predicates/predicates.go | 4 +- pkg/scheduler/algorithm/priorities/BUILD | 4 + .../algorithm/priorities/metadata.go | 22 ++++-- .../algorithm/priorities/metadata_test.go | 16 ++-- .../priorities/selector_spreading.go | 22 +++--- pkg/scheduler/algorithm/types.go | 75 +++++++++---------- pkg/scheduler/algorithm_factory.go | 13 ++-- pkg/scheduler/core/BUILD | 4 +- pkg/scheduler/core/generic_scheduler.go | 5 +- pkg/scheduler/core/generic_scheduler_test.go | 25 ++++--- .../framework/plugins/imagelocality/BUILD | 4 +- .../imagelocality/image_locality_test.go | 17 +++-- pkg/scheduler/testing/BUILD | 2 + pkg/scheduler/testing/fake_lister.go | 64 +++++++++++++--- 15 files changed, 180 insertions(+), 101 deletions(-) diff --git a/pkg/scheduler/algorithm/BUILD b/pkg/scheduler/algorithm/BUILD index eb3a44a47c2..452f1764118 100644 --- a/pkg/scheduler/algorithm/BUILD +++ b/pkg/scheduler/algorithm/BUILD @@ -11,13 +11,15 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/scheduler/algorithm", deps = [ + "//pkg/apis/apps:go_default_library", "//pkg/scheduler/api:go_default_library", "//pkg/scheduler/apis/extender/v1:go_default_library", "//pkg/scheduler/nodeinfo:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", ], ) diff --git a/pkg/scheduler/algorithm/predicates/predicates.go b/pkg/scheduler/algorithm/predicates/predicates.go index e50a0ff8a9b..b19c598e0bc 100644 --- a/pkg/scheduler/algorithm/predicates/predicates.go +++ b/pkg/scheduler/algorithm/predicates/predicates.go @@ -1050,7 +1050,7 @@ func (n *NodeLabelChecker) CheckNodeLabelPresence(pod *v1.Pod, meta PredicateMet // ServiceAffinity defines a struct used for creating service affinity predicates. type ServiceAffinity struct { podLister algorithm.PodLister - serviceLister algorithm.ServiceLister + serviceLister corelisters.ServiceLister nodeInfo NodeInfo labels []string } @@ -1082,7 +1082,7 @@ func (s *ServiceAffinity) serviceAffinityMetadataProducer(pm *predicateMetadata) } // NewServiceAffinityPredicate creates a ServiceAffinity. -func NewServiceAffinityPredicate(podLister algorithm.PodLister, serviceLister algorithm.ServiceLister, nodeInfo NodeInfo, labels []string) (FitPredicate, predicateMetadataProducer) { +func NewServiceAffinityPredicate(podLister algorithm.PodLister, serviceLister corelisters.ServiceLister, nodeInfo NodeInfo, labels []string) (FitPredicate, predicateMetadataProducer) { affinity := &ServiceAffinity{ podLister: podLister, serviceLister: serviceLister, diff --git a/pkg/scheduler/algorithm/priorities/BUILD b/pkg/scheduler/algorithm/priorities/BUILD index a154863c0cc..246ddd136ce 100644 --- a/pkg/scheduler/algorithm/priorities/BUILD +++ b/pkg/scheduler/algorithm/priorities/BUILD @@ -47,6 +47,8 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], @@ -86,6 +88,8 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", ], diff --git a/pkg/scheduler/algorithm/priorities/metadata.go b/pkg/scheduler/algorithm/priorities/metadata.go index 9225b68cafd..04d17267a02 100644 --- a/pkg/scheduler/algorithm/priorities/metadata.go +++ b/pkg/scheduler/algorithm/priorities/metadata.go @@ -20,20 +20,26 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - "k8s.io/kubernetes/pkg/scheduler/algorithm" + appslisters "k8s.io/client-go/listers/apps/v1" + corelisters "k8s.io/client-go/listers/core/v1" schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo" ) // PriorityMetadataFactory is a factory to produce PriorityMetadata. type PriorityMetadataFactory struct { - serviceLister algorithm.ServiceLister - controllerLister algorithm.ControllerLister - replicaSetLister algorithm.ReplicaSetLister - statefulSetLister algorithm.StatefulSetLister + serviceLister corelisters.ServiceLister + controllerLister corelisters.ReplicationControllerLister + replicaSetLister appslisters.ReplicaSetLister + statefulSetLister appslisters.StatefulSetLister } // NewPriorityMetadataFactory creates a PriorityMetadataFactory. -func NewPriorityMetadataFactory(serviceLister algorithm.ServiceLister, controllerLister algorithm.ControllerLister, replicaSetLister algorithm.ReplicaSetLister, statefulSetLister algorithm.StatefulSetLister) PriorityMetadataProducer { +func NewPriorityMetadataFactory( + serviceLister corelisters.ServiceLister, + controllerLister corelisters.ReplicationControllerLister, + replicaSetLister appslisters.ReplicaSetLister, + statefulSetLister appslisters.StatefulSetLister, +) PriorityMetadataProducer { factory := &PriorityMetadataFactory{ serviceLister: serviceLister, controllerLister: controllerLister, @@ -72,7 +78,7 @@ func (pmf *PriorityMetadataFactory) PriorityMetadata(pod *v1.Pod, nodeNameToInfo } // getFirstServiceSelector returns one selector of services the given pod. -func getFirstServiceSelector(pod *v1.Pod, sl algorithm.ServiceLister) (firstServiceSelector labels.Selector) { +func getFirstServiceSelector(pod *v1.Pod, sl corelisters.ServiceLister) (firstServiceSelector labels.Selector) { if services, err := sl.GetPodServices(pod); err == nil && len(services) > 0 { return labels.SelectorFromSet(services[0].Spec.Selector) } @@ -80,7 +86,7 @@ func getFirstServiceSelector(pod *v1.Pod, sl algorithm.ServiceLister) (firstServ } // getSelectors returns selectors of services, RCs and RSs matching the given pod. -func getSelectors(pod *v1.Pod, sl algorithm.ServiceLister, cl algorithm.ControllerLister, rsl algorithm.ReplicaSetLister, ssl algorithm.StatefulSetLister) []labels.Selector { +func getSelectors(pod *v1.Pod, sl corelisters.ServiceLister, cl corelisters.ReplicationControllerLister, rsl appslisters.ReplicaSetLister, ssl appslisters.StatefulSetLister) []labels.Selector { var selectors []labels.Selector if services, err := sl.GetPodServices(pod); err == nil { diff --git a/pkg/scheduler/algorithm/priorities/metadata_test.go b/pkg/scheduler/algorithm/priorities/metadata_test.go index eeb8ab9c325..3799d32c3e5 100644 --- a/pkg/scheduler/algorithm/priorities/metadata_test.go +++ b/pkg/scheduler/algorithm/priorities/metadata_test.go @@ -20,13 +20,13 @@ import ( "reflect" "testing" - apps "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/informers" + clientsetfake "k8s.io/client-go/kubernetes/fake" priorityutil "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util" schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo" - schedulertesting "k8s.io/kubernetes/pkg/scheduler/testing" ) func TestPriorityMetadata(t *testing.T) { @@ -162,11 +162,15 @@ func TestPriorityMetadata(t *testing.T) { name: "Produce a priorityMetadata with specified requests", }, } + client := clientsetfake.NewSimpleClientset() + informerFactory := informers.NewSharedInformerFactory(client, 0) + metaDataProducer := NewPriorityMetadataFactory( - schedulertesting.FakeServiceLister([]*v1.Service{}), - schedulertesting.FakeControllerLister([]*v1.ReplicationController{}), - schedulertesting.FakeReplicaSetLister([]*apps.ReplicaSet{}), - schedulertesting.FakeStatefulSetLister([]*apps.StatefulSet{})) + informerFactory.Core().V1().Services().Lister(), + informerFactory.Core().V1().ReplicationControllers().Lister(), + informerFactory.Apps().V1().ReplicaSets().Lister(), + informerFactory.Apps().V1().StatefulSets().Lister(), + ) for _, test := range tests { t.Run(test.name, func(t *testing.T) { ptData := metaDataProducer(test.pod, nil) diff --git a/pkg/scheduler/algorithm/priorities/selector_spreading.go b/pkg/scheduler/algorithm/priorities/selector_spreading.go index ec01642fe98..5543b691d14 100644 --- a/pkg/scheduler/algorithm/priorities/selector_spreading.go +++ b/pkg/scheduler/algorithm/priorities/selector_spreading.go @@ -21,6 +21,8 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + appslisters "k8s.io/client-go/listers/apps/v1" + corelisters "k8s.io/client-go/listers/core/v1" "k8s.io/kubernetes/pkg/scheduler/algorithm" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo" @@ -35,18 +37,18 @@ const zoneWeighting float64 = 2.0 / 3.0 // SelectorSpread contains information to calculate selector spread priority. type SelectorSpread struct { - serviceLister algorithm.ServiceLister - controllerLister algorithm.ControllerLister - replicaSetLister algorithm.ReplicaSetLister - statefulSetLister algorithm.StatefulSetLister + serviceLister corelisters.ServiceLister + controllerLister corelisters.ReplicationControllerLister + replicaSetLister appslisters.ReplicaSetLister + statefulSetLister appslisters.StatefulSetLister } // NewSelectorSpreadPriority creates a SelectorSpread. func NewSelectorSpreadPriority( - serviceLister algorithm.ServiceLister, - controllerLister algorithm.ControllerLister, - replicaSetLister algorithm.ReplicaSetLister, - statefulSetLister algorithm.StatefulSetLister) (PriorityMapFunction, PriorityReduceFunction) { + serviceLister corelisters.ServiceLister, + controllerLister corelisters.ReplicationControllerLister, + replicaSetLister appslisters.ReplicaSetLister, + statefulSetLister appslisters.StatefulSetLister) (PriorityMapFunction, PriorityReduceFunction) { selectorSpread := &SelectorSpread{ serviceLister: serviceLister, controllerLister: controllerLister, @@ -154,12 +156,12 @@ func (s *SelectorSpread) CalculateSpreadPriorityReduce(pod *v1.Pod, meta interfa // ServiceAntiAffinity contains information to calculate service anti-affinity priority. type ServiceAntiAffinity struct { podLister algorithm.PodLister - serviceLister algorithm.ServiceLister + serviceLister corelisters.ServiceLister label string } // NewServiceAntiAffinityPriority creates a ServiceAntiAffinity. -func NewServiceAntiAffinityPriority(podLister algorithm.PodLister, serviceLister algorithm.ServiceLister, label string) (PriorityMapFunction, PriorityReduceFunction) { +func NewServiceAntiAffinityPriority(podLister algorithm.PodLister, serviceLister corelisters.ServiceLister, label string) (PriorityMapFunction, PriorityReduceFunction) { antiAffinity := &ServiceAntiAffinity{ podLister: podLister, serviceLister: serviceLister, diff --git a/pkg/scheduler/algorithm/types.go b/pkg/scheduler/algorithm/types.go index a2f8c958d2e..951bdf1a22b 100644 --- a/pkg/scheduler/algorithm/types.go +++ b/pkg/scheduler/algorithm/types.go @@ -17,10 +17,12 @@ limitations under the License. package algorithm import ( - apps "k8s.io/api/apps/v1" - "k8s.io/api/core/v1" - policyv1beta1 "k8s.io/api/policy/v1beta1" + appsv1 "k8s.io/api/apps/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + appslisters "k8s.io/client-go/listers/apps/v1" + corelisters "k8s.io/client-go/listers/core/v1" + "k8s.io/kubernetes/pkg/apis/apps" schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" ) @@ -43,35 +45,7 @@ type PodLister interface { FilteredList(podFilter PodFilter, selector labels.Selector) ([]*v1.Pod, error) } -// ServiceLister interface represents anything that can produce a list of services; the list is consumed by a scheduler. -type ServiceLister interface { - // Lists all the services - List(labels.Selector) ([]*v1.Service, error) - // Gets the services for the given pod - GetPodServices(*v1.Pod) ([]*v1.Service, error) -} - -// ControllerLister interface represents anything that can produce a list of ReplicationController; the list is consumed by a scheduler. -type ControllerLister interface { - // Lists all the replication controllers - List(labels.Selector) ([]*v1.ReplicationController, error) - // Gets the replication controller for the given pod - GetPodControllers(*v1.Pod) ([]*v1.ReplicationController, error) -} - -// ReplicaSetLister interface represents anything that can produce a list of ReplicaSet; the list is consumed by a scheduler. -type ReplicaSetLister interface { - // Gets the replicasets for the given pod - GetPodReplicaSets(*v1.Pod) ([]*apps.ReplicaSet, error) -} - -// PDBLister interface represents anything that can list PodDisruptionBudget objects. -type PDBLister interface { - // List all the PodDisruptionBudgets matching the selector - List(labels.Selector) ([]*policyv1beta1.PodDisruptionBudget, error) -} - -var _ ControllerLister = &EmptyControllerLister{} +var _ corelisters.ReplicationControllerLister = &EmptyControllerLister{} // EmptyControllerLister implements ControllerLister on []v1.ReplicationController returning empty data type EmptyControllerLister struct{} @@ -86,28 +60,53 @@ func (f EmptyControllerLister) GetPodControllers(pod *v1.Pod) (controllers []*v1 return nil, nil } -var _ ReplicaSetLister = &EmptyReplicaSetLister{} +// ReplicationControllers returns nil +func (f EmptyControllerLister) ReplicationControllers(namespace string) corelisters.ReplicationControllerNamespaceLister { + return nil +} + +var _ appslisters.ReplicaSetLister = &EmptyReplicaSetLister{} // EmptyReplicaSetLister implements ReplicaSetLister on []extensions.ReplicaSet returning empty data type EmptyReplicaSetLister struct{} -// GetPodReplicaSets returns nil -func (f EmptyReplicaSetLister) GetPodReplicaSets(pod *v1.Pod) (rss []*apps.ReplicaSet, err error) { +// List returns nil +func (f EmptyReplicaSetLister) List(labels.Selector) ([]*appsv1.ReplicaSet, error) { return nil, nil } +// GetPodReplicaSets returns nil +func (f EmptyReplicaSetLister) GetPodReplicaSets(pod *v1.Pod) (rss []*appsv1.ReplicaSet, err error) { + return nil, nil +} + +// ReplicaSets returns nil +func (f EmptyReplicaSetLister) ReplicaSets(namespace string) appslisters.ReplicaSetNamespaceLister { + return nil +} + // StatefulSetLister interface represents anything that can produce a list of StatefulSet; the list is consumed by a scheduler. type StatefulSetLister interface { // Gets the StatefulSet for the given pod. GetPodStatefulSets(*v1.Pod) ([]*apps.StatefulSet, error) } -var _ StatefulSetLister = &EmptyStatefulSetLister{} +var _ appslisters.StatefulSetLister = &EmptyStatefulSetLister{} // EmptyStatefulSetLister implements StatefulSetLister on []apps.StatefulSet returning empty data. type EmptyStatefulSetLister struct{} -// GetPodStatefulSets of EmptyStatefulSetLister returns nil. -func (f EmptyStatefulSetLister) GetPodStatefulSets(pod *v1.Pod) (sss []*apps.StatefulSet, err error) { +// List returns nil +func (f EmptyStatefulSetLister) List(labels.Selector) ([]*appsv1.StatefulSet, error) { return nil, nil } + +// GetPodStatefulSets of EmptyStatefulSetLister returns nil. +func (f EmptyStatefulSetLister) GetPodStatefulSets(pod *v1.Pod) (sss []*appsv1.StatefulSet, err error) { + return nil, nil +} + +// StatefulSets returns nil +func (f EmptyStatefulSetLister) StatefulSets(namespace string) appslisters.StatefulSetNamespaceLister { + return nil +} diff --git a/pkg/scheduler/algorithm_factory.go b/pkg/scheduler/algorithm_factory.go index 10cddf1152f..347618837db 100644 --- a/pkg/scheduler/algorithm_factory.go +++ b/pkg/scheduler/algorithm_factory.go @@ -24,6 +24,9 @@ import ( "sync" "k8s.io/apimachinery/pkg/util/sets" + appslisters "k8s.io/client-go/listers/apps/v1" + corelisters "k8s.io/client-go/listers/core/v1" + policylisters "k8s.io/client-go/listers/policy/v1beta1" "k8s.io/kubernetes/pkg/scheduler/algorithm" "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities" @@ -37,11 +40,11 @@ import ( // PluginFactoryArgs are passed to all plugin factory functions. type PluginFactoryArgs struct { PodLister algorithm.PodLister - ServiceLister algorithm.ServiceLister - ControllerLister algorithm.ControllerLister - ReplicaSetLister algorithm.ReplicaSetLister - StatefulSetLister algorithm.StatefulSetLister - PDBLister algorithm.PDBLister + ServiceLister corelisters.ServiceLister + ControllerLister corelisters.ReplicationControllerLister + ReplicaSetLister appslisters.ReplicaSetLister + StatefulSetLister appslisters.StatefulSetLister + PDBLister policylisters.PodDisruptionBudgetLister NodeInfo predicates.NodeInfo CSINodeInfo predicates.CSINodeInfo PVInfo predicates.PersistentVolumeInfo diff --git a/pkg/scheduler/core/BUILD b/pkg/scheduler/core/BUILD index 8e09b6fe884..425bc9a5e3a 100644 --- a/pkg/scheduler/core/BUILD +++ b/pkg/scheduler/core/BUILD @@ -31,6 +31,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/policy/v1beta1:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", "//vendor/k8s.io/klog:go_default_library", @@ -60,7 +61,6 @@ go_test( "//pkg/scheduler/nodeinfo:go_default_library", "//pkg/scheduler/testing:go_default_library", "//pkg/scheduler/util:go_default_library", - "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -69,6 +69,8 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait: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/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index 79db513c8f2..f68a6937fb1 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -35,6 +35,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/errors" corelisters "k8s.io/client-go/listers/core/v1" + policylisters "k8s.io/client-go/listers/policy/v1beta1" "k8s.io/client-go/util/workqueue" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/scheduler/algorithm" @@ -155,7 +156,7 @@ type genericScheduler struct { nodeInfoSnapshot *schedulernodeinfo.Snapshot volumeBinder *volumebinder.VolumeBinder pvcLister corelisters.PersistentVolumeClaimLister - pdbLister algorithm.PDBLister + pdbLister policylisters.PodDisruptionBudgetLister disablePreemption bool percentageOfNodesToScore int32 enableNonPreempting bool @@ -1278,7 +1279,7 @@ func NewGenericScheduler( extenders []algorithm.SchedulerExtender, volumeBinder *volumebinder.VolumeBinder, pvcLister corelisters.PersistentVolumeClaimLister, - pdbLister algorithm.PDBLister, + pdbLister policylisters.PodDisruptionBudgetLister, alwaysCheckAllPredicates bool, disablePreemption bool, percentageOfNodesToScore int32, diff --git a/pkg/scheduler/core/generic_scheduler_test.go b/pkg/scheduler/core/generic_scheduler_test.go index ec372eb7852..7a72e1c5c60 100644 --- a/pkg/scheduler/core/generic_scheduler_test.go +++ b/pkg/scheduler/core/generic_scheduler_test.go @@ -27,7 +27,6 @@ import ( "testing" "time" - apps "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -36,6 +35,8 @@ import ( "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/informers" + clientsetfake "k8s.io/client-go/kubernetes/fake" "k8s.io/kubernetes/pkg/scheduler/algorithm" algorithmpredicates "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities" @@ -974,6 +975,9 @@ func TestZeroRequest(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + client := clientsetfake.NewSimpleClientset() + informerFactory := informers.NewSharedInformerFactory(client, 0) + // This should match the configuration in defaultPriorities() in // pkg/scheduler/algorithmprovider/defaults/defaults.go if you want // to test what's actually in production. @@ -982,20 +986,23 @@ func TestZeroRequest(t *testing.T) { {Map: priorities.BalancedResourceAllocationMap, Weight: 1}, } selectorSpreadPriorityMap, selectorSpreadPriorityReduce := priorities.NewSelectorSpreadPriority( - schedulertesting.FakeServiceLister([]*v1.Service{}), - schedulertesting.FakeControllerLister([]*v1.ReplicationController{}), - schedulertesting.FakeReplicaSetLister([]*apps.ReplicaSet{}), - schedulertesting.FakeStatefulSetLister([]*apps.StatefulSet{})) + informerFactory.Core().V1().Services().Lister(), + informerFactory.Core().V1().ReplicationControllers().Lister(), + informerFactory.Apps().V1().ReplicaSets().Lister(), + informerFactory.Apps().V1().StatefulSets().Lister(), + ) pc := priorities.PriorityConfig{Map: selectorSpreadPriorityMap, Reduce: selectorSpreadPriorityReduce, Weight: 1} priorityConfigs = append(priorityConfigs, pc) nodeNameToInfo := schedulernodeinfo.CreateNodeNameToInfoMap(test.pods, test.nodes) metaDataProducer := priorities.NewPriorityMetadataFactory( - schedulertesting.FakeServiceLister([]*v1.Service{}), - schedulertesting.FakeControllerLister([]*v1.ReplicationController{}), - schedulertesting.FakeReplicaSetLister([]*apps.ReplicaSet{}), - schedulertesting.FakeStatefulSetLister([]*apps.StatefulSet{})) + informerFactory.Core().V1().Services().Lister(), + informerFactory.Core().V1().ReplicationControllers().Lister(), + informerFactory.Apps().V1().ReplicaSets().Lister(), + informerFactory.Apps().V1().StatefulSets().Lister(), + ) + metaData := metaDataProducer(test.pod, nodeNameToInfo) list, err := PrioritizeNodes( diff --git a/pkg/scheduler/framework/plugins/imagelocality/BUILD b/pkg/scheduler/framework/plugins/imagelocality/BUILD index 3d3ba22bed7..fc81c5c5644 100644 --- a/pkg/scheduler/framework/plugins/imagelocality/BUILD +++ b/pkg/scheduler/framework/plugins/imagelocality/BUILD @@ -23,11 +23,11 @@ go_test( "//pkg/scheduler/framework/plugins/migration:go_default_library", "//pkg/scheduler/framework/v1alpha1:go_default_library", "//pkg/scheduler/nodeinfo:go_default_library", - "//pkg/scheduler/testing:go_default_library", "//pkg/util/parsers:go_default_library", - "//staging/src/k8s.io/api/apps/v1: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/client-go/informers:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", ], ) diff --git a/pkg/scheduler/framework/plugins/imagelocality/image_locality_test.go b/pkg/scheduler/framework/plugins/imagelocality/image_locality_test.go index 1c3bca6949e..2e57341952d 100644 --- a/pkg/scheduler/framework/plugins/imagelocality/image_locality_test.go +++ b/pkg/scheduler/framework/plugins/imagelocality/image_locality_test.go @@ -21,14 +21,14 @@ import ( "reflect" "testing" - apps "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/informers" + clientsetfake "k8s.io/client-go/kubernetes/fake" "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo" - schedulertesting "k8s.io/kubernetes/pkg/scheduler/testing" "k8s.io/kubernetes/pkg/util/parsers" ) @@ -36,6 +36,7 @@ func TestImageLocalityPriority(t *testing.T) { test40250 := v1.PodSpec{ Containers: []v1.Container{ { + Image: "gcr.io/40", }, { @@ -187,11 +188,15 @@ func TestImageLocalityPriority(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + client := clientsetfake.NewSimpleClientset() + informerFactory := informers.NewSharedInformerFactory(client, 0) + metaDataProducer := priorities.NewPriorityMetadataFactory( - schedulertesting.FakeServiceLister([]*v1.Service{}), - schedulertesting.FakeControllerLister([]*v1.ReplicationController{}), - schedulertesting.FakeReplicaSetLister([]*apps.ReplicaSet{}), - schedulertesting.FakeStatefulSetLister([]*apps.StatefulSet{})) + informerFactory.Core().V1().Services().Lister(), + informerFactory.Core().V1().ReplicationControllers().Lister(), + informerFactory.Apps().V1().ReplicaSets().Lister(), + informerFactory.Apps().V1().StatefulSets().Lister(), + ) nodeNameToInfo := schedulernodeinfo.CreateNodeNameToInfoMap(nil, test.nodes) diff --git a/pkg/scheduler/testing/BUILD b/pkg/scheduler/testing/BUILD index add74a5cc0b..f2f1b0c23ed 100644 --- a/pkg/scheduler/testing/BUILD +++ b/pkg/scheduler/testing/BUILD @@ -17,7 +17,9 @@ go_library( "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/policy/v1beta1:go_default_library", ], ) diff --git a/pkg/scheduler/testing/fake_lister.go b/pkg/scheduler/testing/fake_lister.go index d07d8a6246b..75cf2107507 100644 --- a/pkg/scheduler/testing/fake_lister.go +++ b/pkg/scheduler/testing/fake_lister.go @@ -19,12 +19,14 @@ package testing import ( "fmt" - apps "k8s.io/api/apps/v1" - "k8s.io/api/core/v1" + appsv1 "k8s.io/api/apps/v1" + v1 "k8s.io/api/core/v1" policy "k8s.io/api/policy/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + appslisters "k8s.io/client-go/listers/apps/v1" corelisters "k8s.io/client-go/listers/core/v1" + policylisters "k8s.io/client-go/listers/policy/v1beta1" "k8s.io/kubernetes/pkg/scheduler/algorithm" ) @@ -53,11 +55,16 @@ func (f FakePodLister) FilteredList(podFilter algorithm.PodFilter, s labels.Sele return selected, nil } -var _ algorithm.ServiceLister = &FakeServiceLister{} +var _ corelisters.ServiceLister = &FakeServiceLister{} // FakeServiceLister implements ServiceLister on []v1.Service for test purposes. type FakeServiceLister []*v1.Service +// Services returns nil. +func (f FakeServiceLister) Services(namespace string) corelisters.ServiceNamespaceLister { + return nil +} + // List returns v1.ServiceList, the list of all services. func (f FakeServiceLister) List(labels.Selector) ([]*v1.Service, error) { return f, nil @@ -81,7 +88,7 @@ func (f FakeServiceLister) GetPodServices(pod *v1.Pod) (services []*v1.Service, return } -var _ algorithm.ControllerLister = &FakeControllerLister{} +var _ corelisters.ReplicationControllerLister = &FakeControllerLister{} // FakeControllerLister implements ControllerLister on []v1.ReplicationController for test purposes. type FakeControllerLister []*v1.ReplicationController @@ -112,13 +119,23 @@ func (f FakeControllerLister) GetPodControllers(pod *v1.Pod) (controllers []*v1. return } -var _ algorithm.ReplicaSetLister = &FakeReplicaSetLister{} +// ReplicationControllers returns nil +func (f FakeControllerLister) ReplicationControllers(namespace string) corelisters.ReplicationControllerNamespaceLister { + return nil +} + +var _ appslisters.ReplicaSetLister = &FakeReplicaSetLister{} // FakeReplicaSetLister implements ControllerLister on []extensions.ReplicaSet for test purposes. -type FakeReplicaSetLister []*apps.ReplicaSet +type FakeReplicaSetLister []*appsv1.ReplicaSet + +// List returns replica sets. +func (f FakeReplicaSetLister) List(labels.Selector) ([]*appsv1.ReplicaSet, error) { + return f, nil +} // GetPodReplicaSets gets the ReplicaSets that have the selector that match the labels on the given pod -func (f FakeReplicaSetLister) GetPodReplicaSets(pod *v1.Pod) (rss []*apps.ReplicaSet, err error) { +func (f FakeReplicaSetLister) GetPodReplicaSets(pod *v1.Pod) (rss []*appsv1.ReplicaSet, err error) { var selector labels.Selector for _, rs := range f { @@ -141,13 +158,23 @@ func (f FakeReplicaSetLister) GetPodReplicaSets(pod *v1.Pod) (rss []*apps.Replic return } -var _ algorithm.StatefulSetLister = &FakeStatefulSetLister{} +// ReplicaSets returns nil +func (f FakeReplicaSetLister) ReplicaSets(namespace string) appslisters.ReplicaSetNamespaceLister { + return nil +} -// FakeStatefulSetLister implements ControllerLister on []apps.StatefulSet for testing purposes. -type FakeStatefulSetLister []*apps.StatefulSet +var _ appslisters.StatefulSetLister = &FakeStatefulSetLister{} + +// FakeStatefulSetLister implements ControllerLister on []appsv1.StatefulSet for testing purposes. +type FakeStatefulSetLister []*appsv1.StatefulSet + +// List returns stateful sets. +func (f FakeStatefulSetLister) List(labels.Selector) ([]*appsv1.StatefulSet, error) { + return f, nil +} // GetPodStatefulSets gets the StatefulSets that have the selector that match the labels on the given pod. -func (f FakeStatefulSetLister) GetPodStatefulSets(pod *v1.Pod) (sss []*apps.StatefulSet, err error) { +func (f FakeStatefulSetLister) GetPodStatefulSets(pod *v1.Pod) (sss []*appsv1.StatefulSet, err error) { var selector labels.Selector for _, ss := range f { @@ -168,6 +195,11 @@ func (f FakeStatefulSetLister) GetPodStatefulSets(pod *v1.Pod) (sss []*apps.Stat return } +// StatefulSets returns nil +func (f FakeStatefulSetLister) StatefulSets(namespace string) appslisters.StatefulSetNamespaceLister { + return nil +} + // FakePersistentVolumeClaimLister implements PersistentVolumeClaimLister on []*v1.PersistentVolumeClaim for test purposes. type FakePersistentVolumeClaimLister []*v1.PersistentVolumeClaim @@ -212,3 +244,13 @@ type FakePDBLister []*policy.PodDisruptionBudget func (f FakePDBLister) List(labels.Selector) ([]*policy.PodDisruptionBudget, error) { return f, nil } + +// PodDisruptionBudgets returns nil. +func (f FakePDBLister) PodDisruptionBudgets(namespace string) policylisters.PodDisruptionBudgetNamespaceLister { + return nil +} + +// GetPodPodDisruptionBudgets returns nil. +func (f FakePDBLister) GetPodPodDisruptionBudgets(pod *v1.Pod) ([]*policy.PodDisruptionBudget, error) { + return nil, nil +}