Use frameworkHandle to get listers

This commit is contained in:
Shintaro Murakami 2019-10-17 16:16:46 +09:00
parent 54a30700a3
commit bf256bcb00
9 changed files with 54 additions and 53 deletions

View File

@ -6,7 +6,6 @@ go_library(
importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins", importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//pkg/scheduler/algorithm:go_default_library",
"//pkg/scheduler/algorithm/predicates:go_default_library", "//pkg/scheduler/algorithm/predicates:go_default_library",
"//pkg/scheduler/algorithm/priorities:go_default_library", "//pkg/scheduler/algorithm/priorities:go_default_library",
"//pkg/scheduler/apis/config:go_default_library", "//pkg/scheduler/apis/config:go_default_library",
@ -26,8 +25,6 @@ go_library(
"//pkg/scheduler/internal/cache:go_default_library", "//pkg/scheduler/internal/cache:go_default_library",
"//pkg/scheduler/volumebinder:go_default_library", "//pkg/scheduler/volumebinder: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/core/v1:go_default_library",
"//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library",
], ],
) )

View File

@ -20,9 +20,6 @@ import (
"fmt" "fmt"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
corelisters "k8s.io/client-go/listers/core/v1"
storagelistersv1 "k8s.io/client-go/listers/storage/v1"
"k8s.io/kubernetes/pkg/scheduler/algorithm"
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
"k8s.io/kubernetes/pkg/scheduler/algorithm/priorities" "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities"
"k8s.io/kubernetes/pkg/scheduler/apis/config" "k8s.io/kubernetes/pkg/scheduler/apis/config"
@ -45,26 +42,14 @@ import (
// RegistryArgs arguments needed to create default plugin factories. // RegistryArgs arguments needed to create default plugin factories.
type RegistryArgs struct { type RegistryArgs struct {
SchedulerCache internalcache.Cache SchedulerCache internalcache.Cache
ServiceLister algorithm.ServiceLister VolumeBinder *volumebinder.VolumeBinder
ControllerLister algorithm.ControllerLister
ReplicaSetLister algorithm.ReplicaSetLister
StatefulSetLister algorithm.StatefulSetLister
PDBLister algorithm.PDBLister
PVLister corelisters.PersistentVolumeLister
PVCLister corelisters.PersistentVolumeClaimLister
StorageClassLister storagelistersv1.StorageClassLister
VolumeBinder *volumebinder.VolumeBinder
} }
// NewDefaultRegistry builds a default registry with all the default plugins. // NewDefaultRegistry builds a default registry with all the default plugins.
// This is the registry that Kubernetes default scheduler uses. A scheduler that // This is the registry that Kubernetes default scheduler uses. A scheduler that
// runs custom plugins, can pass a different Registry when initializing the scheduler. // runs custom plugins, can pass a different Registry when initializing the scheduler.
func NewDefaultRegistry(args *RegistryArgs) framework.Registry { func NewDefaultRegistry(args *RegistryArgs) framework.Registry {
pvInfo := &predicates.CachedPersistentVolumeInfo{PersistentVolumeLister: args.PVLister}
pvcInfo := &predicates.CachedPersistentVolumeClaimInfo{PersistentVolumeClaimLister: args.PVCLister}
classInfo := &predicates.CachedStorageClassInfo{StorageClassLister: args.StorageClassLister}
return framework.Registry{ return framework.Registry{
imagelocality.Name: imagelocality.New, imagelocality.Name: imagelocality.New,
tainttoleration.Name: tainttoleration.New, tainttoleration.Name: tainttoleration.New,
@ -77,12 +62,8 @@ func NewDefaultRegistry(args *RegistryArgs) framework.Registry {
return volumebinding.NewFromVolumeBinder(args.VolumeBinder), nil return volumebinding.NewFromVolumeBinder(args.VolumeBinder), nil
}, },
volumerestrictions.Name: volumerestrictions.New, volumerestrictions.Name: volumerestrictions.New,
volumezone.Name: func(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) { volumezone.Name: volumezone.New,
return volumezone.New(pvInfo, pvcInfo, classInfo), nil nodevolumelimits.Name: nodevolumelimits.New(args.SchedulerCache),
},
nodevolumelimits.Name: func(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) {
return nodevolumelimits.New(args.SchedulerCache, pvInfo, pvcInfo, classInfo), nil
},
interpodaffinity.Name: func(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) { interpodaffinity.Name: func(_ *runtime.Unknown, _ framework.FrameworkHandle) (framework.Plugin, error) {
return interpodaffinity.New(args.SchedulerCache, args.SchedulerCache), nil return interpodaffinity.New(args.SchedulerCache, args.SchedulerCache), nil
}, },

View File

@ -11,6 +11,7 @@ go_library(
"//pkg/scheduler/framework/v1alpha1:go_default_library", "//pkg/scheduler/framework/v1alpha1:go_default_library",
"//pkg/scheduler/nodeinfo:go_default_library", "//pkg/scheduler/nodeinfo: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/runtime:go_default_library",
], ],
) )

View File

@ -20,6 +20,7 @@ import (
"context" "context"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration"
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
@ -48,9 +49,21 @@ func (pl *NodeVolumeLimits) Filter(ctx context.Context, _ *framework.CycleState,
return migration.PredicateResultToFrameworkStatus(reasons, err) return migration.PredicateResultToFrameworkStatus(reasons, err)
} }
// New initializes a new plugin and returns it. // New returns function that initializes a new plugin and returns it.
func New(csiNodeInfo predicates.CSINodeInfo, pvInfo predicates.PersistentVolumeInfo, pvcInfo predicates.PersistentVolumeClaimInfo, classInfo predicates.StorageClassInfo) framework.Plugin { func New(csiNodeInfo predicates.CSINodeInfo) framework.PluginFactory {
return &NodeVolumeLimits{ return func(_ *runtime.Unknown, handle framework.FrameworkHandle) (framework.Plugin, error) {
predicate: predicates.NewCSIMaxVolumeLimitPredicate(csiNodeInfo, pvInfo, pvcInfo, classInfo), informerFactory := handle.SharedInformerFactory()
pvInfo := &predicates.CachedPersistentVolumeInfo{
PersistentVolumeLister: informerFactory.Core().V1().PersistentVolumes().Lister(),
}
pvcInfo := &predicates.CachedPersistentVolumeClaimInfo{
PersistentVolumeClaimLister: informerFactory.Core().V1().PersistentVolumeClaims().Lister(),
}
classInfo := &predicates.CachedStorageClassInfo{
StorageClassLister: informerFactory.Storage().V1().StorageClasses().Lister(),
}
return &NodeVolumeLimits{
predicate: predicates.NewCSIMaxVolumeLimitPredicate(csiNodeInfo, pvInfo, pvcInfo, classInfo),
}, nil
} }
} }

View File

@ -444,11 +444,10 @@ func TestNodeVolumeLimits(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigrationAWS, false)() defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigrationAWS, false)()
} }
p := New(getFakeCSINodeInfo(csiNode), p := &NodeVolumeLimits{
getFakeCSIPVInfo(test.filterName, test.driverNames...), predicate: predicates.NewCSIMaxVolumeLimitPredicate(getFakeCSINodeInfo(csiNode), getFakeCSIPVInfo(test.filterName, test.driverNames...), getFakeCSIPVCInfo(test.filterName, "csi-sc", test.driverNames...), getFakeCSIStorageClassInfo("csi-sc", test.driverNames[0])),
getFakeCSIPVCInfo(test.filterName, "csi-sc", test.driverNames...), }
getFakeCSIStorageClassInfo("csi-sc", test.driverNames[0])) gotStatus := p.Filter(context.Background(), nil, test.newPod, node)
gotStatus := p.(framework.FilterPlugin).Filter(context.Background(), nil, test.newPod, node)
if !reflect.DeepEqual(gotStatus, test.wantStatus) { if !reflect.DeepEqual(gotStatus, test.wantStatus) {
t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus) t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus)
} }

View File

@ -11,6 +11,7 @@ go_library(
"//pkg/scheduler/framework/v1alpha1:go_default_library", "//pkg/scheduler/framework/v1alpha1:go_default_library",
"//pkg/scheduler/nodeinfo:go_default_library", "//pkg/scheduler/nodeinfo: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/runtime:go_default_library",
], ],
) )

View File

@ -20,6 +20,7 @@ import (
"context" "context"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration" "k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration"
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
@ -49,8 +50,18 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod *
} }
// New initializes a new plugin and returns it. // New initializes a new plugin and returns it.
func New(pvInfo predicates.PersistentVolumeInfo, pvcInfo predicates.PersistentVolumeClaimInfo, classInfo predicates.StorageClassInfo) framework.Plugin { func New(_ *runtime.Unknown, handle framework.FrameworkHandle) (framework.Plugin, error) {
informerFactory := handle.SharedInformerFactory()
pvInfo := &predicates.CachedPersistentVolumeInfo{
PersistentVolumeLister: informerFactory.Core().V1().PersistentVolumes().Lister(),
}
pvcInfo := &predicates.CachedPersistentVolumeClaimInfo{
PersistentVolumeClaimLister: informerFactory.Core().V1().PersistentVolumeClaims().Lister(),
}
classInfo := &predicates.CachedStorageClassInfo{
StorageClassLister: informerFactory.Storage().V1().StorageClasses().Lister(),
}
return &VolumeZone{ return &VolumeZone{
predicate: predicates.NewVolumeZonePredicate(pvInfo, pvcInfo, classInfo), predicate: predicates.NewVolumeZonePredicate(pvInfo, pvcInfo, classInfo),
} }, nil
} }

View File

@ -154,8 +154,10 @@ func TestSingleZone(t *testing.T) {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
node := &schedulernodeinfo.NodeInfo{} node := &schedulernodeinfo.NodeInfo{}
node.SetNode(test.Node) node.SetNode(test.Node)
p := New(pvInfo, pvcInfo, nil) p := &VolumeZone{
gotStatus := p.(framework.FilterPlugin).Filter(context.Background(), nil, test.Pod, node) predicate: predicates.NewVolumeZonePredicate(pvInfo, pvcInfo, nil),
}
gotStatus := p.Filter(context.Background(), nil, test.Pod, node)
if !reflect.DeepEqual(gotStatus, test.wantStatus) { if !reflect.DeepEqual(gotStatus, test.wantStatus) {
t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus) t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus)
} }
@ -237,8 +239,10 @@ func TestMultiZone(t *testing.T) {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
node := &schedulernodeinfo.NodeInfo{} node := &schedulernodeinfo.NodeInfo{}
node.SetNode(test.Node) node.SetNode(test.Node)
p := New(pvInfo, pvcInfo, nil) p := &VolumeZone{
gotStatus := p.(framework.FilterPlugin).Filter(context.Background(), nil, test.Pod, node) predicate: predicates.NewVolumeZonePredicate(pvInfo, pvcInfo, nil),
}
gotStatus := p.Filter(context.Background(), nil, test.Pod, node)
if !reflect.DeepEqual(gotStatus, test.wantStatus) { if !reflect.DeepEqual(gotStatus, test.wantStatus) {
t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus) t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus)
} }
@ -340,8 +344,10 @@ func TestWithBinding(t *testing.T) {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
node := &schedulernodeinfo.NodeInfo{} node := &schedulernodeinfo.NodeInfo{}
node.SetNode(test.Node) node.SetNode(test.Node)
p := New(pvInfo, pvcInfo, classInfo) p := &VolumeZone{
gotStatus := p.(framework.FilterPlugin).Filter(context.Background(), nil, test.Pod, node) predicate: predicates.NewVolumeZonePredicate(pvInfo, pvcInfo, classInfo),
}
gotStatus := p.Filter(context.Background(), nil, test.Pod, node)
if !reflect.DeepEqual(gotStatus, test.wantStatus) { if !reflect.DeepEqual(gotStatus, test.wantStatus) {
t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus) t.Errorf("status does not match: %v, want: %v", gotStatus, test.wantStatus)
} }

View File

@ -274,16 +274,8 @@ func New(client clientset.Interface,
registry := options.frameworkDefaultRegistry registry := options.frameworkDefaultRegistry
if registry == nil { if registry == nil {
registry = frameworkplugins.NewDefaultRegistry(&frameworkplugins.RegistryArgs{ registry = frameworkplugins.NewDefaultRegistry(&frameworkplugins.RegistryArgs{
SchedulerCache: schedulerCache, SchedulerCache: schedulerCache,
ServiceLister: informerFactory.Core().V1().Services().Lister(), VolumeBinder: volumeBinder,
ControllerLister: informerFactory.Core().V1().ReplicationControllers().Lister(),
ReplicaSetLister: informerFactory.Apps().V1().ReplicaSets().Lister(),
StatefulSetLister: informerFactory.Apps().V1().StatefulSets().Lister(),
PDBLister: informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(),
PVLister: informerFactory.Core().V1().PersistentVolumes().Lister(),
PVCLister: informerFactory.Core().V1().PersistentVolumeClaims().Lister(),
StorageClassLister: informerFactory.Storage().V1().StorageClasses().Lister(),
VolumeBinder: volumeBinder,
}) })
} }
registry.Merge(options.frameworkOutOfTreeRegistry) registry.Merge(options.frameworkOutOfTreeRegistry)