in scheduler/api/thrift/get_status.go [44:105]
func convertSagaStateToJobStatus(sagaState *s.SagaState) *scoot.JobStatus {
js := scoot.NewJobStatus()
js.ID = sagaState.SagaId()
js.Status = scoot.Status_NOT_STARTED
js.TaskStatus = make(map[string]scoot.Status)
js.TaskData = make(map[string]*scoot.RunStatus)
if job, err := domain.DeserializeJob(sagaState.Job()); err == nil {
for i := range job.Def.Tasks {
js.TaskStatus[job.Def.Tasks[i].TaskID] = scoot.Status_NOT_STARTED
}
}
// NotStarted Tasks will not have a logged value
for _, id := range sagaState.GetTaskIds() {
taskStatus := scoot.Status_NOT_STARTED
if sagaState.IsSagaAborted() {
if sagaState.IsCompTaskCompleted(id) {
taskStatus = scoot.Status_ROLLED_BACK
} else if sagaState.IsTaskStarted(id) {
taskStatus = scoot.Status_ROLLING_BACK
}
} else {
if sagaState.IsTaskCompleted(id) {
taskStatus = scoot.Status_COMPLETED
if thriftJobStatus, err := workerRunStatusToScootRunStatus(sagaState.GetEndTaskData(id)); err == nil {
js.TaskData[id] = thriftJobStatus
}
} else if sagaState.IsTaskStarted(id) {
taskStatus = scoot.Status_IN_PROGRESS
if startData := sagaState.GetStartTaskData(id); startData != nil {
if thriftJobStatus, err := workerRunStatusToScootRunStatus(startData); err == nil {
js.TaskData[id] = thriftJobStatus
}
}
}
}
js.TaskStatus[id] = taskStatus
}
// Saga Completed Successfully
if sagaState.IsSagaCompleted() && !sagaState.IsSagaAborted() {
js.Status = scoot.Status_COMPLETED
// Saga Completed Unsuccessfully was Aborted & Rolled Back
} else if sagaState.IsSagaCompleted() && sagaState.IsSagaAborted() {
js.Status = scoot.Status_ROLLED_BACK
// Saga In Progress
} else if !sagaState.IsSagaCompleted() && !sagaState.IsSagaAborted() {
js.Status = scoot.Status_IN_PROGRESS
// Saga in Progress - Aborted and Rolling Back
} else if !sagaState.IsSagaCompleted() && sagaState.IsSagaAborted() {
js.Status = scoot.Status_ROLLING_BACK
}
return js
}