Reorder scheduler packages

- Scheduler implemenation -> components
- types -> toplevel scheduler package
- integration_test.go -> integration
This commit is contained in:
Dr. Stefan Schimanski 2015-11-03 08:26:01 +01:00
parent 835961ac43
commit bb53cc26d3
16 changed files with 172 additions and 171 deletions

View File

@ -22,10 +22,10 @@ import (
log "github.com/golang/glog" log "github.com/golang/glog"
"k8s.io/kubernetes/contrib/mesos/pkg/offers" "k8s.io/kubernetes/contrib/mesos/pkg/offers"
"k8s.io/kubernetes/contrib/mesos/pkg/queue" "k8s.io/kubernetes/contrib/mesos/pkg/queue"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors" merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "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/api"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
) )
@ -36,12 +36,12 @@ type SchedulerAlgorithm interface {
// SchedulerAlgorithm implements the algorithm.ScheduleAlgorithm interface // SchedulerAlgorithm implements the algorithm.ScheduleAlgorithm interface
type schedulerAlgorithm struct { type schedulerAlgorithm struct {
sched types.Scheduler sched scheduler.Scheduler
podUpdates queue.FIFO podUpdates queue.FIFO
podScheduler podschedulers.PodScheduler 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{ return &schedulerAlgorithm{
sched: sched, sched: sched,
podUpdates: podUpdates, podUpdates: podUpdates,

View File

@ -21,10 +21,10 @@ import (
"strconv" "strconv"
log "github.com/golang/glog" log "github.com/golang/glog"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors" merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
annotation "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/meta" annotation "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/meta"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "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/api"
) )
@ -33,10 +33,10 @@ type Binder interface {
} }
type binder struct { type binder struct {
sched types.Scheduler sched scheduler.Scheduler
} }
func NewBinder(sched types.Scheduler) Binder { func NewBinder(sched scheduler.Scheduler) Binder {
return &binder{ return &binder{
sched: sched, sched: sched,
} }

View File

@ -25,8 +25,8 @@ import (
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors" merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer" "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/api"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
) )
type Deleter interface { type Deleter interface {
@ -35,11 +35,11 @@ type Deleter interface {
} }
type deleter struct { type deleter struct {
sched types.Scheduler sched scheduler.Scheduler
qr *queuer.Queuer qr *queuer.Queuer
} }
func NewDeleter(sched types.Scheduler, qr *queuer.Queuer) Deleter { func NewDeleter(sched scheduler.Scheduler, qr *queuer.Queuer) Deleter {
return &deleter{ return &deleter{
sched: sched, sched: sched,
qr: qr, qr: qr,

View File

@ -24,7 +24,7 @@ import (
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors" merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer" "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" "k8s.io/kubernetes/pkg/api"
) )

View File

@ -21,11 +21,11 @@ import (
mesos "github.com/mesos/mesos-go/mesosproto" mesos "github.com/mesos/mesos-go/mesosproto"
"k8s.io/kubernetes/contrib/mesos/pkg/backoff" "k8s.io/kubernetes/contrib/mesos/pkg/backoff"
"k8s.io/kubernetes/contrib/mesos/pkg/queue" "k8s.io/kubernetes/contrib/mesos/pkg/queue"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors" merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podschedulers"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer" "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/api"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
@ -35,13 +35,13 @@ type ErrorHandler interface {
} }
type errorHandler struct { type errorHandler struct {
sched types.Scheduler sched scheduler.Scheduler
backoff *backoff.Backoff backoff *backoff.Backoff
qr *queuer.Queuer qr *queuer.Queuer
podScheduler podschedulers.PodScheduler 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{ return &errorHandler{
sched: sched, sched: sched,
backoff: backoff, backoff: backoff,

View File

@ -37,6 +37,7 @@ import (
offermetrics "k8s.io/kubernetes/contrib/mesos/pkg/offers/metrics" offermetrics "k8s.io/kubernetes/contrib/mesos/pkg/offers/metrics"
"k8s.io/kubernetes/contrib/mesos/pkg/proc" "k8s.io/kubernetes/contrib/mesos/pkg/proc"
"k8s.io/kubernetes/contrib/mesos/pkg/runtime" "k8s.io/kubernetes/contrib/mesos/pkg/runtime"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/tasksreconciler" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/tasksreconciler"
schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config" schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors" 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/metrics"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/slave" "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/contrib/mesos/pkg/scheduler/uid"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
@ -59,7 +59,7 @@ import (
type Framework interface { type Framework interface {
mscheduler.Scheduler 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{} Registration() <-chan struct{}
Offers() offers.Registry Offers() offers.Registry
LaunchTask(t *podtask.T) error LaunchTask(t *podtask.T) error
@ -72,7 +72,7 @@ type framework struct {
*sync.RWMutex *sync.RWMutex
// Config related, write-once // Config related, write-once
sched types.Scheduler sched scheduler.Scheduler
schedulerConfig *schedcfg.Config schedulerConfig *schedcfg.Config
executor *mesos.ExecutorInfo executor *mesos.ExecutorInfo
executorGroup uint64 executorGroup uint64
@ -168,7 +168,7 @@ func New(config Config) Framework {
return k 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") log.V(1).Infoln("initializing kubernetes mesos scheduler")
k.sched = sched k.sched = sched

View File

@ -29,7 +29,7 @@ import (
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/mock" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/mock"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/slave" "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/api"
"k8s.io/kubernetes/pkg/client/cache" "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 { func mockScheduler() scheduler.Scheduler {
mockScheduler := &types.MockScheduler{} mockScheduler := &scheduler.MockScheduler{}
reg := podtask.NewInMemoryRegistry() reg := podtask.NewInMemoryRegistry()
mockScheduler.On("Tasks").Return(reg) mockScheduler.On("Tasks").Return(reg)
return mockScheduler return mockScheduler

View File

@ -24,7 +24,7 @@ import (
merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors" merrors "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/errors"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/podtask"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/queuer" "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" "k8s.io/kubernetes/pkg/api"
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
@ -36,13 +36,13 @@ type PodReconciler interface {
} }
type podReconciler struct { type podReconciler struct {
sched types.Scheduler sched scheduler.Scheduler
client *client.Client client *client.Client
qr *queuer.Queuer qr *queuer.Queuer
deleter deleter.Deleter 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{ return &podReconciler{
sched: sched, sched: sched,
client: client, client: client,

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package scheduler package components
import ( import (
"k8s.io/kubernetes/contrib/mesos/pkg/queue" "k8s.io/kubernetes/contrib/mesos/pkg/queue"

View 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)
}

View File

@ -14,6 +14,5 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
// Package types contains an abstract framework interface, implemented by the // Package integration implements integration tests.
// MesosScheduler and consumed by the scheduler operations. package integration
package types

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package scheduler package integration
import ( import (
"encoding/json" "encoding/json"
@ -33,6 +33,8 @@ import (
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
assertext "k8s.io/kubernetes/contrib/mesos/pkg/assert" assertext "k8s.io/kubernetes/contrib/mesos/pkg/assert"
"k8s.io/kubernetes/contrib/mesos/pkg/executor/messages" "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/framework"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/schedulerloop" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/schedulerloop"
schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config" schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
@ -430,7 +432,7 @@ type lifecycleTest struct {
podsListWatch *MockPodsListWatch podsListWatch *MockPodsListWatch
framework framework.Framework framework framework.Framework
schedulerProc *ha.SchedulerProcess schedulerProc *ha.SchedulerProcess
scheduler *scheduler sched scheduler.Scheduler
t *testing.T t *testing.T
} }
@ -486,7 +488,7 @@ func newLifecycleTest(t *testing.T) lifecycleTest {
// create scheduler // create scheduler
eventObs := NewEventObserver() 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) assert.NotNil(scheduler)
// create mock mesos scheduler driver // create mock mesos scheduler driver
@ -499,18 +501,18 @@ func newLifecycleTest(t *testing.T) lifecycleTest {
podsListWatch: podsListWatch, podsListWatch: podsListWatch,
framework: framework, framework: framework,
schedulerProc: schedulerProc, schedulerProc: schedulerProc,
scheduler: scheduler, sched: scheduler,
t: t, t: t,
} }
} }
func (lt lifecycleTest) Start() <-chan LaunchedTask { func (lt lifecycleTest) Start() <-chan LaunchedTask {
assert := &EventAssertions{*assert.New(lt.t)} assert := &EventAssertions{*assert.New(lt.t)}
lt.scheduler.Run(lt.schedulerProc.Terminal()) lt.sched.Run(lt.schedulerProc.Terminal())
// init framework // init framework
err := lt.framework.Init( err := lt.framework.Init(
lt.scheduler, lt.sched,
lt.schedulerProc.Master(), lt.schedulerProc.Master(),
http.DefaultServeMux, http.DefaultServeMux,
) )
@ -795,7 +797,7 @@ func TestScheduler_LifeCycle(t *testing.T) {
podKey, _ := podtask.MakePodKey(api.NewDefaultContext(), pod.Name) podKey, _ := podtask.MakePodKey(api.NewDefaultContext(), pod.Name)
assertext.EventuallyTrue(t, util.ForeverTestTimeout, func() bool { assertext.EventuallyTrue(t, util.ForeverTestTimeout, func() bool {
t, _ := lt.scheduler.Tasks().ForPod(podKey) t, _ := lt.sched.Tasks().ForPod(podKey)
return t == nil return t == nil
}) })

View File

@ -17,105 +17,22 @@ limitations under the License.
package scheduler package scheduler
import ( import (
"net/http"
"sync" "sync"
"k8s.io/kubernetes/contrib/mesos/pkg/backoff"
"k8s.io/kubernetes/contrib/mesos/pkg/offers" "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/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 // Scheduler abstracts everything other components of the scheduler need
type scheduler struct { // to access from eachother
podReconciler podreconciler.PodReconciler type Scheduler interface {
framework framework.Framework Tasks() podtask.Registry
loop schedulerloop.SchedulerLoop 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 Offers() offers.Registry
sync.RWMutex Reconcile(t *podtask.T)
taskRegistry podtask.Registry KillTask(id string) error
} LaunchTask(t *podtask.T) error
func NewScheduler(c *config.Config, fw framework.Framework, ps podschedulers.PodScheduler, Run(done <-chan struct{})
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)
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package types package scheduler
import ( import (
"sync" "sync"

View File

@ -54,7 +54,6 @@ import (
minioncfg "k8s.io/kubernetes/contrib/mesos/pkg/minion/config" minioncfg "k8s.io/kubernetes/contrib/mesos/pkg/minion/config"
"k8s.io/kubernetes/contrib/mesos/pkg/profile" "k8s.io/kubernetes/contrib/mesos/pkg/profile"
"k8s.io/kubernetes/contrib/mesos/pkg/runtime" "k8s.io/kubernetes/contrib/mesos/pkg/runtime"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/framework" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components/framework"
schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config" schedcfg "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/config"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/ha" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/ha"
@ -75,6 +74,7 @@ import (
"k8s.io/kubernetes/pkg/master/ports" "k8s.io/kubernetes/pkg/master/ports"
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
"k8s.io/kubernetes/pkg/tools" "k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/components"
) )
const ( const (
@ -763,14 +763,14 @@ func (s *SchedulerServer) bootstrap(hks hyperkube.Interface, sc *schedcfg.Config
eventBroadcaster := record.NewBroadcaster() eventBroadcaster := record.NewBroadcaster()
recorder := eventBroadcaster.NewRecorder(api.EventSource{Component: "scheduler"}) recorder := eventBroadcaster.NewRecorder(api.EventSource{Component: "scheduler"})
lw := cache.NewListWatchFromClient(client, "pods", api.NamespaceAll, fields.Everything()) 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())) runtime.On(framework.Registration(), s.newServiceWriter(schedulerProcess.Terminal()))
driverFactory := ha.DriverFactory(func() (drv bindings.SchedulerDriver, err error) { driverFactory := ha.DriverFactory(func() (drv bindings.SchedulerDriver, err error) {
log.V(1).Infoln("performing deferred initialization") 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) return nil, fmt.Errorf("failed to initialize pod scheduler: %v", err)
} }
log.V(1).Infoln("deferred init complete") log.V(1).Infoln("deferred init complete")

View File

@ -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{})
}