From 57585640e89b576fc8bb267ae78d83f468d79a31 Mon Sep 17 00:00:00 2001 From: Abdullah Gharaibeh Date: Wed, 22 Apr 2020 14:39:28 -0400 Subject: [PATCH] change scheduler's framework PodLister to PodInfoLister --- .../serviceaffinity/service_affinity.go | 30 +++++++++------- pkg/scheduler/framework/v1alpha1/BUILD | 1 - .../framework/v1alpha1/fake/listers.go | 25 -------------- pkg/scheduler/framework/v1alpha1/listers.go | 18 ---------- pkg/scheduler/internal/cache/snapshot.go | 34 ------------------- 5 files changed, 18 insertions(+), 90 deletions(-) diff --git a/pkg/scheduler/framework/plugins/serviceaffinity/service_affinity.go b/pkg/scheduler/framework/plugins/serviceaffinity/service_affinity.go index a231f05ca55..728ca06709b 100644 --- a/pkg/scheduler/framework/plugins/serviceaffinity/service_affinity.go +++ b/pkg/scheduler/framework/plugins/serviceaffinity/service_affinity.go @@ -104,13 +104,13 @@ func (pl *ServiceAffinity) createPreFilterState(pod *v1.Pod) (*preFilterState, e return nil, fmt.Errorf("listing pod services: %v", err.Error()) } selector := createSelectorFromLabels(pod.Labels) - allMatches, err := pl.sharedLister.Pods().List(selector) - if err != nil { - return nil, fmt.Errorf("listing pods: %v", err.Error()) - } // consider only the pods that belong to the same namespace - matchingPodList := filterPodsByNamespace(allMatches, pod.Namespace) + nodeInfos, err := pl.sharedLister.NodeInfos().List() + if err != nil { + return nil, fmt.Errorf("listing nodeInfos: %v", err.Error()) + } + matchingPodList := filterPods(nodeInfos, selector, pod.Namespace) return &preFilterState{ matchingPodList: matchingPodList, @@ -392,15 +392,21 @@ func createSelectorFromLabels(aL map[string]string) labels.Selector { return labels.Set(aL).AsSelector() } -// filterPodsByNamespace filters pods outside a namespace from the given list. -func filterPodsByNamespace(pods []*v1.Pod, ns string) []*v1.Pod { - filtered := []*v1.Pod{} - for _, nsPod := range pods { - if nsPod.Namespace == ns { - filtered = append(filtered, nsPod) +// filterPods filters pods outside a namespace from the given list. +func filterPods(nodeInfos []*framework.NodeInfo, selector labels.Selector, ns string) []*v1.Pod { + maxSize := 0 + for _, n := range nodeInfos { + maxSize += len(n.Pods) + } + pods := make([]*v1.Pod, 0, maxSize) + for _, n := range nodeInfos { + for _, p := range n.Pods { + if p.Pod.Namespace == ns && selector.Matches(labels.Set(p.Pod.Labels)) { + pods = append(pods, p.Pod) + } } } - return filtered + return pods } // findLabelsInSet gets as many key/value pairs as possible out of a label set. diff --git a/pkg/scheduler/framework/v1alpha1/BUILD b/pkg/scheduler/framework/v1alpha1/BUILD index 7e01cf8fe54..1d7cd68564a 100644 --- a/pkg/scheduler/framework/v1alpha1/BUILD +++ b/pkg/scheduler/framework/v1alpha1/BUILD @@ -24,7 +24,6 @@ go_library( "//pkg/scheduler/util: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/labels:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", diff --git a/pkg/scheduler/framework/v1alpha1/fake/listers.go b/pkg/scheduler/framework/v1alpha1/fake/listers.go index 785a19f5dad..2890879628e 100644 --- a/pkg/scheduler/framework/v1alpha1/fake/listers.go +++ b/pkg/scheduler/framework/v1alpha1/fake/listers.go @@ -30,31 +30,6 @@ import ( framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" ) -var _ framework.PodLister = &PodLister{} - -// PodLister implements PodLister on an []v1.Pods for test purposes. -type PodLister []*v1.Pod - -// List returns []*v1.Pod matching a query. -func (f PodLister) List(s labels.Selector) (selected []*v1.Pod, err error) { - for _, pod := range f { - if s.Matches(labels.Set(pod.Labels)) { - selected = append(selected, pod) - } - } - return selected, nil -} - -// FilteredList returns pods matching a pod filter and a label selector. -func (f PodLister) FilteredList(podFilter framework.PodFilter, s labels.Selector) (selected []*v1.Pod, err error) { - for _, pod := range f { - if podFilter(pod) && s.Matches(labels.Set(pod.Labels)) { - selected = append(selected, pod) - } - } - return selected, nil -} - var _ corelisters.ServiceLister = &ServiceLister{} // ServiceLister implements ServiceLister on []v1.Service for test purposes. diff --git a/pkg/scheduler/framework/v1alpha1/listers.go b/pkg/scheduler/framework/v1alpha1/listers.go index 24f710652c5..e6bc9b43db1 100644 --- a/pkg/scheduler/framework/v1alpha1/listers.go +++ b/pkg/scheduler/framework/v1alpha1/listers.go @@ -16,23 +16,6 @@ limitations under the License. package v1alpha1 -import ( - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/labels" -) - -// PodFilter is a function to filter a pod. If pod passed return true else return false. -type PodFilter func(*v1.Pod) bool - -// PodLister interface represents anything that can list pods for a scheduler. -type PodLister interface { - // Returns the list of pods. - List(labels.Selector) ([]*v1.Pod, error) - // This is similar to "List()", but the returned slice does not - // contain pods that don't pass `podFilter`. - FilteredList(podFilter PodFilter, selector labels.Selector) ([]*v1.Pod, error) -} - // NodeInfoLister interface represents anything that can list/get NodeInfo objects from node name. type NodeInfoLister interface { // Returns the list of NodeInfos. @@ -45,6 +28,5 @@ type NodeInfoLister interface { // SharedLister groups scheduler-specific listers. type SharedLister interface { - Pods() PodLister NodeInfos() NodeInfoLister } diff --git a/pkg/scheduler/internal/cache/snapshot.go b/pkg/scheduler/internal/cache/snapshot.go index a6346f5ecd0..a63f67431ee 100644 --- a/pkg/scheduler/internal/cache/snapshot.go +++ b/pkg/scheduler/internal/cache/snapshot.go @@ -20,7 +20,6 @@ import ( "fmt" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/sets" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" ) @@ -123,11 +122,6 @@ func createImageExistenceMap(nodes []*v1.Node) map[string]sets.String { return imageExistenceMap } -// Pods returns a PodLister -func (s *Snapshot) Pods() framework.PodLister { - return podLister(s.nodeInfoList) -} - // NodeInfos returns a NodeInfoLister. func (s *Snapshot) NodeInfos() framework.NodeInfoLister { return s @@ -138,34 +132,6 @@ func (s *Snapshot) NumNodes() int { return len(s.nodeInfoList) } -type podLister []*framework.NodeInfo - -// List returns the list of pods in the snapshot. -func (p podLister) List(selector labels.Selector) ([]*v1.Pod, error) { - alwaysTrue := func(*v1.Pod) bool { return true } - return p.FilteredList(alwaysTrue, selector) -} - -// FilteredList returns a filtered list of pods in the snapshot. -func (p podLister) FilteredList(filter framework.PodFilter, selector labels.Selector) ([]*v1.Pod, error) { - // podFilter is expected to return true for most or all of the pods. We - // can avoid expensive array growth without wasting too much memory by - // pre-allocating capacity. - maxSize := 0 - for _, n := range p { - maxSize += len(n.Pods) - } - pods := make([]*v1.Pod, 0, maxSize) - for _, n := range p { - for _, p := range n.Pods { - if filter(p.Pod) && selector.Matches(labels.Set(p.Pod.Labels)) { - pods = append(pods, p.Pod) - } - } - } - return pods, nil -} - // List returns the list of nodes in the snapshot. func (s *Snapshot) List() ([]*framework.NodeInfo, error) { return s.nodeInfoList, nil