func (c *config) Read(task *mesos.TaskInfo) { config := new(config) Logger.Debugf("Task data: %s", string(task.GetData())) err := json.Unmarshal(task.GetData(), config) if err != nil { Logger.Critical(err) os.Exit(1) } *c = *config }
// LaunchTask is called when the executor receives a request to launch a task. // The happens when the k8sm scheduler has decided to schedule the pod // (which corresponds to a Mesos Task) onto the node where this executor // is running, but the binding is not recorded in the Kubernetes store yet. // This function is invoked to tell the executor to record the binding in the // Kubernetes store and start the pod via the Kubelet. func (k *Executor) LaunchTask(driver bindings.ExecutorDriver, taskInfo *mesos.TaskInfo) { if k.isDone() { return } log.Infof("Launch task %v\n", taskInfo) if !k.isConnected() { log.Errorf("Ignore launch task because the executor is disconnected\n") k.sendStatus(driver, newStatus(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, messages.ExecutorUnregistered)) return } obj, err := api.Codec.Decode(taskInfo.GetData()) if err != nil { log.Errorf("failed to extract yaml data from the taskInfo.data %v", err) k.sendStatus(driver, newStatus(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, messages.UnmarshalTaskDataFailure)) return } pod, ok := obj.(*api.Pod) if !ok { log.Errorf("expected *api.Pod instead of %T: %+v", pod, pod) k.sendStatus(driver, newStatus(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, messages.UnmarshalTaskDataFailure)) return } taskId := taskInfo.GetTaskId().GetValue() k.lock.Lock() defer k.lock.Unlock() if _, found := k.tasks[taskId]; found { log.Errorf("task already launched\n") // Not to send back TASK_RUNNING here, because // may be duplicated messages or duplicated task id. return } // remember this task so that: // (a) we ignore future launches for it // (b) we have a record of it so that we can kill it if needed // (c) we're leaving podName == "" for now, indicates we don't need to delete containers k.tasks[taskId] = &kuberTask{ mesosTaskInfo: taskInfo, launchTimer: time.NewTimer(k.launchGracePeriod), } k.resetSuicideWatch(driver) go k.launchTask(driver, taskId, pod) }
// LaunchTask is called when the executor receives a request to launch a task. // The happens when the k8sm scheduler has decided to schedule the pod // (which corresponds to a Mesos Task) onto the node where this executor // is running, but the binding is not recorded in the Kubernetes store yet. // This function is invoked to tell the executor to record the binding in the // Kubernetes store and start the pod via the Kubelet. func (k *Executor) LaunchTask(driver bindings.ExecutorDriver, taskInfo *mesos.TaskInfo) { if k.isDone() { return } log.Infof("Launch task %v\n", taskInfo) taskID := taskInfo.GetTaskId().GetValue() if p := k.registry.pod(taskID); p != nil { log.Warningf("task %v already launched", taskID) // Not to send back TASK_RUNNING or TASK_FAILED here, because // may be duplicated messages return } if !k.isConnected() { log.Errorf("Ignore launch task because the executor is disconnected\n") k.sendStatus(driver, newStatus(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, messages.ExecutorUnregistered)) return } obj, err := kruntime.Decode(api.Codecs.UniversalDecoder(), taskInfo.GetData()) if err != nil { log.Errorf("failed to extract yaml data from the taskInfo.data %v", err) k.sendStatus(driver, newStatus(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, messages.UnmarshalTaskDataFailure)) return } pod, ok := obj.(*api.Pod) if !ok { log.Errorf("expected *api.Pod instead of %T: %+v", pod, pod) k.sendStatus(driver, newStatus(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, messages.UnmarshalTaskDataFailure)) return } k.resetSuicideWatch(driver) // run the next step aync because it calls out to apiserver and we don't want to block here go k.bindAndWatchTask(driver, taskInfo, time.NewTimer(k.launchGracePeriod), pod) }
// LaunchTask called when executor launch tasks func (runner *TaskRunner) LaunchTask(driver executor.ExecutorDriver, taskInfo *mesosproto.TaskInfo) { fmt.Printf("Launching task %v with ID %v\n", taskInfo.GetName(), taskInfo.GetTaskId().GetValue()) status := &mesosproto.TaskStatus{ TaskId: taskInfo.GetTaskId(), State: mesosproto.TaskState_TASK_RUNNING.Enum(), } _, err := driver.SendStatusUpdate(status) if err != nil { fmt.Println("Send task running status error: ", err) } // TODO run job fmt.Println(taskInfo.GetData()) fmt.Println("Task finished", taskInfo.GetName()) status.State = mesosproto.TaskState_TASK_FINISHED.Enum() _, err = driver.SendStatusUpdate(status) if err != nil { fmt.Println("Send task finished status error: ", err) } }
func (e *MirrorMakerExecutor) LaunchTask(driver executor.ExecutorDriver, task *mesos.TaskInfo) { Logger.Infof("[LaunchTask] %s", task) err := json.Unmarshal(task.GetData(), &e.config) if err != nil { Logger.Errorf("Could not unmarshal json data: %s", err) panic(err) } Logger.Info(e.config) runStatus := &mesos.TaskStatus{ TaskId: task.GetTaskId(), State: mesos.TaskState_TASK_RUNNING.Enum(), } if _, err := driver.SendStatusUpdate(runStatus); err != nil { Logger.Errorf("Failed to send status update: %s", runStatus) os.Exit(1) //TODO not sure if we should exit in this case, but probably yes } go func() { e.startMirrorMaker() // finish task Logger.Infof("Finishing task %s", task.GetName()) finStatus := &mesos.TaskStatus{ TaskId: task.GetTaskId(), State: mesos.TaskState_TASK_FINISHED.Enum(), } if _, err := driver.SendStatusUpdate(finStatus); err != nil { Logger.Errorf("Failed to send status update: %s", finStatus) os.Exit(1) } Logger.Infof("Task %s has finished", task.GetName()) }() }
func (exec *exampleExecutor) LaunchTask(driver exec.ExecutorDriver, taskInfo *mesos.TaskInfo) { // * // Describes a task. Passed from the scheduler all the way to an // executor (see SchedulerDriver::launchTasks and // Executor::launchTask). Either ExecutorInfo or CommandInfo should be set. // A different executor can be used to launch this task, and subsequent tasks // meant for the same executor can reuse the same ExecutorInfo struct. // type TaskInfo struct { // // TaskInfoではExecutor か Commandを設定しないといけない。 // example実装だとExecutorが設定されているがValueがうまく渡っていないように見える // Executorの中のCommandInfoに入っていた // fmt.Println("<------------------ Executor start ------------------>") // https://github.com/mesos/mesos-go/blob/master/mesosproto/mesos.pb.go // type CommandInfoあたり // fmt.Println("Launching task", taskInfo.GetName(), "with command", taskInfo.Command.GetUris()) // fmt.Println("Launching task", taskInfo.GetName(), "with command", taskInfo.Command.GetValue()) // fmt.Println("Launching task", taskInfo.GetName(), "with command", taskInfo.Command.GetShell()) // ExecutorInfo cmd := taskInfo.Executor.GetCommand() fmt.Println("Launching task", taskInfo.GetName(), "with command[GetUris]", cmd.GetUris()) fmt.Println("Launching task", taskInfo.GetName(), "with command[GetValue]", cmd.GetValue()) fmt.Println("Launching task", taskInfo.GetName(), "with command[GetShell]", cmd.GetShell()) fmt.Println("Launching task", taskInfo.GetName(), "with command[GetArguments]", cmd.GetArguments()) fmt.Println("Launching task", taskInfo.GetName(), "with taskInfo.GetData()", string(taskInfo.GetData())) execcmd := string(taskInfo.GetData()) fmt.Printf("execcmd = %s\n", execcmd) runStatus := &mesos.TaskStatus{ TaskId: taskInfo.GetTaskId(), State: mesos.TaskState_TASK_RUNNING.Enum(), } _, err := driver.SendStatusUpdate(runStatus) if err != nil { fmt.Println("Got error", err) } exec.tasksLaunched++ fmt.Println("Total tasks launched ", exec.tasksLaunched) // // this is where one would perform the requested task // output, err := osexec.Command("sh", "-c", execcmd).Output() if err != nil { fmt.Println("Command exec error", err) } fmt.Println("Exec output>") fmt.Println(string(output)) // // this is where one would perform the requested task // // finish task fmt.Println("Finishing task", taskInfo.GetName()) finStatus := &mesos.TaskStatus{ TaskId: taskInfo.GetTaskId(), State: mesos.TaskState_TASK_FINISHED.Enum(), } _, err = driver.SendStatusUpdate(finStatus) if err != nil { fmt.Println("Got error", err) } fmt.Println("Task finished", taskInfo.GetName()) fmt.Println("<------------------ Executor finish ------------------>\n") }