use of com.netflix.conductor.common.metadata.tasks.Task.Status in project conductor by Netflix.
the class AbstractWorkflowServiceTest method testSubWorkflowRetry.
@Test
public void testSubWorkflowRetry() {
String taskName = "junit_task_1";
TaskDef taskDef = notFoundSafeGetTaskDef(taskName);
int retryCount = notFoundSafeGetTaskDef(taskName).getRetryCount();
taskDef.setRetryCount(0);
metadataService.updateTaskDef(taskDef);
// create a workflow with sub-workflow
createSubWorkflow();
WorkflowDef found = metadataService.getWorkflowDef(WF_WITH_SUB_WF, 1);
WorkflowTask workflowTask = found.getTasks().stream().filter(t -> t.getType().equals(SUB_WORKFLOW.name())).findAny().orElse(null);
// Set subworkflow task retry count to 1.
TaskDef subWorkflowTaskDef = new TaskDef();
subWorkflowTaskDef.setRetryCount(1);
subWorkflowTaskDef.setName("test_subworkflow_task");
subWorkflowTaskDef.setOwnerEmail("test@qbc.com");
workflowTask.setTaskDefinition(subWorkflowTaskDef);
metadataService.updateWorkflowDef(found);
// start the workflow
Map<String, Object> workflowInputParams = new HashMap<>();
workflowInputParams.put("param1", "param 1");
workflowInputParams.put("param3", "param 2");
workflowInputParams.put("wfName", LINEAR_WORKFLOW_T1_T2);
String workflowId = startOrLoadWorkflowExecution(WF_WITH_SUB_WF, 1, "test", workflowInputParams, null, null);
assertNotNull(workflowId);
Workflow workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
// poll and complete first task
Task task = workflowExecutionService.poll("junit_task_5", "test");
assertNotNull(task);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
// Simulating SystemTaskWorkerCoordinator to execute async system tasks
String subWorkflowTaskId = workflow.getTaskByRefName("a2").getTaskId();
workflowExecutor.executeSystemTask(dummySubWorkflowSystemTask, subWorkflowTaskId, 1);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertNotNull(workflow.getTasks());
assertEquals(2, workflow.getTasks().size());
task = workflow.getTasks().stream().filter(t -> t.getTaskType().equals(SUB_WORKFLOW.name())).findAny().orElse(null);
assertNotNull(task);
assertNotNull(task.getOutputData());
assertNotNull("Output: " + task.getOutputData().toString() + ", status: " + task.getStatus(), task.getSubWorkflowId());
String subWorkflowId = task.getSubWorkflowId();
workflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(workflow);
assertNotNull(workflow.getTasks());
assertEquals(workflowId, workflow.getParentWorkflowId());
assertEquals(RUNNING, workflow.getStatus());
// poll and fail the first task in sub-workflow
task = workflowExecutionService.poll("junit_task_1", "test");
task.setStatus(FAILED);
workflowExecutionService.updateTask(task);
Workflow subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(WorkflowStatus.FAILED, subWorkflow.getStatus());
subWorkflowTaskId = subWorkflow.getParentWorkflowTaskId();
workflowExecutor.executeSystemTask(subworkflow, subWorkflowTaskId, 1);
// Ensure failed Subworkflow task is rescheduled.
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(RUNNING, workflow.getStatus());
task = workflow.getTasks().stream().filter(t -> t.getTaskType().equals(SUB_WORKFLOW.name())).filter(t -> t.getStatus().equals(SCHEDULED)).findAny().orElse(null);
assertNotNull(task);
subWorkflowTaskId = task.getTaskId();
workflowExecutor.executeSystemTask(subworkflow, task.getTaskId(), 1);
// Get the latest workflow and task, and then acquire latest subWorkflowId
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
task = workflow.getTasks().stream().filter(t -> t.getTaskType().equals(SUB_WORKFLOW.name())).filter(t -> t.getStatus().equals(IN_PROGRESS)).findAny().orElse(null);
assertNotNull(task);
assertNotNull("Retried task in scheduled state shouldn't have a SubworkflowId yet", task.getSubWorkflowId());
subWorkflowId = task.getSubWorkflowId();
// poll and fail the first task in sub-workflow
task = workflowExecutionService.poll("junit_task_1", "test");
task.setStatus(FAILED);
workflowExecutionService.updateTask(task);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(WorkflowStatus.FAILED, workflow.getStatus());
// Retry the failed sub workflow
workflowExecutor.retry(subWorkflowId, false);
task = workflowExecutionService.poll("junit_task_1", "test");
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(RUNNING, subWorkflow.getStatus());
task = workflowExecutionService.poll("junit_task_2", "test");
assertEquals(subWorkflowId, task.getWorkflowInstanceId());
String uuid = UUID.randomUUID().toString();
task.getOutputData().put("uuid", uuid);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(WorkflowStatus.COMPLETED, subWorkflow.getStatus());
assertNotNull(subWorkflow.getOutput());
assertTrue(subWorkflow.getOutput().containsKey("o1"));
assertTrue(subWorkflow.getOutput().containsKey("o2"));
assertEquals("sub workflow input param1", subWorkflow.getOutput().get("o1"));
assertEquals(uuid, subWorkflow.getOutput().get("o2"));
// Simulating SystemTaskWorkerCoordinator
workflowExecutor.executeSystemTask(subworkflow, subWorkflow.getParentWorkflowTaskId(), 1);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(RUNNING, workflow.getStatus());
task = workflowExecutionService.poll("junit_task_6", "test");
assertNotNull(task);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(WorkflowStatus.COMPLETED, workflow.getStatus());
// reset retry count
taskDef = notFoundSafeGetTaskDef(taskName);
taskDef.setRetryCount(retryCount);
metadataService.updateTaskDef(taskDef);
workflowTask = found.getTasks().stream().filter(t -> t.getType().equals(SUB_WORKFLOW.name())).findAny().orElse(null);
workflowTask.setTaskDefinition(null);
metadataService.updateWorkflowDef(found);
}
use of com.netflix.conductor.common.metadata.tasks.Task.Status in project conductor by Netflix.
the class AbstractWorkflowServiceTest method testSubWorkflowRetryLastFailedTask.
@Test
public void testSubWorkflowRetryLastFailedTask() {
String taskName = "junit_task_2";
TaskDef taskDef = notFoundSafeGetTaskDef(taskName);
int retryCount = notFoundSafeGetTaskDef(taskName).getRetryCount();
taskDef.setRetryCount(0);
metadataService.updateTaskDef(taskDef);
createSubWorkflow();
WorkflowDef found = metadataService.getWorkflowDef(WF_WITH_SUB_WF, 1);
WorkflowTask workflowTask = found.getTasks().stream().filter(t -> t.getType().equals(SUB_WORKFLOW.name())).findAny().orElse(null);
TaskDef subWorkflowTaskDef = new TaskDef();
subWorkflowTaskDef.setRetryCount(0);
subWorkflowTaskDef.setName("test_subworkflow_task");
subWorkflowTaskDef.setOwnerEmail("test@qbc.com");
workflowTask.setTaskDefinition(subWorkflowTaskDef);
metadataService.updateWorkflowDef(found);
Map<String, Object> workflowInputParams = new HashMap<>();
workflowInputParams.put("param1", "param 1");
workflowInputParams.put("param3", "param 2");
workflowInputParams.put("wfName", LINEAR_WORKFLOW_T1_T2);
String workflowId = startOrLoadWorkflowExecution(WF_WITH_SUB_WF, 1, "test", workflowInputParams, null, null);
assertNotNull(workflowId);
Workflow workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
Task task = workflowExecutionService.poll("junit_task_5", "test");
assertNotNull(task);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
String subWorkflowTaskId = workflow.getTaskByRefName("a2").getTaskId();
workflowExecutor.executeSystemTask(dummySubWorkflowSystemTask, subWorkflowTaskId, 1);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertNotNull(workflow.getTasks());
assertEquals(2, workflow.getTasks().size());
task = workflow.getTasks().stream().filter(t -> t.getTaskType().equals(SUB_WORKFLOW.name())).findAny().orElse(null);
assertNotNull(task);
assertNotNull(task.getOutputData());
assertNotNull("Output: " + task.getOutputData().toString() + ", status: " + task.getStatus(), task.getSubWorkflowId());
String subWorkflowId = task.getSubWorkflowId();
workflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(workflow);
assertNotNull(workflow.getTasks());
assertEquals(workflowId, workflow.getParentWorkflowId());
assertEquals(RUNNING, workflow.getStatus());
task = workflowExecutionService.poll("junit_task_1", "test");
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
Workflow subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
task = workflowExecutionService.poll("junit_task_2", "test");
task.setStatus(FAILED);
workflowExecutionService.updateTask(task);
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(WorkflowStatus.FAILED, subWorkflow.getStatus());
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
task = subWorkflow.getTasks().stream().filter(t -> t.getTaskType().equals("junit_task_2")).findAny().orElse(null);
assertNotNull(task);
assertEquals(FAILED, task.getStatus());
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(WorkflowStatus.FAILED, subWorkflow.getStatus());
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(WorkflowStatus.FAILED, workflow.getStatus());
workflowExecutor.retry(workflowId, true);
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(RUNNING, subWorkflow.getStatus());
task = workflowExecutionService.poll("junit_task_2", "test");
assertEquals(subWorkflowId, task.getWorkflowInstanceId());
String uuid = UUID.randomUUID().toString();
task.getOutputData().put("uuid", uuid);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(WorkflowStatus.COMPLETED, subWorkflow.getStatus());
assertNotNull(subWorkflow.getOutput());
assertTrue(subWorkflow.getOutput().containsKey("o1"));
assertTrue(subWorkflow.getOutput().containsKey("o2"));
assertEquals("sub workflow input param1", subWorkflow.getOutput().get("o1"));
assertEquals(uuid, subWorkflow.getOutput().get("o2"));
workflowExecutor.executeSystemTask(subworkflow, subWorkflow.getParentWorkflowTaskId(), 1);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(RUNNING, workflow.getStatus());
task = workflowExecutionService.poll("junit_task_6", "test");
assertNotNull(task);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(WorkflowStatus.COMPLETED, workflow.getStatus());
taskDef = notFoundSafeGetTaskDef(taskName);
taskDef.setRetryCount(retryCount);
metadataService.updateTaskDef(taskDef);
workflowTask = found.getTasks().stream().filter(t -> t.getType().equals(SUB_WORKFLOW.name())).findAny().orElse(null);
workflowTask.setTaskDefinition(null);
metadataService.updateWorkflowDef(found);
}
use of com.netflix.conductor.common.metadata.tasks.Task.Status in project conductor by Netflix.
the class DoWhile method execute.
@Override
@SuppressWarnings("unchecked")
public boolean execute(Workflow workflow, Task task, WorkflowExecutor workflowExecutor) {
boolean allDone = true;
boolean hasFailures = false;
StringBuilder failureReason = new StringBuilder();
Map<String, Object> output = new HashMap<>();
task.getOutputData().put("iteration", task.getIteration());
/*
* Get the latest set of tasks (the ones that have the highest retry count). We don't want to evaluate any tasks
* that have already failed if there is a more current one (a later retry count).
*/
Map<String, Task> relevantTasks = new LinkedHashMap<String, Task>();
Task relevantTask = null;
for (Task t : workflow.getTasks()) {
if (task.getWorkflowTask().has(TaskUtils.removeIterationFromTaskRefName(t.getReferenceTaskName())) && !task.getReferenceTaskName().equals(t.getReferenceTaskName())) {
relevantTask = relevantTasks.get(t.getReferenceTaskName());
if (relevantTask == null || t.getRetryCount() > relevantTask.getRetryCount()) {
relevantTasks.put(t.getReferenceTaskName(), t);
}
}
}
Collection<Task> loopOver = relevantTasks.values();
for (Task loopOverTask : loopOver) {
Status taskStatus = loopOverTask.getStatus();
hasFailures = !taskStatus.isSuccessful();
if (hasFailures) {
failureReason.append(loopOverTask.getReasonForIncompletion()).append(" ");
}
output.put(TaskUtils.removeIterationFromTaskRefName(loopOverTask.getReferenceTaskName()), loopOverTask.getOutputData());
allDone = taskStatus.isTerminal();
if (!allDone || hasFailures) {
break;
}
}
task.getOutputData().put(String.valueOf(task.getIteration()), output);
if (hasFailures) {
logger.debug("taskid {} failed in {} iteration", task.getTaskId(), task.getIteration() + 1);
return updateLoopTask(task, Status.FAILED, failureReason.toString());
} else if (!allDone) {
return false;
}
boolean shouldContinue;
try {
shouldContinue = getEvaluatedCondition(workflow, task, workflowExecutor);
logger.debug("taskid {} condition evaluated to {}", task.getTaskId(), shouldContinue);
if (shouldContinue) {
task.setIteration(task.getIteration() + 1);
return scheduleNextIteration(task, workflow, workflowExecutor);
} else {
logger.debug("taskid {} took {} iterations to complete", task.getTaskId(), task.getIteration() + 1);
return markLoopTaskSuccess(task);
}
} catch (ScriptException e) {
String message = String.format("Unable to evaluate condition %s , exception %s", task.getWorkflowTask().getLoopCondition(), e.getMessage());
logger.error(message);
logger.error("Marking task {} failed with error.", task.getTaskId());
return updateLoopTask(task, Status.FAILED_WITH_TERMINAL_ERROR, message);
}
}
use of com.netflix.conductor.common.metadata.tasks.Task.Status in project conductor by Netflix.
the class AbstractWorkflowServiceTest method testSubWorkflowTaskToDomain.
@Test
public void testSubWorkflowTaskToDomain() {
Map<String, String> taskToDomain = new HashMap<>();
taskToDomain.put("junit_task_1", "unittest1");
taskToDomain.put("junit_task_2", "unittest2");
createSubWorkflow(taskToDomain);
metadataService.getWorkflowDef(WF_WITH_SUB_WF, 1);
Map<String, Object> input = new HashMap<>();
input.put("param1", "param 1 value");
input.put("param3", "param 2 value");
input.put("wfName", LINEAR_WORKFLOW_T1_T2);
String workflowId = startOrLoadWorkflowExecution(WF_WITH_SUB_WF, 1, "test", input, null, null);
assertNotNull(workflowId);
Workflow workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
Task task = workflowExecutionService.poll("junit_task_5", "test");
assertNotNull(task);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertNotNull(workflow.getTasks());
// Simulating SystemTaskWorkerCoordinator to execute async system tasks
String subWorkflowTaskId = workflow.getTaskByRefName("a2").getTaskId();
workflowExecutor.executeSystemTask(dummySubWorkflowSystemTask, subWorkflowTaskId, 1);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
task = workflow.getTasks().stream().filter(t -> t.getTaskType().equals(SUB_WORKFLOW.name())).findAny().get();
assertNotNull(task);
assertNotNull(task.getOutputData());
assertNotNull("Output: " + task.getOutputData().toString() + ", status: " + task.getStatus(), task.getSubWorkflowId());
assertNotNull(task.getInputData());
assertTrue(task.getInputData().containsKey("workflowInput"));
assertEquals(42, ((Map<String, Object>) task.getInputData().get("workflowInput")).get("param2"));
String subWorkflowId = task.getSubWorkflowId();
Workflow subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertNotNull(subWorkflow.getTasks());
assertEquals(workflowId, subWorkflow.getParentWorkflowId());
assertEquals(RUNNING, subWorkflow.getStatus());
task = workflowExecutionService.poll("junit_task_1", "test", "unittest1");
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
task = workflowExecutionService.poll("junit_task_2", "test", "unittest2");
assertEquals(subWorkflowId, task.getWorkflowInstanceId());
String uuid = UUID.randomUUID().toString();
task.getOutputData().put("uuid", uuid);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
subWorkflow = workflowExecutionService.getExecutionStatus(subWorkflowId, true);
assertNotNull(subWorkflow);
assertEquals(WorkflowStatus.COMPLETED, subWorkflow.getStatus());
assertNotNull(subWorkflow.getOutput());
assertTrue(subWorkflow.getOutput().containsKey("o1"));
assertTrue(subWorkflow.getOutput().containsKey("o2"));
assertEquals("sub workflow input param1", subWorkflow.getOutput().get("o1"));
assertEquals(uuid, subWorkflow.getOutput().get("o2"));
assertEquals(taskToDomain, subWorkflow.getTaskToDomain());
// Execute again to re-evaluate the Subworkflow task.
workflowExecutor.executeSystemTask(dummySubWorkflowSystemTask, subWorkflowTaskId, 1);
task = workflowExecutionService.poll("junit_task_6", "test");
assertNotNull(task);
task.setStatus(COMPLETED);
workflowExecutionService.updateTask(task);
workflow = workflowExecutionService.getExecutionStatus(workflowId, true);
assertNotNull(workflow);
assertEquals(WorkflowStatus.COMPLETED, workflow.getStatus());
}
Aggregations