func main() { driver := mesos.ExecutorDriver{ Executor: &mesos.Executor{ Registered: func( driver *mesos.ExecutorDriver, executor mesos.ExecutorInfo, framework mesos.FrameworkInfo, slave mesos.SlaveInfo) { fmt.Println("Executor registered!") }, LaunchTask: func(driver *mesos.ExecutorDriver, taskInfo mesos.TaskInfo) { fmt.Println("Launch task!") driver.SendStatusUpdate(&mesos.TaskStatus{ TaskId: taskInfo.TaskId, State: mesos.NewTaskState(mesos.TaskState_TASK_RUNNING), Message: proto.String("Go task is running!"), }) driver.SendStatusUpdate(&mesos.TaskStatus{ TaskId: taskInfo.TaskId, State: mesos.NewTaskState(mesos.TaskState_TASK_FINISHED), Message: proto.String("Go task is done!"), }) }, }, } driver.Init() defer driver.Destroy() driver.Run() }
func main() { driver := mesos.ExecutorDriver{ Executor: &mesos.Executor{ Registered: func( driver *mesos.ExecutorDriver, executor mesos.ExecutorInfo, framework mesos.FrameworkInfo, slave mesos.SlaveInfo) { fmt.Println("Angstrom executor registered!") }, LaunchTask: func(driver *mesos.ExecutorDriver, taskInfo mesos.TaskInfo) { fmt.Println("Launch sample task!") // TODO(nnielsen): Launched tasks corresponds to resource samples in round robin fashion. driver.SendStatusUpdate(&mesos.TaskStatus{ TaskId: taskInfo.TaskId, State: mesos.NewTaskState(mesos.TaskState_TASK_RUNNING), Message: proto.String("Angstrom task " + *taskInfo.TaskId.Value + " is sampling slave XXX"), }) go taskHandler(driver, taskInfo) }, }, } driver.Init() defer driver.Destroy() driver.Run() driver.Join() }
func (self *ShellExecutor) sendStatusUpdate(taskId string, state mesos.TaskState, message string) { self.driver.SendStatusUpdate(&mesos.TaskStatus{ TaskId: &mesos.TaskID{Value: &taskId}, State: mesos.NewTaskState(state), Message: proto.String(message), Data: []byte(self.pwd), //todo: using FrameworkMessage }) }
// LaunchTask is called when the executor receives a request to launch a task. func (k *KubernetesExecutor) LaunchTask(driver mesos.ExecutorDriver, taskInfo *mesos.TaskInfo) { log.Infof("Launch task %v\n", taskInfo) if !k.registered { log.Warningf("Ignore launch task because the executor is disconnected\n") k.sendStatusUpdate(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, "Executor not registered yet") return } taskId := taskInfo.GetTaskId().GetValue() if _, found := k.tasks[taskId]; found { log.Warningf("Task already launched\n") // Not to send back TASK_RUNNING here, because // may be duplicated messages or duplicated task id. return } // Get the container manifest from the taskInfo. var manifest api.ContainerManifest if err := yaml.Unmarshal(taskInfo.GetData(), &manifest); err != nil { log.Warningf("Failed to extract yaml data from the taskInfo.data %v\n", err) k.sendStatusUpdate(taskInfo.GetTaskId(), mesos.TaskState_TASK_FAILED, "Failed to extract yaml data") return } // TODO(nnielsen): Verify this assumption. Manifest ID's has been marked // to be deprecated. podID := manifest.ID // Add the task. k.tasks[taskId] = &kuberTask{ mesosTaskInfo: taskInfo, containerManifest: &manifest, } k.pods = append(k.pods, kubelet.Pod{ Name: podID, Namespace: "etcd", Manifest: manifest, }) getPidInfo := func(name string) (api.PodInfo, error) { podFullName := kubelet.GetPodFullName(&kubelet.Pod{Name: name, Namespace: "etcd"}) info, err := k.kl.GetPodInfo(podFullName) if err == kubelet.ErrNoContainersInPod { return nil, err } return info, nil } // TODO(nnielsen): Fail if container is already running. // Checkpoint pods. // Send the pod updates to the channel. // TODO(yifan): Replace SET with ADD when it's implemented. // TODO(nnielsen): Incoming launch requests end up destroying already // running pods. update := kubelet.PodUpdate{ Pods: k.pods, Op: kubelet.SET, } k.updateChan <- update // Delay reporting 'task running' until container is up. go func() { expires := time.Now().Add(launchGracePeriod) for { now := time.Now() if now.After(expires) { log.Warningf("Launch expired grace period of '%v'", launchGracePeriod) break } // We need to poll the kublet for the pod state, as // there is no existing event / push model for this. time.Sleep(containerPollTime) info, err := getPidInfo(podID) if err != nil { continue } log.V(2).Infof("Found pod info: '%v'", info) data, err := json.Marshal(info) statusUpdate := &mesos.TaskStatus{ TaskId: taskInfo.GetTaskId(), State: mesos.NewTaskState(mesos.TaskState_TASK_RUNNING), Message: proto.String("Pod '" + podID + "' is running"), Data: data, } if err := k.driver.SendStatusUpdate(statusUpdate); err != nil { log.Warningf("Failed to send status update%v, %v", err) } // TODO(nnielsen): Monitor health of container and report if lost. go func() { for { time.Sleep(containerPollTime) _, err := getPidInfo(podID) if err != nil { k.sendStatusUpdate(taskInfo.GetTaskId(), mesos.TaskState_TASK_LOST, "Task lost: container disappeared") return } } }() return } k.sendStatusUpdate(taskInfo.GetTaskId(), mesos.TaskState_TASK_LOST, "Task lost: launch failed") }() }