mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 05:57:25 +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())
|
return nil, fmt.Errorf("listing pod services: %v", err.Error())
|
||||||
}
|
}
|
||||||
selector := createSelectorFromLabels(pod.Labels)
|
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
|
// 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{
|
return &preFilterState{
|
||||||
matchingPodList: matchingPodList,
|
matchingPodList: matchingPodList,
|
||||||
@ -392,15 +392,21 @@ func createSelectorFromLabels(aL map[string]string) labels.Selector {
|
|||||||
return labels.Set(aL).AsSelector()
|
return labels.Set(aL).AsSelector()
|
||||||
}
|
}
|
||||||
|
|
||||||
// filterPodsByNamespace filters pods outside a namespace from the given list.
|
// filterPods filters pods outside a namespace from the given list.
|
||||||
func filterPodsByNamespace(pods []*v1.Pod, ns string) []*v1.Pod {
|
func filterPods(nodeInfos []*framework.NodeInfo, selector labels.Selector, ns string) []*v1.Pod {
|
||||||
filtered := []*v1.Pod{}
|
maxSize := 0
|
||||||
for _, nsPod := range pods {
|
for _, n := range nodeInfos {
|
||||||
if nsPod.Namespace == ns {
|
maxSize += len(n.Pods)
|
||||||
filtered = append(filtered, nsPod)
|
}
|
||||||
|
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.
|
// 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",
|
"//pkg/scheduler/util:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/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/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/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/json: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"
|
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{}
|
var _ corelisters.ServiceLister = &ServiceLister{}
|
||||||
|
|
||||||
// ServiceLister implements ServiceLister on []v1.Service for test purposes.
|
// ServiceLister implements ServiceLister on []v1.Service for test purposes.
|
||||||
|
@ -16,23 +16,6 @@ limitations under the License.
|
|||||||
|
|
||||||
package v1alpha1
|
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.
|
// NodeInfoLister interface represents anything that can list/get NodeInfo objects from node name.
|
||||||
type NodeInfoLister interface {
|
type NodeInfoLister interface {
|
||||||
// Returns the list of NodeInfos.
|
// Returns the list of NodeInfos.
|
||||||
@ -45,6 +28,5 @@ type NodeInfoLister interface {
|
|||||||
|
|
||||||
// SharedLister groups scheduler-specific listers.
|
// SharedLister groups scheduler-specific listers.
|
||||||
type SharedLister interface {
|
type SharedLister interface {
|
||||||
Pods() PodLister
|
|
||||||
NodeInfos() NodeInfoLister
|
NodeInfos() NodeInfoLister
|
||||||
}
|
}
|
||||||
|
34
pkg/scheduler/internal/cache/snapshot.go
vendored
34
pkg/scheduler/internal/cache/snapshot.go
vendored
@ -20,7 +20,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
|
||||||
)
|
)
|
||||||
@ -123,11 +122,6 @@ func createImageExistenceMap(nodes []*v1.Node) map[string]sets.String {
|
|||||||
return imageExistenceMap
|
return imageExistenceMap
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pods returns a PodLister
|
|
||||||
func (s *Snapshot) Pods() framework.PodLister {
|
|
||||||
return podLister(s.nodeInfoList)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeInfos returns a NodeInfoLister.
|
// NodeInfos returns a NodeInfoLister.
|
||||||
func (s *Snapshot) NodeInfos() framework.NodeInfoLister {
|
func (s *Snapshot) NodeInfos() framework.NodeInfoLister {
|
||||||
return s
|
return s
|
||||||
@ -138,34 +132,6 @@ func (s *Snapshot) NumNodes() int {
|
|||||||
return len(s.nodeInfoList)
|
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.
|
// List returns the list of nodes in the snapshot.
|
||||||
func (s *Snapshot) List() ([]*framework.NodeInfo, error) {
|
func (s *Snapshot) List() ([]*framework.NodeInfo, error) {
|
||||||
return s.nodeInfoList, nil
|
return s.nodeInfoList, nil
|
||||||
|
Loading…
Reference in New Issue
Block a user