Skip to content

Commit adee537

Browse files
authored
[Fix-16900][api] fix when the copied workflow, the logical node switch loses the flow relationship (#16911)
1 parent 47d0f22 commit adee537

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
import org.apache.dolphinscheduler.plugin.task.api.model.Property;
118118
import org.apache.dolphinscheduler.plugin.task.api.parameters.DependentParameters;
119119
import org.apache.dolphinscheduler.plugin.task.api.parameters.SqlParameters;
120+
import org.apache.dolphinscheduler.plugin.task.api.parameters.SwitchParameters;
120121
import org.apache.dolphinscheduler.plugin.task.api.utils.TaskTypeUtils;
121122
import org.apache.dolphinscheduler.service.model.TaskNode;
122123
import org.apache.dolphinscheduler.service.process.ProcessService;
@@ -2122,6 +2123,24 @@ protected void doBatchOperateWorkflowDefinition(User loginUser,
21222123
long taskCode = CodeGenerateUtils.genCode();
21232124
taskCodeMap.put(taskDefinitionLog.getCode(), taskCode);
21242125
taskDefinitionLog.setCode(taskCode);
2126+
if (TaskTypeUtils.isSwitchTask(taskDefinitionLog.getTaskType())) {
2127+
final String taskParams = taskDefinitionLog.getTaskParams();
2128+
final SwitchParameters switchParameters =
2129+
JSONUtils.parseObject(taskParams, SwitchParameters.class);
2130+
if (switchParameters == null) {
2131+
throw new IllegalArgumentException(
2132+
"Switch task params: " + taskParams + " is invalid.");
2133+
}
2134+
SwitchParameters.SwitchResult switchResult = switchParameters.getSwitchResult();
2135+
switchResult.getDependTaskList().forEach(switchResultVo -> {
2136+
switchResultVo.setNextNode(taskCodeMap.get(switchResultVo.getNextNode()));
2137+
});
2138+
if (switchResult.getNextNode() != null) {
2139+
switchResult.setNextNode(
2140+
taskCodeMap.get(switchResult.getNextNode()));
2141+
}
2142+
taskDefinitionLog.setTaskParams(JSONUtils.toJsonString(switchParameters));
2143+
}
21252144
} catch (CodeGenerateException e) {
21262145
log.error("Generate task definition code error, projectCode:{}.", targetProjectCode, e);
21272146
putMsg(result, Status.INTERNAL_SERVER_ERROR_ARGS);

dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,85 @@ public void before() {
207207
user = loginUser;
208208
}
209209

210+
@Test()
211+
public void testCopyworkflowLogicalNodeSwitch() {
212+
long projectCode = 128645169571296L;
213+
String codes = "128645230604768";
214+
long targetProjectCode = 128645169571296L;
215+
long shellTaskDefinitionCode = 128645175846368L;
216+
long switchTaskDefinitionCode = 128645191546336L;
217+
218+
Map<String, Object> result = new HashMap<>();
219+
putMsg(result, Status.SUCCESS);
220+
221+
Set<Long> definitionCodes = new HashSet<>();
222+
for (String code : String.valueOf(codes).split(Constants.COMMA)) {
223+
try {
224+
long parse = Long.parseLong(code);
225+
definitionCodes.add(parse);
226+
} catch (NumberFormatException e) {
227+
Assertions.fail();
228+
}
229+
}
230+
231+
WorkflowDefinition workflowDefinition = new WorkflowDefinition();
232+
workflowDefinition.setId(1);
233+
workflowDefinition.setCode(Long.parseLong(codes));
234+
workflowDefinition.setName("workflow_switch");
235+
workflowDefinition.setDescription("");
236+
workflowDefinition.setVersion(1);
237+
workflowDefinition.setReleaseState(ReleaseState.OFFLINE);
238+
workflowDefinition.setProjectCode(projectCode);
239+
workflowDefinition.setUserId(user.getId());
240+
List<WorkflowDefinition> workflowDefinitionList = new ArrayList<>();
241+
workflowDefinitionList.add(workflowDefinition);
242+
243+
Project project = new Project();
244+
project.setCode(projectCode);
245+
project.setId(1);
246+
project.setName("project_switch");
247+
project.setUserId(user.getId());
248+
249+
List<WorkflowTaskRelation> workflowTaskRelations = new ArrayList<>();
250+
WorkflowTaskRelation workflowTaskRelationShell = getWorkflowTaskRelation(1, 1, projectCode,
251+
workflowDefinition.getCode(), 0L, 1, switchTaskDefinitionCode, 1);
252+
WorkflowTaskRelation workflowTaskRelationSwitch = getWorkflowTaskRelation(2, 1, projectCode,
253+
workflowDefinition.getCode(), switchTaskDefinitionCode, 1, shellTaskDefinitionCode, 1);
254+
255+
workflowTaskRelations.add(workflowTaskRelationShell);
256+
workflowTaskRelations.add(workflowTaskRelationSwitch);
257+
258+
String taskDefinitionLogJson =
259+
"[{\"id\":1,\"code\":128645175846368,\"name\":\"shellA\",\"version\":1,\"description\":\"\",\"projectCode\":128645169571296,\"userId\":1,\"taskType\":\"SHELL\","
260+
+
261+
"\"taskParams\":{\"localParams\":[],\"rawScript\":\"echo 'A'\",\"resourceList\":[]},\"flag\":\"YES\",\"taskPriority\":\"MEDIUM\",\"workerGroup\":\"default\",\"environmentCode\":-1,"
262+
+
263+
"\"failRetryTimes\":0,\"failRetryInterval\":1,\"timeoutFlag\":\"CLOSE\",\"timeout\":0,\"delayTime\":0,\"createTime\":\"2024-12-25 01:15:08\",\"updateTime\":\"2024-12-25 01:15:08\","
264+
+
265+
"\"taskGroupId\":0,\"taskGroupPriority\":0,\"cpuQuota\":-1,\"memoryMax\":-1,\"taskExecuteType\":\"BATCH\"},{\"id\":2,\"code\":128645191546336,\"name\":\"switchA\",\"version\":1,"
266+
+
267+
"\"description\":\"\",\"projectCode\":128645169571296,\"userId\":1,\"taskType\":\"SWITCH\"," +
268+
"\"taskParams\":{\"localParams\":[],\"rawScript\":\"\",\"resourceList\":[],\"switchResult\":{\"dependTaskList\":[{\"condition\":\"${value} == 'A'\",\"nextNode\":128645175846368}],"
269+
+
270+
"\"nextNode\":128645175846368}},\"flag\":\"YES\",\"taskPriority\":\"MEDIUM\",\"workerGroup\":\"default\",\"environmentCode\":-1,\"failRetryTimes\":0,\"failRetryInterval\":1,\"timeoutFlag\":\"CLOSE\","
271+
+
272+
"\"timeout\":0,\"delayTime\":0,\"createTime\":\"2024-12-25 01:15:08\",\"updateTime\":\"2024-12-25 01:15:08\",\"taskGroupId\":0,\"taskGroupPriority\":0,\"cpuQuota\":-1,\"memoryMax\":-1,\"taskExecuteType\":\"BATCH\"}]";
273+
274+
List<TaskDefinitionLog> taskDefinitionLogs = JSONUtils.toList(taskDefinitionLogJson, TaskDefinitionLog.class);
275+
276+
when(projectMapper.queryByCode(projectCode)).thenReturn(project);
277+
when(projectService.checkProjectAndAuth(user, project, projectCode, WORKFLOW_BATCH_COPY)).thenReturn(result);
278+
when(workflowDefinitionMapper.queryByCodes(definitionCodes)).thenReturn(workflowDefinitionList);
279+
when(workflowTaskRelationMapper.queryByWorkflowDefinitionCode(Long.parseLong(codes)))
280+
.thenReturn(workflowTaskRelations);
281+
when(taskDefinitionLogDao.queryTaskDefineLogList(workflowTaskRelations)).thenReturn(taskDefinitionLogs);
282+
when(processService.saveTaskDefine(user, projectCode, taskDefinitionLogs, true)).thenReturn(1);
283+
when(processService.saveWorkflowDefine(user, workflowDefinition, true, true)).thenReturn(1);
284+
Map<String, Object> successRes =
285+
processDefinitionService.batchCopyWorkflowDefinition(user, projectCode, codes, targetProjectCode);
286+
Assertions.assertEquals(Status.SUCCESS, successRes.get(Constants.STATUS));
287+
288+
}
210289
@Test
211290
public void testQueryWorkflowDefinitionList() {
212291
when(projectMapper.queryByCode(projectCode)).thenReturn(getProject(projectCode));
@@ -1122,6 +1201,22 @@ private List<WorkflowTaskRelation> getProcessTaskRelation() {
11221201
return workflowTaskRelations;
11231202
}
11241203

1204+
private WorkflowTaskRelation getWorkflowTaskRelation(int id, int workflowDefinitionVersion, long projectCode,
1205+
long workflowDefinitionCode, long preTaskCode,
1206+
int preTaskVersion,
1207+
long postTaskCode, int postTaskVersion) {
1208+
WorkflowTaskRelation workflowTaskRelation = new WorkflowTaskRelation();
1209+
workflowTaskRelation.setId(id);
1210+
workflowTaskRelation.setWorkflowDefinitionVersion(workflowDefinitionVersion);
1211+
workflowTaskRelation.setProjectCode(projectCode);
1212+
workflowTaskRelation.setWorkflowDefinitionCode(workflowDefinitionCode);
1213+
workflowTaskRelation.setPreTaskCode(preTaskCode);
1214+
workflowTaskRelation.setPreTaskVersion(preTaskVersion);
1215+
workflowTaskRelation.setPostTaskCode(postTaskCode);
1216+
workflowTaskRelation.setPostTaskVersion(postTaskVersion);
1217+
return workflowTaskRelation;
1218+
}
1219+
11251220
/**
11261221
* get mock schedule
11271222
*

0 commit comments

Comments
 (0)