func get_scheduler(st settings) (scheduler.Scheduler, error) { var s scheduler.Scheduler switch st.schedulerType { case "DOCKER": log.Println("Scheduling with Docker remote API") s = docker.NewScheduler(st.pullImages, st.dockerHost) case "ECS": return nil, fmt.Errorf("Scheduling with ECS not yet supported. Tweet with hashtag #F12ECS if you'd like us to add this next!") case "KUBERNETES": return nil, fmt.Errorf("Scheduling with Kubernetes not yet supported. Tweet with hashtag #F12Kubernetes if you'd like us to add this next!") case "MESOS": return nil, fmt.Errorf("Scheduling with Mesos / Marathon not yet supported. Tweet with hashtag #F12Mesos if you'd like us to add this next!") case "NOMAD": return nil, fmt.Errorf("Scheduling with Nomad not yet supported. Tweet with hashtag #F12Nomad if you'd like us to add this next!") case "TOY": log.Println("Scheduling with toy scheduler") s = toy_scheduler.NewScheduler() default: return nil, fmt.Errorf("Bad value for F12_SCHEDULER: %s", st.schedulerType) } if s == nil { return nil, fmt.Errorf("No scheduler") } return s, nil }
func TestHandleDemandChange(t *testing.T) { tasks = make(map[string]demand.Task) tasks["priority1"] = demand.Task{ FamilyName: "p1family", Demand: 4, Requested: 0, } tasks["priority2"] = demand.Task{ FamilyName: "p2family", Demand: 3, Requested: 0, } // We might see our own task when we look at Docker, we shouldn't be scaling it! tasks["force12"] = demand.Task{ FamilyName: "force12", Demand: 1, Requested: 1, } di := rng.NewDemandModel(3, 9) s := toy_scheduler.NewScheduler() ready := make(chan struct{}, 1) for i := 0; i < 5; i++ { err := handleDemandChange(di, s, ready, tasks) <-ready if err != nil { t.Fatalf("handleDemandChange failed") } log.Println(tasks) } }
func TestHandleDemandChange(t *testing.T) { tasks = make(map[string]demand.Task) tasks["priority1"] = demand.Task{ FamilyName: "p1family", Demand: 4, Requested: 0, } tasks["priority2"] = demand.Task{ FamilyName: "p2family", Demand: 3, Requested: 0, } s := toy_scheduler.NewScheduler() tests := []struct { td []api.TaskDemand newtasks map[string]demand.Task }{ { td: []api.TaskDemand{ { App: "priority1", DemandCount: 5, }, }, newtasks: map[string]demand.Task{ "priority1": {FamilyName: "p1family", Demand: 5, Requested: 5}, "priority2": {FamilyName: "p2family", Demand: 3, Requested: 3}, }, }, { // We just ignore any tasks that we didn't know about td: []api.TaskDemand{ { App: "priority1", DemandCount: 5, }, { App: "priority3", DemandCount: 5, }, }, newtasks: map[string]demand.Task{ "priority1": {FamilyName: "p1family", Demand: 5, Requested: 5}, "priority2": {FamilyName: "p2family", Demand: 3, Requested: 3}, }, }, } for _, test := range tests { err := handleDemandChange(test.td, s, tasks) if err != nil { t.Fatalf("handleDemandChange failed") } log.Println(tasks) if !reflect.DeepEqual(tasks, test.newtasks) { t.Fatalf("Expected %v tasks, got %v", test.newtasks, tasks) } } }