Merge pull request #92840 from adtac/listers

selectorspread: access listers in plugin instantiation
This commit is contained in:
Kubernetes Prow Robot 2020-07-11 20:56:23 -07:00 committed by GitHub
commit 016c2f64de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 15 deletions

View File

@ -12,6 +12,8 @@ go_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/labels: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/client-go/listers/apps/v1:go_default_library",
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
], ],
) )

View File

@ -23,6 +23,8 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
appslisters "k8s.io/client-go/listers/apps/v1"
corelisters "k8s.io/client-go/listers/core/v1"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/helper"
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
utilnode "k8s.io/kubernetes/pkg/util/node" utilnode "k8s.io/kubernetes/pkg/util/node"
@ -30,7 +32,11 @@ import (
// SelectorSpread is a plugin that calculates selector spread priority. // SelectorSpread is a plugin that calculates selector spread priority.
type SelectorSpread struct { type SelectorSpread struct {
handle framework.FrameworkHandle sharedLister framework.SharedLister
services corelisters.ServiceLister
replicationControllers corelisters.ReplicationControllerLister
replicaSets appslisters.ReplicaSetLister
statefulSets appslisters.StatefulSetLister
} }
var _ framework.PreScorePlugin = &SelectorSpread{} var _ framework.PreScorePlugin = &SelectorSpread{}
@ -88,7 +94,7 @@ func (pl *SelectorSpread) Score(ctx context.Context, state *framework.CycleState
return 0, framework.NewStatus(framework.Error, fmt.Sprintf("%+v convert to tainttoleration.preScoreState error", c)) return 0, framework.NewStatus(framework.Error, fmt.Sprintf("%+v convert to tainttoleration.preScoreState error", c))
} }
nodeInfo, err := pl.handle.SnapshotSharedLister().NodeInfos().Get(nodeName) nodeInfo, err := pl.sharedLister.NodeInfos().Get(nodeName)
if err != nil { if err != nil {
return 0, framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", nodeName, err)) return 0, framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", nodeName, err))
} }
@ -115,7 +121,7 @@ func (pl *SelectorSpread) NormalizeScore(ctx context.Context, state *framework.C
if scores[i].Score > maxCountByNodeName { if scores[i].Score > maxCountByNodeName {
maxCountByNodeName = scores[i].Score maxCountByNodeName = scores[i].Score
} }
nodeInfo, err := pl.handle.SnapshotSharedLister().NodeInfos().Get(scores[i].Name) nodeInfo, err := pl.sharedLister.NodeInfos().Get(scores[i].Name)
if err != nil { if err != nil {
return framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", scores[i].Name, err)) return framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", scores[i].Name, err))
} }
@ -146,7 +152,7 @@ func (pl *SelectorSpread) NormalizeScore(ctx context.Context, state *framework.C
} }
// If there is zone information present, incorporate it // If there is zone information present, incorporate it
if haveZones { if haveZones {
nodeInfo, err := pl.handle.SnapshotSharedLister().NodeInfos().Get(scores[i].Name) nodeInfo, err := pl.sharedLister.NodeInfos().Get(scores[i].Name)
if err != nil { if err != nil {
return framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", scores[i].Name, err)) return framework.NewStatus(framework.Error, fmt.Sprintf("getting node %q from Snapshot: %v", scores[i].Name, err))
} }
@ -176,13 +182,12 @@ func (pl *SelectorSpread) PreScore(ctx context.Context, cycleState *framework.Cy
return nil return nil
} }
var selector labels.Selector var selector labels.Selector
informerFactory := pl.handle.SharedInformerFactory()
selector = helper.DefaultSelector( selector = helper.DefaultSelector(
pod, pod,
informerFactory.Core().V1().Services().Lister(), pl.services,
informerFactory.Core().V1().ReplicationControllers().Lister(), pl.replicationControllers,
informerFactory.Apps().V1().ReplicaSets().Lister(), pl.replicaSets,
informerFactory.Apps().V1().StatefulSets().Lister(), pl.statefulSets,
) )
state := &preScoreState{ state := &preScoreState{
selector: selector, selector: selector,
@ -193,8 +198,20 @@ func (pl *SelectorSpread) PreScore(ctx context.Context, cycleState *framework.Cy
// New initializes a new plugin and returns it. // New initializes a new plugin and returns it.
func New(_ runtime.Object, handle framework.FrameworkHandle) (framework.Plugin, error) { func New(_ runtime.Object, handle framework.FrameworkHandle) (framework.Plugin, error) {
sharedLister := handle.SnapshotSharedLister()
if sharedLister == nil {
return nil, fmt.Errorf("SnapshotSharedLister is nil")
}
sharedInformerFactory := handle.SharedInformerFactory()
if sharedInformerFactory == nil {
return nil, fmt.Errorf("SharedInformerFactory is nil")
}
return &SelectorSpread{ return &SelectorSpread{
handle: handle, sharedLister: sharedLister,
services: sharedInformerFactory.Core().V1().Services().Lister(),
replicationControllers: sharedInformerFactory.Core().V1().ReplicationControllers().Lister(),
replicaSets: sharedInformerFactory.Apps().V1().ReplicaSets().Lister(),
statefulSets: sharedInformerFactory.Apps().V1().StatefulSets().Lister(),
}, nil }, nil
} }

View File

@ -69,7 +69,11 @@ func BenchmarkTestSelectorSpreadPriority(b *testing.B) {
} }
} }
fh, _ := runtime.NewFramework(nil, nil, nil, runtime.WithSnapshotSharedLister(snapshot), runtime.WithInformerFactory(informerFactory)) fh, _ := runtime.NewFramework(nil, nil, nil, runtime.WithSnapshotSharedLister(snapshot), runtime.WithInformerFactory(informerFactory))
plugin := &SelectorSpread{handle: fh} pl, err := New(nil, fh)
if err != nil {
b.Fatal(err)
}
plugin := pl.(*SelectorSpread)
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {

View File

@ -383,9 +383,11 @@ func TestSelectorSpreadScore(t *testing.T) {
state := framework.NewCycleState() state := framework.NewCycleState()
plugin := &SelectorSpread{ pl, err := New(nil, fh)
handle: fh, if err != nil {
t.Fatal(err)
} }
plugin := pl.(*SelectorSpread)
status := plugin.PreScore(ctx, state, test.pod, nodes) status := plugin.PreScore(ctx, state, test.pod, nodes)
if !status.IsSuccess() { if !status.IsSuccess() {
@ -635,9 +637,11 @@ func TestZoneSelectorSpreadPriority(t *testing.T) {
t.Errorf("error creating new framework handle: %+v", err) t.Errorf("error creating new framework handle: %+v", err)
} }
plugin := &SelectorSpread{ pl, err := New(nil, fh)
handle: fh, if err != nil {
t.Fatal(err)
} }
plugin := pl.(*SelectorSpread)
state := framework.NewCycleState() state := framework.NewCycleState()
status := plugin.PreScore(ctx, state, test.pod, nodes) status := plugin.PreScore(ctx, state, test.pod, nodes)