func (s *Scheduler) launchTask(driver scheduler.SchedulerDriver, offer *mesos.Offer) { taskName := fmt.Sprintf("statsd-kafka-%s", offer.GetHostname()) taskId := &mesos.TaskID{ Value: proto.String(fmt.Sprintf("%s-%s", taskName, uuid())), } data, err := json.Marshal(Config) if err != nil { panic(err) //shouldn't happen } Logger.Debugf("Task data: %s", string(data)) task := &mesos.TaskInfo{ Name: proto.String(taskName), TaskId: taskId, SlaveId: offer.GetSlaveId(), Executor: s.createExecutor(offer.GetHostname()), Resources: []*mesos.Resource{ util.NewScalarResource("cpus", Config.Cpus), util.NewScalarResource("mem", Config.Mem), }, Data: data, Labels: utils.StringToLabels(s.labels), } s.cluster.Add(offer.GetHostname(), task) driver.LaunchTasks([]*mesos.OfferID{offer.GetId()}, []*mesos.TaskInfo{task}, &mesos.Filters{RefuseSeconds: proto.Float64(1)}) }
func (s *Scheduler) Start() error { Logger.Infof("Starting scheduler with configuration: \n%s", Config) sched = s // set this scheduler reachable for http server ctrlc := make(chan os.Signal, 1) signal.Notify(ctrlc, os.Interrupt) if err := s.resolveDeps(); err != nil { return err } listenAddr := s.listenAddr() s.httpServer = NewHttpServer(listenAddr) go s.httpServer.Start() s.cluster = NewCluster() s.labels = os.Getenv("STACK_LABELS") frameworkInfo := &mesos.FrameworkInfo{ User: proto.String(Config.User), Name: proto.String(Config.FrameworkName), Role: proto.String(Config.FrameworkRole), Checkpoint: proto.Bool(true), Labels: utils.StringToLabels(s.labels), } driverConfig := scheduler.DriverConfig{ Scheduler: s, Framework: frameworkInfo, Master: Config.Master, } driver, err := scheduler.NewMesosSchedulerDriver(driverConfig) go func() { <-ctrlc s.Shutdown(driver) }() if err != nil { return fmt.Errorf("Unable to create SchedulerDriver: %s", err) } if stat, err := driver.Run(); err != nil { Logger.Infof("Framework stopped with status %s and error: %s\n", stat.String(), err) return err } //TODO stop http server return nil }