2017-01-03 20:56:55 -05:00
package schedulers
import (
2017-09-26 00:18:35 -04:00
"bitbucket.org/sunybingcloud/elektron/def"
2017-01-03 20:56:55 -05:00
mesos "github.com/mesos/mesos-go/mesosproto"
sched "github.com/mesos/mesos-go/scheduler"
"log"
)
2017-09-26 13:17:47 -04:00
// Implements mesos scheduler.
type ElectronScheduler interface {
sched . Scheduler
init ( opts ... schedPolicyOption )
}
2017-02-11 14:27:33 -05:00
type base struct {
2017-09-26 13:17:47 -04:00
ElectronScheduler
2017-02-09 20:27:18 -05:00
tasksCreated int
tasksRunning int
tasks [ ] def . Task
metrics map [ string ] def . Metric
running map [ string ] map [ string ] bool
wattsAsAResource bool
classMapWatts bool
// First set of PCP values are garbage values, signal to logger to start recording when we're
2017-09-28 15:36:47 -04:00
// about to schedule a new task.
2017-09-26 13:17:47 -04:00
RecordPCP * bool
2017-02-09 20:27:18 -05:00
// This channel is closed when the program receives an interrupt,
// signalling that the program should shut down.
Shutdown chan struct { }
// This channel is closed after shutdown is closed, and only when all
2017-09-28 15:36:47 -04:00
// outstanding tasks have been cleaned up.
2017-02-09 20:27:18 -05:00
Done chan struct { }
2017-09-28 15:36:47 -04:00
// Controls when to shutdown pcp logging.
2017-02-09 20:27:18 -05:00
PCPLog chan struct { }
schedTrace * log . Logger
}
2017-01-03 20:56:55 -05:00
2017-09-26 13:17:47 -04:00
func ( s * base ) init ( opts ... schedPolicyOption ) {
for _ , opt := range opts {
2017-09-28 15:36:47 -04:00
// Applying options.
2017-09-26 13:17:47 -04:00
if err := opt ( s ) ; err != nil {
log . Fatal ( err )
}
}
s . running = make ( map [ string ] map [ string ] bool )
}
2017-01-03 20:56:55 -05:00
func ( s * base ) OfferRescinded ( _ sched . SchedulerDriver , offerID * mesos . OfferID ) {
log . Printf ( "Offer %s rescinded" , offerID )
}
func ( s * base ) SlaveLost ( _ sched . SchedulerDriver , slaveID * mesos . SlaveID ) {
log . Printf ( "Slave %s lost" , slaveID )
}
func ( s * base ) ExecutorLost ( _ sched . SchedulerDriver ,
executorID * mesos . ExecutorID ,
slaveID * mesos . SlaveID , status int ) {
log . Printf ( "Executor %s on slave %s was lost" , executorID , slaveID )
}
func ( s * base ) Error ( _ sched . SchedulerDriver , err string ) {
log . Printf ( "Receiving an error: %s" , err )
}
func ( s * base ) FrameworkMessage (
driver sched . SchedulerDriver ,
executorID * mesos . ExecutorID ,
slaveID * mesos . SlaveID ,
message string ) {
log . Println ( "Getting a framework message: " , message )
log . Printf ( "Received a framework message from some unknown source: %s" , * executorID . Value )
}
func ( s * base ) Registered (
_ sched . SchedulerDriver ,
frameworkID * mesos . FrameworkID ,
masterInfo * mesos . MasterInfo ) {
log . Printf ( "Framework %s registered with master %s" , frameworkID , masterInfo )
}
func ( s * base ) Reregistered ( _ sched . SchedulerDriver , masterInfo * mesos . MasterInfo ) {
log . Printf ( "Framework re-registered with master %s" , masterInfo )
}
func ( s * base ) Disconnected ( sched . SchedulerDriver ) {
log . Println ( "Framework disconnected with master" )
}