/** * This method is used to get the List of dynamic workflow tasks and their input based on the {@link WorkflowTask#getDynamicForkTasksParam()} * * @param taskToSchedule: The Task of type FORK_JOIN_DYNAMIC that needs to scheduled, which has the input parameters * @param workflowInstance: The instance of the {@link Workflow} which represents the workflow being executed. * @param dynamicForkTaskParam: The key representing the dynamic fork join json payload which is available in {@link WorkflowTask#getInputParameters()} * @throws TerminateWorkflowException : In case of input parameters of the dynamic fork tasks not represented as {@link Map} * @return a {@link Pair} representing the list of dynamic fork tasks in {@link Pair#getLeft()} and the input for the dynamic fork tasks in {@link Pair#getRight()} */ @SuppressWarnings("unchecked") @VisibleForTesting Pair<List<WorkflowTask>, Map<String, Map<String, Object>>> getDynamicForkTasksAndInput(WorkflowTask taskToSchedule, Workflow workflowInstance, String dynamicForkTaskParam) throws TerminateWorkflowException { Map<String, Object> input = parametersUtils.getTaskInput(taskToSchedule.getInputParameters(), workflowInstance, null, null); Object dynamicForkTasksJson = input.get(dynamicForkTaskParam); List<WorkflowTask> dynamicForkWorkflowTasks = objectMapper.convertValue(dynamicForkTasksJson, ListOfWorkflowTasks); for (WorkflowTask workflowTask : dynamicForkWorkflowTasks) { if (MetadataMapperService.shouldPopulateDefinition(workflowTask)) { workflowTask.setTaskDefinition(metadataDAO.getTaskDef(workflowTask.getName())); } } Object dynamicForkTasksInput = input.get(taskToSchedule.getDynamicForkTasksInputParamName()); if (!(dynamicForkTasksInput instanceof Map)) { throw new TerminateWorkflowException("Input to the dynamically forked tasks is not a map -> expecting a map of K,V but found " + dynamicForkTasksInput); } return new ImmutablePair<>(dynamicForkWorkflowTasks, (Map<String, Map<String, Object>>) dynamicForkTasksInput); }
Pair<List<WorkflowTask>, Map<String, Map<String, Object>>> getDynamicForkJoinTasksAndInput(WorkflowTask taskToSchedule, Workflow workflowInstance) throws TerminateWorkflowException { String dynamicForkJoinTaskParam = taskToSchedule.getDynamicForkJoinTasksParam(); Map<String, Object> input = parametersUtils.getTaskInput(taskToSchedule.getInputParameters(), workflowInstance, null, null); Object paramValue = input.get(dynamicForkJoinTaskParam); DynamicForkJoinTaskList dynamicForkJoinTaskList = objectMapper.convertValue(paramValue, DynamicForkJoinTaskList.class);
/** * Updates the workflow output. * * @param workflow the workflow instance * @param task if not null, the output of this task will be copied to workflow output if no output parameters are specified in the workflow defintion * if null, the output of the last task in the workflow will be copied to workflow output of no output parameters are specified in the workflow definition */ void updateWorkflowOutput(final Workflow workflow, @Nullable Task task) { List<Task> allTasks = workflow.getTasks(); if (allTasks.isEmpty()) { return; } Task last = Optional.ofNullable(task).orElse(allTasks.get(allTasks.size() - 1)); WorkflowDef workflowDef = workflow.getWorkflowDefinition(); Map<String, Object> output; if (workflowDef.getOutputParameters() != null && !workflowDef.getOutputParameters().isEmpty()) { Workflow workflowInstance = populateWorkflowAndTaskData(workflow); output = parametersUtils.getTaskInput(workflowDef.getOutputParameters(), workflowInstance, null, null); } else if (StringUtils.isNotBlank(last.getExternalOutputPayloadStoragePath())) { output = externalPayloadStorageUtils.downloadPayload(last.getExternalOutputPayloadStoragePath()); Monitors.recordExternalPayloadStorageUsage(last.getTaskDefName(), ExternalPayloadStorage.Operation.READ.toString(), ExternalPayloadStorage.PayloadType.TASK_OUTPUT.toString()); } else { output = last.getOutputData(); } workflow.setOutput(output); externalPayloadStorageUtils.verifyAndUpload(workflow, ExternalPayloadStorage.PayloadType.WORKFLOW_OUTPUT); }
public List<Task> getTasksToBeScheduled(Workflow workflow, WorkflowTask taskToSchedule, int retryCount, String retriedTaskId) { workflow = populateWorkflowAndTaskData(workflow); Map<String, Object> input = parametersUtils.getTaskInput(taskToSchedule.getInputParameters(), workflow, null, null);
@Test public void getDynamicForkJoinTasksAndInputException() { //Given WorkflowTask dynamicForkJoinToSchedule = new WorkflowTask(); dynamicForkJoinToSchedule.setType(TaskType.FORK_JOIN_DYNAMIC.name()); dynamicForkJoinToSchedule.setTaskReferenceName("dynamicfanouttask"); dynamicForkJoinToSchedule.setDynamicForkJoinTasksParam("dynamicTasks"); dynamicForkJoinToSchedule.getInputParameters().put("dynamicTasks", "dt1.output.dynamicTasks"); dynamicForkJoinToSchedule.getInputParameters().put("dynamicTasksInput", "dt1.output.dynamicTasksInput"); DynamicForkJoinTaskList dtasks = new DynamicForkJoinTaskList(); Map<String, Object> input = new HashMap<>(); input.put("k1", "v1"); dtasks.add("junit_task_2", null, "xdt1", input); HashMap<String, Object> input2 = new HashMap<>(); input2.put("k2", "v2"); dtasks.add("junit_task_3", null, "xdt2", input2); Map<String, Object> dynamicTasksInput = new HashMap<>(); dynamicTasksInput.put("dynamicTasks", dtasks); //when when(parametersUtils.getTaskInput(anyMap(), any(Workflow.class), any(TaskDef.class), anyString())) .thenReturn(dynamicTasksInput); when(objectMapper.convertValue(anyObject(),any(Class.class))).thenReturn(null); //then expectedException.expect(TerminateWorkflowException.class); forkJoinDynamicTaskMapper.getDynamicForkJoinTasksAndInput(dynamicForkJoinToSchedule, new Workflow()); }
when(parametersUtils.getTaskInput(anyMap(), any(Workflow.class), any(TaskDef.class), anyString())) .thenReturn(dynamicTasksInput);
@Test public void getDynamicForkJoinTasksAndInput() { //Given WorkflowTask dynamicForkJoinToSchedule = new WorkflowTask(); dynamicForkJoinToSchedule.setType(TaskType.FORK_JOIN_DYNAMIC.name()); dynamicForkJoinToSchedule.setTaskReferenceName("dynamicfanouttask"); dynamicForkJoinToSchedule.setDynamicForkJoinTasksParam("dynamicTasks"); dynamicForkJoinToSchedule.getInputParameters().put("dynamicTasks", "dt1.output.dynamicTasks"); dynamicForkJoinToSchedule.getInputParameters().put("dynamicTasksInput", "dt1.output.dynamicTasksInput"); DynamicForkJoinTaskList dtasks = new DynamicForkJoinTaskList(); Map<String, Object> input = new HashMap<>(); input.put("k1", "v1"); dtasks.add("junit_task_2", null, "xdt1", input); HashMap<String, Object> input2 = new HashMap<>(); input2.put("k2", "v2"); dtasks.add("junit_task_3", null, "xdt2", input2); Map<String, Object> dynamicTasksInput = new HashMap<>(); dynamicTasksInput.put("dynamicTasks", dtasks); //when when(parametersUtils.getTaskInput(anyMap(), any(Workflow.class), any(TaskDef.class), anyString())) .thenReturn(dynamicTasksInput); when(objectMapper.convertValue(anyObject(),any(Class.class))).thenReturn(dtasks); Pair<List<WorkflowTask>, Map<String, Map<String, Object>>> dynamicForkJoinTasksAndInput = forkJoinDynamicTaskMapper.getDynamicForkJoinTasksAndInput(dynamicForkJoinToSchedule, new Workflow()); //then assertNotNull(dynamicForkJoinTasksAndInput.getLeft()); assertEquals(2,dynamicForkJoinTasksAndInput.getLeft().size()); assertEquals(2, dynamicForkJoinTasksAndInput.getRight().size()); }
@Test public void testGetTaskInputV2() { Workflow workflow = createDefaultWorkflow(); workflow.getWorkflowDefinition().setSchemaVersion(2); Map<String, Object> ip = new HashMap<>(); ip.put("workflowInputParam", "${workflow.input.requestId}"); ip.put("taskOutputParam", "${task2.output.location}"); ip.put("taskOutputParam2", "${task2.output.locationBad}"); ip.put("taskOutputParam3", "${task3.output.location}"); ip.put("constParam", "Some String value"); ip.put("nullValue", null); ip.put("task2Status", "${task2.status}"); ip.put("channelMap", "${workflow.input.channelMapping}"); Map<String, Object> taskInput = parametersUtils.getTaskInput(ip, workflow, null, null); assertNotNull(taskInput); assertTrue(taskInput.containsKey("workflowInputParam")); assertTrue(taskInput.containsKey("taskOutputParam")); assertTrue(taskInput.containsKey("taskOutputParam2")); assertTrue(taskInput.containsKey("taskOutputParam3")); assertNull(taskInput.get("taskOutputParam2")); assertNotNull(taskInput.get("channelMap")); assertEquals(5, taskInput.get("channelMap")); assertEquals("request id 001", taskInput.get("workflowInputParam")); assertEquals("http://location", taskInput.get("taskOutputParam")); assertNull(taskInput.get("taskOutputParam3")); assertNull(taskInput.get("nullValue")); assertEquals(workflow.getTasks().get(0).getStatus().name(), taskInput.get("task2Status")); //task2 and task3 are the tasks respectively }
task.getOutputData().put("isPersonActive", true); workflow.getTasks().add(task); Map<String, Object> taskInput = parametersUtils.getTaskInput(ip, workflow, null, null);
@Test public void testGetTaskInputV1() { Map<String, Object> ip = new HashMap<>(); ip.put("workflowInputParam", "workflow.input.requestId"); ip.put("taskOutputParam", "task2.output.location"); WorkflowDef def = new WorkflowDef(); def.setSchemaVersion(1); Workflow workflow = new Workflow(); workflow.setWorkflowDefinition(def); workflow.getInput().put("requestId", "request id 001"); Task task = new Task(); task.setReferenceTaskName("task2"); task.getOutputData().put("location", "http://location"); task.getOutputData().put("isPersonActive", true); workflow.getTasks().add(task); Map<String, Object> taskInput = parametersUtils.getTaskInput(ip, workflow, null, null); assertNotNull(taskInput); assertTrue(taskInput.containsKey("workflowInputParam")); assertTrue(taskInput.containsKey("taskOutputParam")); assertEquals("request id 001", taskInput.get("workflowInputParam")); assertEquals("http://location", taskInput.get("taskOutputParam")); }
dynamicTasksInput.put("dynamicTasksInput", null); when(parametersUtils.getTaskInput(anyMap(), any(Workflow.class), any(TaskDef.class), anyString())) .thenReturn(dynamicTasksInput);
@Test public void getEvaluatedCaseValue() { WorkflowTask decisionTask = new WorkflowTask(); decisionTask.setType(TaskType.DECISION.name()); decisionTask.setName("Decision"); decisionTask.setTaskReferenceName("decisionTask"); decisionTask.setInputParameters(ip1); decisionTask.setDefaultCase(Arrays.asList(task1)); decisionTask.setCaseValueParam("case"); Map<String, List<WorkflowTask>> decisionCases = new HashMap<>(); decisionCases.put("0", Arrays.asList(task2)); decisionCases.put("1", Arrays.asList(task3)); decisionTask.setDecisionCases(decisionCases); Workflow workflowInstance = new Workflow(); workflowInstance.setWorkflowDefinition(new WorkflowDef()); Map<String, Object> workflowInput = new HashMap<>(); workflowInput.put("p1", "workflow.input.param1"); workflowInput.put("p2", "workflow.input.param2"); workflowInput.put("case", "0"); workflowInstance.setInput(workflowInput); Map<String, Object> input = parametersUtils.getTaskInput(decisionTask.getInputParameters(), workflowInstance, null, null); assertEquals("0", decisionTaskMapper.getEvaluatedCaseValue(decisionTask, input)); }
taskDef.getInputTemplate().putAll(body); Map<String, Object> evaluatorInput = parametersUtils.getTaskInput(decisionTask.getInputParameters(), workflowInstance, taskDef, null);
Map<String, Object> evaluatorInput = parametersUtils.getTaskInput(decisionTask.getInputParameters(), workflowInstance, taskDef, null);
inputParams.put("env", env); Map<String, Object> taskInput = parametersUtils.getTaskInput(inputParams, workflow, null, "t1"); Task task = new Task(); task.getInputData().putAll(taskInput);
@Test public void getMappedTasks() throws Exception { ParametersUtils parametersUtils = Mockito.mock(ParametersUtils.class); EventTaskMapper eventTaskMapper = new EventTaskMapper(parametersUtils); WorkflowTask taskToBeScheduled = new WorkflowTask(); taskToBeScheduled.setSink("SQSSINK"); String taskId = IDGenerator.generate(); Map<String, Object> eventTaskInput = new HashMap<>(); eventTaskInput.put("sink","SQSSINK"); when(parametersUtils.getTaskInput(anyMap(), any(Workflow.class), any(TaskDef.class), anyString())).thenReturn(eventTaskInput); WorkflowDef wd = new WorkflowDef(); Workflow w = new Workflow(); w.setWorkflowDefinition(wd); TaskMapperContext taskMapperContext = TaskMapperContext.newBuilder() .withWorkflowDefinition(wd) .withWorkflowInstance(w) .withTaskDefinition(new TaskDef()) .withTaskToSchedule(taskToBeScheduled) .withRetryCount(0) .withTaskId(taskId) .build(); List<Task> mappedTasks = eventTaskMapper.getMappedTasks(taskMapperContext); assertEquals(1, mappedTasks.size()); Task eventTask = mappedTasks.get(0); assertEquals(taskId, eventTask.getTaskId()); }
when(parametersUtils.getTaskInput(anyMap(), any(Workflow.class), any(TaskDef.class), anyString())) .thenReturn(dynamicTasksInput);
}); Map<String, Object> input = parametersUtils.getTaskInput(taskToSchedule.getInputParameters(), workflowInstance, taskDefinition, taskMapperContext.getTaskId()); Task simpleTask = new Task(); simpleTask.setStartDelayInSeconds(taskToSchedule.getStartDelay());
taskInput.put("dynamicTaskName", "DynoTask"); when(parametersUtils.getTaskInput(anyMap(), any(Workflow.class), any(TaskDef.class), anyString())).thenReturn(taskInput);
taskToSchedule.setTaskDefinition(taskDefinition); Map<String, Object> input = parametersUtils.getTaskInput(taskToSchedule.getInputParameters(), workflowInstance, taskDefinition, taskMapperContext.getTaskId()); Task dynamicTask = new Task();