From ab3f55720b596e1d097b118a9514f52f22e0df36 Mon Sep 17 00:00:00 2001 From: draveness Date: Mon, 19 Aug 2019 17:46:15 +0800 Subject: [PATCH] feat(scheduler): expose kubernetes client in framework handle --- pkg/scheduler/factory/factory.go | 9 ++++-- pkg/scheduler/framework/v1alpha1/BUILD | 1 + pkg/scheduler/framework/v1alpha1/framework.go | 32 ++++++++++++++++++- pkg/scheduler/framework/v1alpha1/interface.go | 4 +++ pkg/scheduler/internal/queue/BUILD | 1 + .../internal/queue/scheduling_queue_test.go | 5 +++ 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/pkg/scheduler/factory/factory.go b/pkg/scheduler/factory/factory.go index b644188a058..e01bbd96903 100644 --- a/pkg/scheduler/factory/factory.go +++ b/pkg/scheduler/factory/factory.go @@ -22,7 +22,7 @@ import ( "fmt" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -403,7 +403,12 @@ func (c *Configurator) CreateFromKeys(predicateKeys, priorityKeys sets.String, e pluginConfig = append(pluginConfig, pluginConfigForPriorities...) pluginConfig = append(pluginConfig, c.pluginConfig...) - framework, err := framework.NewFramework(c.registry, &plugins, pluginConfig) + framework, err := framework.NewFramework( + c.registry, + &plugins, + pluginConfig, + framework.WithClientSet(c.client), + ) if err != nil { klog.Fatalf("error initializing the scheduling framework: %v", err) } diff --git a/pkg/scheduler/framework/v1alpha1/BUILD b/pkg/scheduler/framework/v1alpha1/BUILD index 1532db35293..cacfcea96d6 100644 --- a/pkg/scheduler/framework/v1alpha1/BUILD +++ b/pkg/scheduler/framework/v1alpha1/BUILD @@ -20,6 +20,7 @@ go_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/sets:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library", diff --git a/pkg/scheduler/framework/v1alpha1/framework.go b/pkg/scheduler/framework/v1alpha1/framework.go index b5de321f316..cc490b85a61 100644 --- a/pkg/scheduler/framework/v1alpha1/framework.go +++ b/pkg/scheduler/framework/v1alpha1/framework.go @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" + clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/util/workqueue" "k8s.io/klog" "k8s.io/kubernetes/pkg/scheduler/apis/config" @@ -56,6 +57,8 @@ type framework struct { postBindPlugins []PostBindPlugin unreservePlugins []UnreservePlugin permitPlugins []PermitPlugin + + clientSet clientset.Interface } // extensionPoint encapsulates desired and applied set of plugins at a specific extension @@ -85,15 +88,37 @@ func (f *framework) getExtensionPoints(plugins *config.Plugins) []extensionPoint } } +type frameworkOptions struct { + clientSet clientset.Interface +} + +// Option for the framework. +type Option func(*frameworkOptions) + +// WithClientSet sets clientSet for the scheduling framework. +func WithClientSet(clientSet clientset.Interface) Option { + return func(o *frameworkOptions) { + o.clientSet = clientSet + } +} + +var defaultFrameworkOptions = frameworkOptions{} + var _ = Framework(&framework{}) // NewFramework initializes plugins given the configuration and the registry. -func NewFramework(r Registry, plugins *config.Plugins, args []config.PluginConfig) (Framework, error) { +func NewFramework(r Registry, plugins *config.Plugins, args []config.PluginConfig, opts ...Option) (Framework, error) { + options := defaultFrameworkOptions + for _, opt := range opts { + opt(&options) + } + f := &framework{ registry: r, nodeInfoSnapshot: schedulernodeinfo.NewSnapshot(), pluginNameToWeightMap: make(map[string]int), waitingPods: newWaitingPodsMap(), + clientSet: options.clientSet, } if plugins == nil { return f, nil @@ -552,6 +577,11 @@ func (f *framework) ListPlugins() map[string][]string { return nil } +// ClientSet returns a kubernetes clientset. +func (f *framework) ClientSet() clientset.Interface { + return f.clientSet +} + func (f *framework) pluginsNeeded(plugins *config.Plugins) map[string]config.Plugin { pgMap := make(map[string]config.Plugin, 0) diff --git a/pkg/scheduler/framework/v1alpha1/interface.go b/pkg/scheduler/framework/v1alpha1/interface.go index 1c72cbd5a1d..e4e97310bfe 100644 --- a/pkg/scheduler/framework/v1alpha1/interface.go +++ b/pkg/scheduler/framework/v1alpha1/interface.go @@ -25,6 +25,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + clientset "k8s.io/client-go/kubernetes" schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo" ) @@ -429,4 +430,7 @@ type FrameworkHandle interface { // GetWaitingPod returns a waiting pod given its UID. GetWaitingPod(uid types.UID) WaitingPod + + // ClientSet returns a kubernetes clientSet. + ClientSet() clientset.Interface } diff --git a/pkg/scheduler/internal/queue/BUILD b/pkg/scheduler/internal/queue/BUILD index 7e0d1333b50..255a764e26c 100644 --- a/pkg/scheduler/internal/queue/BUILD +++ b/pkg/scheduler/internal/queue/BUILD @@ -42,6 +42,7 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//vendor/github.com/prometheus/client_model/go:go_default_library", ], ) diff --git a/pkg/scheduler/internal/queue/scheduling_queue_test.go b/pkg/scheduler/internal/queue/scheduling_queue_test.go index ac09364642f..a5b6f1d01b8 100644 --- a/pkg/scheduler/internal/queue/scheduling_queue_test.go +++ b/pkg/scheduler/internal/queue/scheduling_queue_test.go @@ -28,6 +28,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/clock" + clientset "k8s.io/client-go/kubernetes" podutil "k8s.io/kubernetes/pkg/api/v1/pod" framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1" "k8s.io/kubernetes/pkg/scheduler/metrics" @@ -221,6 +222,10 @@ func (*fakeFramework) GetWaitingPod(uid types.UID) framework.WaitingPod { return nil } +func (*fakeFramework) ClientSet() clientset.Interface { + return nil +} + func TestPriorityQueue_AddWithReversePriorityLessFunc(t *testing.T) { q := NewPriorityQueue(nil, &fakeFramework{}) if err := q.Add(&medPriorityPod); err != nil {