This is an automated email from the ASF dual-hosted git repository.
zihaoxiang pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 7022d56e4b [Fix-18132][API] Sync workflow definition version back
after create/update (#18133)
7022d56e4b is described below
commit 7022d56e4be2fb6bf7dce7f3ef5e9f490bbb1f14
Author: Molin Wang <[email protected]>
AuthorDate: Fri Apr 3 14:35:53 2026 +0800
[Fix-18132][API] Sync workflow definition version back after create/update
(#18133)
---
.../impl/WorkflowDefinitionServiceImpl.java | 2 +
.../api/service/WorkflowDefinitionServiceTest.java | 63 ++++++++++++++++++++++
2 files changed, 65 insertions(+)
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 1c7e8a87fb..2085948e28 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 @@ public class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
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 @@ public class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
"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 43a7ab11b2..f8c59bf7b3 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.assertThat;
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.ConditionDependentTaskM
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 class WorkflowDefinitionServiceTest extends
BaseServiceTestTool {
}
}
+ @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<String, Object> 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<String, Object> 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 @@ public class WorkflowDefinitionServiceTest extends
BaseServiceTestTool {
return workflowTaskRelation;
}
+ private List<TaskNode> 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
*