mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 20:24:09 +00:00
change scheduler's framework PodLister to PodInfoLister
This commit is contained in:
parent
b19de7f9b6
commit
57585640e8
@ -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.
|
||||
|
@ -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",
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
}
|
||||
|
34
pkg/scheduler/internal/cache/snapshot.go
vendored
34
pkg/scheduler/internal/cache/snapshot.go
vendored
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user