diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java index 1c7e8a87fb41..2085948e28f2 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java @@ -330,6 +330,7 @@ protected Map createDagDefine(User loginUser, log.info("Save workflow definition complete, workflowDefinitionCode:{}, workflowDefinitionVersion:{}.", workflowDefinition.getCode(), insertVersion); } + workflowDefinition.setVersion(insertVersion); int insertResult = processService.saveTaskRelation(loginUser, workflowDefinition.getProjectCode(), workflowDefinition.getCode(), insertVersion, taskRelationList, taskDefinitionLogs, Boolean.TRUE); @@ -822,6 +823,7 @@ protected Map updateDagDefine(User loginUser, "Update workflow definition complete, workflowDefinitionCode:{}, workflowDefinitionVersion:{}.", workflowDefinition.getCode(), insertVersion); } + workflowDefinition.setVersion(insertVersion); taskUsedInOtherTaskValid(workflowDefinition, taskRelationList); int insertResult = processService.saveTaskRelation(loginUser, workflowDefinition.getProjectCode(), diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java index 43a7ab11b20a..f8c59bf7b321 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java @@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; @@ -78,6 +79,7 @@ import org.apache.dolphinscheduler.plugin.task.api.model.SwitchResultVo; import org.apache.dolphinscheduler.plugin.task.api.parameters.ConditionsParameters; import org.apache.dolphinscheduler.plugin.task.api.parameters.SwitchParameters; +import org.apache.dolphinscheduler.service.model.TaskNode; import org.apache.dolphinscheduler.service.process.ProcessService; import org.apache.commons.lang3.StringUtils; @@ -881,6 +883,55 @@ public void testUpdateWorkflowDefinition() { } } + @Test + public void testCreateWorkflowDefinitionShouldSyncVersionToResponse() { + Project project = getProject(projectCode); + when(projectMapper.queryByCode(projectCode)).thenReturn(project); + when(projectService.hasProjectAndWritePerm(eq(user), eq(project), any(Map.class))).thenReturn(true); + when(workflowDefinitionMapper.verifyByDefineName(projectCode, name)).thenReturn(null); + when(processService.transformTask(anyList(), anyList())).thenReturn(getTaskNodeList()); + when(processService.saveTaskDefine(eq(user), eq(projectCode), anyList(), eq(Boolean.TRUE))).thenReturn(1); + when(processService.saveWorkflowDefine(any(User.class), any(WorkflowDefinition.class), eq(Boolean.TRUE), + eq(Boolean.TRUE))).thenReturn(1); + when(processService.saveTaskRelation(eq(user), eq(projectCode), anyLong(), eq(1), anyList(), anyList(), + eq(Boolean.TRUE))).thenReturn(Constants.EXIT_CODE_SUCCESS); + + Map result = workflowDefinitionService.createWorkflowDefinition( + user, projectCode, name, description, "[]", "[]", timeout, + taskRelationJson, taskDefinitionJson, null, WorkflowExecutionTypeEnum.PARALLEL); + + Assertions.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); + WorkflowDefinition workflowDefinition = (WorkflowDefinition) result.get(Constants.DATA_LIST); + Assertions.assertEquals(1, workflowDefinition.getVersion()); + } + + @Test + public void testUpdateWorkflowDefinitionShouldSyncVersionToResponse() { + Project project = getProject(projectCode); + WorkflowDefinition workflowDefinition = getWorkflowDefinition(); + workflowDefinition.setName("origin-name"); + when(projectMapper.queryByCode(projectCode)).thenReturn(project); + when(projectService.hasProjectAndWritePerm(eq(user), eq(project), any(Map.class))).thenReturn(true); + when(processService.transformTask(anyList(), anyList())).thenReturn(getTaskNodeList()); + when(workflowDefinitionMapper.queryByCode(processDefinitionCode)).thenReturn(workflowDefinition); + when(workflowDefinitionMapper.verifyByDefineName(projectCode, name)).thenReturn(null); + when(processService.saveTaskDefine(eq(user), eq(projectCode), anyList(), eq(Boolean.TRUE))).thenReturn(1); + when(processService.saveWorkflowDefine(any(User.class), any(WorkflowDefinition.class), eq(Boolean.TRUE), + eq(Boolean.TRUE))).thenReturn(2); + when(workflowTaskRelationMapper.queryByWorkflowDefinitionCode(processDefinitionCode)) + .thenReturn(Collections.emptyList()); + when(processService.saveTaskRelation(eq(user), eq(projectCode), eq(processDefinitionCode), eq(2), anyList(), + anyList(), eq(Boolean.TRUE))).thenReturn(Constants.EXIT_CODE_SUCCESS); + + Map result = workflowDefinitionService.updateWorkflowDefinition( + user, projectCode, name, processDefinitionCode, description, "[]", "[]", timeout, + taskRelationJson, taskDefinitionJson, WorkflowExecutionTypeEnum.PARALLEL); + + Assertions.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); + WorkflowDefinition resultDefinition = (WorkflowDefinition) result.get(Constants.DATA_LIST); + Assertions.assertEquals(2, resultDefinition.getVersion()); + } + @Test public void testGetNewProcessName() { String processName1 = "test_copy_" + DateUtils.getCurrentTimeStamp(); @@ -976,6 +1027,18 @@ private WorkflowTaskRelation getWorkflowTaskRelation(int id, int workflowDefinit return workflowTaskRelation; } + private List getTaskNodeList() { + TaskNode firstTaskNode = new TaskNode(); + firstTaskNode.setCode(123456789L); + firstTaskNode.setPreTasks(JSONUtils.toJsonString(Collections.emptyList())); + + TaskNode secondTaskNode = new TaskNode(); + secondTaskNode.setCode(123451234L); + secondTaskNode.setPreTasks(JSONUtils.toJsonString(Collections.singletonList(123456789L))); + + return Arrays.asList(firstTaskNode, secondTaskNode); + } + /** * get mock schedule *