mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Reorder scheduler packages
- Scheduler implemenation -> components - types -> toplevel scheduler package - integration_test.go -> integration
This commit is contained in:
parent
835961ac43
commit
bb53cc26d3
@ -22,10 +22,10 @@ import (
|
||||
log "github.com/golang/glog"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/offers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/queue"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
types "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/client/cache"
|
||||
)
|
||||
@ -36,12 +36,12 @@ type SchedulerAlgorithm interface {
|
||||
|
||||
// SchedulerAlgorithm implements the algorithm.ScheduleAlgorithm interface
|
||||
type schedulerAlgorithm struct {
|
||||
sched types.Scheduler
|
||||
sched scheduler.Scheduler
|
||||
podUpdates queue.FIFO
|
||||
podScheduler podschedulers.PodScheduler
|
||||
}
|
||||
|
||||
func NewSchedulerAlgorithm(sched types.Scheduler, podUpdates queue.FIFO, podScheduler podschedulers.PodScheduler) SchedulerAlgorithm {
|
||||
func NewSchedulerAlgorithm(sched scheduler.Scheduler, podUpdates queue.FIFO, podScheduler podschedulers.PodScheduler) SchedulerAlgorithm {
|
||||
return &schedulerAlgorithm{
|
||||
sched: sched,
|
||||
podUpdates: podUpdates,
|
||||
|
@ -21,10 +21,10 @@ import (
|
||||
"strconv"
|
||||
|
||||
log "github.com/golang/glog"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
|
||||
annotation "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/meta"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
types "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
)
|
||||
|
||||
@ -33,10 +33,10 @@ type Binder interface {
|
||||
}
|
||||
|
||||
type binder struct {
|
||||
sched types.Scheduler
|
||||
sched scheduler.Scheduler
|
||||
}
|
||||
|
||||
func NewBinder(sched types.Scheduler) Binder {
|
||||
func NewBinder(sched scheduler.Scheduler) Binder {
|
||||
return &binder{
|
||||
sched: sched,
|
||||
}
|
||||
|
@ -25,8 +25,8 @@ import (
|
||||
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer"
|
||||
types "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
)
|
||||
|
||||
type Deleter interface {
|
||||
@ -35,11 +35,11 @@ type Deleter interface {
|
||||
}
|
||||
|
||||
type deleter struct {
|
||||
sched types.Scheduler
|
||||
sched scheduler.Scheduler
|
||||
qr *queuer.Queuer
|
||||
}
|
||||
|
||||
func NewDeleter(sched types.Scheduler, qr *queuer.Queuer) Deleter {
|
||||
func NewDeleter(sched scheduler.Scheduler, qr *queuer.Queuer) Deleter {
|
||||
return &deleter{
|
||||
sched: sched,
|
||||
qr: qr,
|
||||
|
@ -24,7 +24,7 @@ import (
|
||||
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer"
|
||||
types "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
types "k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
)
|
||||
|
||||
|
@ -21,11 +21,11 @@ import (
|
||||
mesos "github.com/mesos/mesos-go/mesosproto"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/backoff"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/queue"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer"
|
||||
types "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/util"
|
||||
)
|
||||
@ -35,13 +35,13 @@ type ErrorHandler interface {
|
||||
}
|
||||
|
||||
type errorHandler struct {
|
||||
sched types.Scheduler
|
||||
sched scheduler.Scheduler
|
||||
backoff *backoff.Backoff
|
||||
qr *queuer.Queuer
|
||||
podScheduler podschedulers.PodScheduler
|
||||
}
|
||||
|
||||
func NewErrorHandler(sched types.Scheduler, backoff *backoff.Backoff, qr *queuer.Queuer, podScheduler podschedulers.PodScheduler) ErrorHandler {
|
||||
func NewErrorHandler(sched scheduler.Scheduler, backoff *backoff.Backoff, qr *queuer.Queuer, podScheduler podschedulers.PodScheduler) ErrorHandler {
|
||||
return &errorHandler{
|
||||
sched: sched,
|
||||
backoff: backoff,
|
||||
|
@ -37,6 +37,7 @@ import (
|
||||
offermetrics "k8s.io/kubernetes/contrib/mesos/pkg/offers/metrics"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/proc"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/runtime"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/tasksreconciler"
|
||||
schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
|
||||
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
|
||||
@ -44,7 +45,6 @@ import (
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/metrics"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/slave"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/uid"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/errors"
|
||||
@ -59,7 +59,7 @@ import (
|
||||
type Framework interface {
|
||||
mscheduler.Scheduler
|
||||
|
||||
Init(sched types.Scheduler, electedMaster proc.Process, mux *http.ServeMux) error
|
||||
Init(sched scheduler.Scheduler, electedMaster proc.Process, mux *http.ServeMux) error
|
||||
Registration() <-chan struct{}
|
||||
Offers() offers.Registry
|
||||
LaunchTask(t *podtask.T) error
|
||||
@ -72,7 +72,7 @@ type framework struct {
|
||||
*sync.RWMutex
|
||||
|
||||
// Config related, write-once
|
||||
sched types.Scheduler
|
||||
sched scheduler.Scheduler
|
||||
schedulerConfig *schedcfg.Config
|
||||
executor *mesos.ExecutorInfo
|
||||
executorGroup uint64
|
||||
@ -168,7 +168,7 @@ func New(config Config) Framework {
|
||||
return k
|
||||
}
|
||||
|
||||
func (k *framework) Init(sched types.Scheduler, electedMaster proc.Process, mux *http.ServeMux) error {
|
||||
func (k *framework) Init(sched scheduler.Scheduler, electedMaster proc.Process, mux *http.ServeMux) error {
|
||||
log.V(1).Infoln("initializing kubernetes mesos scheduler")
|
||||
|
||||
k.sched = sched
|
||||
|
@ -29,7 +29,7 @@ import (
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/mock"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/slave"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/client/cache"
|
||||
)
|
||||
@ -83,8 +83,8 @@ func (r *mockRegistrator) Register(hostName string, labels map[string]string) (b
|
||||
}
|
||||
}
|
||||
|
||||
func mockScheduler() types.Scheduler {
|
||||
mockScheduler := &types.MockScheduler{}
|
||||
func mockScheduler() scheduler.Scheduler {
|
||||
mockScheduler := &scheduler.MockScheduler{}
|
||||
reg := podtask.NewInMemoryRegistry()
|
||||
mockScheduler.On("Tasks").Return(reg)
|
||||
return mockScheduler
|
||||
|
@ -24,7 +24,7 @@ import (
|
||||
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
apierrors "k8s.io/kubernetes/pkg/api/errors"
|
||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||
@ -36,13 +36,13 @@ type PodReconciler interface {
|
||||
}
|
||||
|
||||
type podReconciler struct {
|
||||
sched types.Scheduler
|
||||
sched scheduler.Scheduler
|
||||
client *client.Client
|
||||
qr *queuer.Queuer
|
||||
deleter deleter.Deleter
|
||||
}
|
||||
|
||||
func NewPodReconciler(sched types.Scheduler, client *client.Client, qr *queuer.Queuer, deleter deleter.Deleter) PodReconciler {
|
||||
func NewPodReconciler(sched scheduler.Scheduler, client *client.Client, qr *queuer.Queuer, deleter deleter.Deleter) PodReconciler {
|
||||
return &podReconciler{
|
||||
sched: sched,
|
||||
client: client,
|
||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package scheduler
|
||||
package components
|
||||
|
||||
import (
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/queue"
|
121
contrib/mesos/pkg/scheduler/components/scheduler.go
Normal file
121
contrib/mesos/pkg/scheduler/components/scheduler.go
Normal file
@ -0,0 +1,121 @@
|
||||
/*
|
||||
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package components
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/backoff"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/offers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/queue"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/runtime"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/algorithm"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/binder"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/deleter"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/errorhandler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/framework"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/podreconciler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/schedulerloop"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/client/cache"
|
||||
"k8s.io/kubernetes/pkg/client/record"
|
||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||
)
|
||||
|
||||
// Scheduler implements types.Scheduler
|
||||
type sched struct {
|
||||
podReconciler podreconciler.PodReconciler
|
||||
framework framework.Framework
|
||||
loop schedulerloop.SchedulerLoop
|
||||
|
||||
// unsafe state, needs to be guarded, especially changes to podtask.T objects
|
||||
sync.RWMutex
|
||||
taskRegistry podtask.Registry
|
||||
}
|
||||
|
||||
func NewScheduler(c *config.Config, fw framework.Framework, ps podschedulers.PodScheduler,
|
||||
client *client.Client, recorder record.EventRecorder, terminate <-chan struct{}, mux *http.ServeMux, lw *cache.ListWatch) scheduler.Scheduler {
|
||||
|
||||
core := &sched{
|
||||
framework: fw,
|
||||
taskRegistry: podtask.NewInMemoryRegistry(),
|
||||
}
|
||||
|
||||
// Watch and queue pods that need scheduling.
|
||||
updates := make(chan queue.Entry, c.UpdatesBacklog)
|
||||
podUpdates := &podStoreAdapter{queue.NewHistorical(updates)}
|
||||
reflector := cache.NewReflector(lw, &api.Pod{}, podUpdates, 0)
|
||||
|
||||
q := queuer.New(podUpdates)
|
||||
|
||||
algorithm := algorithm.NewSchedulerAlgorithm(core, podUpdates, ps)
|
||||
|
||||
podDeleter := deleter.NewDeleter(core, q)
|
||||
|
||||
core.podReconciler = podreconciler.NewPodReconciler(core, client, q, podDeleter)
|
||||
|
||||
bo := backoff.New(c.InitialPodBackoff.Duration, c.MaxPodBackoff.Duration)
|
||||
errorHandler := errorhandler.NewErrorHandler(core, bo, q, ps)
|
||||
|
||||
binder := binder.NewBinder(core)
|
||||
|
||||
startLatch := make(chan struct{})
|
||||
eventBroadcaster := record.NewBroadcaster()
|
||||
|
||||
runtime.On(startLatch, func() {
|
||||
eventBroadcaster.StartRecordingToSink(client.Events(""))
|
||||
reflector.Run() // TODO(jdef) should listen for termination
|
||||
podDeleter.Run(updates, terminate)
|
||||
q.Run(terminate)
|
||||
|
||||
q.InstallDebugHandlers(mux)
|
||||
podtask.InstallDebugHandlers(core.Tasks(), mux)
|
||||
})
|
||||
|
||||
core.loop = schedulerloop.NewSchedulerLoop(client, algorithm, recorder, q.Yield, errorHandler.Error, binder, startLatch)
|
||||
return core
|
||||
}
|
||||
|
||||
func (c *sched) Run(done <-chan struct{}) {
|
||||
c.loop.Run(done)
|
||||
}
|
||||
|
||||
func (c *sched) Reconcile(t *podtask.T) {
|
||||
c.podReconciler.Reconcile(t)
|
||||
}
|
||||
|
||||
func (c *sched) Tasks() podtask.Registry {
|
||||
return c.taskRegistry
|
||||
}
|
||||
|
||||
func (c *sched) Offers() offers.Registry {
|
||||
return c.framework.Offers()
|
||||
}
|
||||
|
||||
func (c *sched) KillTask(id string) error {
|
||||
return c.framework.KillTask(id)
|
||||
}
|
||||
|
||||
func (c *sched) LaunchTask(t *podtask.T) error {
|
||||
return c.framework.LaunchTask(t)
|
||||
}
|
@ -14,6 +14,5 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Package types contains an abstract framework interface, implemented by the
|
||||
// MesosScheduler and consumed by the scheduler operations.
|
||||
package types
|
||||
// Package integration implements integration tests.
|
||||
package integration
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package scheduler
|
||||
package integration
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@ -33,6 +33,8 @@ import (
|
||||
"github.com/stretchr/testify/mock"
|
||||
assertext "k8s.io/kubernetes/contrib/mesos/pkg/assert"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/executor/messages"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/framework"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/schedulerloop"
|
||||
schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
|
||||
@ -430,7 +432,7 @@ type lifecycleTest struct {
|
||||
podsListWatch *MockPodsListWatch
|
||||
framework framework.Framework
|
||||
schedulerProc *ha.SchedulerProcess
|
||||
scheduler *scheduler
|
||||
sched scheduler.Scheduler
|
||||
t *testing.T
|
||||
}
|
||||
|
||||
@ -486,7 +488,7 @@ func newLifecycleTest(t *testing.T) lifecycleTest {
|
||||
|
||||
// create scheduler
|
||||
eventObs := NewEventObserver()
|
||||
scheduler := NewScheduler(&c, framework, fcfs, client, eventObs, schedulerProc.Terminal(), http.DefaultServeMux, &podsListWatch.ListWatch)
|
||||
scheduler := components.NewScheduler(&c, framework, fcfs, client, eventObs, schedulerProc.Terminal(), http.DefaultServeMux, &podsListWatch.ListWatch)
|
||||
assert.NotNil(scheduler)
|
||||
|
||||
// create mock mesos scheduler driver
|
||||
@ -499,18 +501,18 @@ func newLifecycleTest(t *testing.T) lifecycleTest {
|
||||
podsListWatch: podsListWatch,
|
||||
framework: framework,
|
||||
schedulerProc: schedulerProc,
|
||||
scheduler: scheduler,
|
||||
sched: scheduler,
|
||||
t: t,
|
||||
}
|
||||
}
|
||||
|
||||
func (lt lifecycleTest) Start() <-chan LaunchedTask {
|
||||
assert := &EventAssertions{*assert.New(lt.t)}
|
||||
lt.scheduler.Run(lt.schedulerProc.Terminal())
|
||||
lt.sched.Run(lt.schedulerProc.Terminal())
|
||||
|
||||
// init framework
|
||||
err := lt.framework.Init(
|
||||
lt.scheduler,
|
||||
lt.sched,
|
||||
lt.schedulerProc.Master(),
|
||||
http.DefaultServeMux,
|
||||
)
|
||||
@ -795,7 +797,7 @@ func TestScheduler_LifeCycle(t *testing.T) {
|
||||
|
||||
podKey, _ := podtask.MakePodKey(api.NewDefaultContext(), pod.Name)
|
||||
assertext.EventuallyTrue(t, util.ForeverTestTimeout, func() bool {
|
||||
t, _ := lt.scheduler.Tasks().ForPod(podKey)
|
||||
t, _ := lt.sched.Tasks().ForPod(podKey)
|
||||
return t == nil
|
||||
})
|
||||
|
@ -17,105 +17,22 @@ limitations under the License.
|
||||
package scheduler
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/backoff"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/offers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/queue"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/runtime"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/algorithm"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/binder"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/deleter"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/errorhandler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/framework"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/podreconciler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/schedulerloop"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/types"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/client/cache"
|
||||
"k8s.io/kubernetes/pkg/client/record"
|
||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||
)
|
||||
|
||||
// Scheduler implements types.Scheduler
|
||||
type scheduler struct {
|
||||
podReconciler podreconciler.PodReconciler
|
||||
framework framework.Framework
|
||||
loop schedulerloop.SchedulerLoop
|
||||
// Scheduler abstracts everything other components of the scheduler need
|
||||
// to access from eachother
|
||||
type Scheduler interface {
|
||||
Tasks() podtask.Registry
|
||||
sync.Locker // synchronize changes to tasks, i.e. lock, get task, change task, store task, unlock
|
||||
|
||||
// unsafe state, needs to be guarded, especially changes to podtask.T objects
|
||||
sync.RWMutex
|
||||
taskRegistry podtask.Registry
|
||||
}
|
||||
|
||||
func NewScheduler(c *config.Config, fw framework.Framework, ps podschedulers.PodScheduler,
|
||||
client *client.Client, recorder record.EventRecorder, terminate <-chan struct{}, mux *http.ServeMux, lw *cache.ListWatch) types.Scheduler {
|
||||
|
||||
core := &scheduler{
|
||||
framework: fw,
|
||||
taskRegistry: podtask.NewInMemoryRegistry(),
|
||||
}
|
||||
|
||||
// Watch and queue pods that need scheduling.
|
||||
updates := make(chan queue.Entry, c.UpdatesBacklog)
|
||||
podUpdates := &podStoreAdapter{queue.NewHistorical(updates)}
|
||||
reflector := cache.NewReflector(lw, &api.Pod{}, podUpdates, 0)
|
||||
|
||||
q := queuer.New(podUpdates)
|
||||
|
||||
algorithm := algorithm.NewSchedulerAlgorithm(core, podUpdates, ps)
|
||||
|
||||
podDeleter := deleter.NewDeleter(core, q)
|
||||
|
||||
core.podReconciler = podreconciler.NewPodReconciler(core, client, q, podDeleter)
|
||||
|
||||
bo := backoff.New(c.InitialPodBackoff.Duration, c.MaxPodBackoff.Duration)
|
||||
errorHandler := errorhandler.NewErrorHandler(core, bo, q, ps)
|
||||
|
||||
binder := binder.NewBinder(core)
|
||||
|
||||
startLatch := make(chan struct{})
|
||||
eventBroadcaster := record.NewBroadcaster()
|
||||
|
||||
runtime.On(startLatch, func() {
|
||||
eventBroadcaster.StartRecordingToSink(client.Events(""))
|
||||
reflector.Run() // TODO(jdef) should listen for termination
|
||||
podDeleter.Run(updates, terminate)
|
||||
q.Run(terminate)
|
||||
|
||||
q.InstallDebugHandlers(mux)
|
||||
podtask.InstallDebugHandlers(core.Tasks(), mux)
|
||||
})
|
||||
|
||||
core.loop = schedulerloop.NewSchedulerLoop(client, algorithm, recorder, q.Yield, errorHandler.Error, binder, startLatch)
|
||||
return core
|
||||
}
|
||||
|
||||
func (c *scheduler) Run(done <-chan struct{}) {
|
||||
c.loop.Run(done)
|
||||
}
|
||||
|
||||
func (c *scheduler) Reconcile(t *podtask.T) {
|
||||
c.podReconciler.Reconcile(t)
|
||||
}
|
||||
|
||||
func (c *scheduler) Tasks() podtask.Registry {
|
||||
return c.taskRegistry
|
||||
}
|
||||
|
||||
func (c *scheduler) Offers() offers.Registry {
|
||||
return c.framework.Offers()
|
||||
}
|
||||
|
||||
func (c *scheduler) KillTask(id string) error {
|
||||
return c.framework.KillTask(id)
|
||||
}
|
||||
|
||||
func (c *scheduler) LaunchTask(t *podtask.T) error {
|
||||
return c.framework.LaunchTask(t)
|
||||
Offers() offers.Registry
|
||||
Reconcile(t *podtask.T)
|
||||
KillTask(id string) error
|
||||
LaunchTask(t *podtask.T) error
|
||||
|
||||
Run(done <-chan struct{})
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package types
|
||||
package scheduler
|
||||
|
||||
import (
|
||||
"sync"
|
@ -54,7 +54,6 @@ import (
|
||||
minioncfg "k8s.io/kubernetes/contrib/mesos/pkg/minion/config"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/profile"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/runtime"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/framework"
|
||||
schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/ha"
|
||||
@ -75,6 +74,7 @@ import (
|
||||
"k8s.io/kubernetes/pkg/master/ports"
|
||||
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
||||
"k8s.io/kubernetes/pkg/tools"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -763,14 +763,14 @@ func (s *SchedulerServer) bootstrap(hks hyperkube.Interface, sc *schedcfg.Config
|
||||
eventBroadcaster := record.NewBroadcaster()
|
||||
recorder := eventBroadcaster.NewRecorder(api.EventSource{Component: "scheduler"})
|
||||
lw := cache.NewListWatchFromClient(client, "pods", api.NamespaceAll, fields.Everything())
|
||||
scheduler := scheduler.NewScheduler(sc, framework, fcfs, client, recorder, schedulerProcess.Terminal(), s.mux, lw)
|
||||
sched := components.NewScheduler(sc, framework, fcfs, client, recorder, schedulerProcess.Terminal(), s.mux, lw)
|
||||
|
||||
runtime.On(framework.Registration(), func() { scheduler.Run(schedulerProcess.Terminal()) })
|
||||
runtime.On(framework.Registration(), func() { sched.Run(schedulerProcess.Terminal()) })
|
||||
runtime.On(framework.Registration(), s.newServiceWriter(schedulerProcess.Terminal()))
|
||||
|
||||
driverFactory := ha.DriverFactory(func() (drv bindings.SchedulerDriver, err error) {
|
||||
log.V(1).Infoln("performing deferred initialization")
|
||||
if err = framework.Init(scheduler, schedulerProcess.Master(), s.mux); err != nil {
|
||||
if err = framework.Init(sched, schedulerProcess.Master(), s.mux); err != nil {
|
||||
return nil, fmt.Errorf("failed to initialize pod scheduler: %v", err)
|
||||
}
|
||||
log.V(1).Infoln("deferred init complete")
|
||||
|
@ -1,38 +0,0 @@
|
||||
/*
|
||||
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package types
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/offers"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
|
||||
)
|
||||
|
||||
// Scheduler abstracts everything other components of the scheduler need
|
||||
// to access from eachother
|
||||
type Scheduler interface {
|
||||
Tasks() podtask.Registry
|
||||
sync.Locker // synchronize changes to tasks, i.e. lock, get task, change task, store task, unlock
|
||||
|
||||
Offers() offers.Registry
|
||||
Reconcile(t *podtask.T)
|
||||
KillTask(id string) error
|
||||
LaunchTask(t *podtask.T) error
|
||||
|
||||
Run(done <-chan struct{})
|
||||
}
|
Loading…
Reference in New Issue
Block a user