Browse Source

[Feature][JsonSplit-api] copy of processDefinition (#5740)

* select-by-code of processDefinition

* fix ut

* prcessDefinition copy

Co-authored-by: JinyLeeChina <297062848@qq.com>
2.0.7-release
JinyLeeChina 3 years ago committed by GitHub
parent
commit
c386b64500
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
  2. 28
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectController.java
  3. 4
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
  4. 8
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
  5. 219
      dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
  6. 9
      dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionControllerTest.java
  7. 272
      dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProjectControllerTest.java
  8. 32
      dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
  9. 4
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
  10. 37
      dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessDefinition.java
  11. 28
      dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java

16
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java

@ -136,14 +136,14 @@ public class ProcessDefinitionController extends BaseController {
* *
* @param loginUser login user * @param loginUser login user
* @param projectName project name * @param projectName project name
* @param processDefinitionIds process definition ids * @param processDefinitionCodes process definition codes
* @param targetProjectId target project id * @param targetProjectName target project name
* @return copy result code * @return copy result code
*/ */
@ApiOperation(value = "copyProcessDefinition", notes = "COPY_PROCESS_DEFINITION_NOTES") @ApiOperation(value = "copy", notes = "COPY_PROCESS_DEFINITION_NOTES")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "processDefinitionIds", value = "PROCESS_DEFINITION_IDS", required = true, dataType = "String", example = "3,4"), @ApiImplicitParam(name = "processDefinitionCodes", value = "PROCESS_DEFINITION_CODES", required = true, dataType = "String", example = "3,4"),
@ApiImplicitParam(name = "targetProjectId", value = "TARGET_PROJECT_ID", required = true, dataType = "Int", example = "10") @ApiImplicitParam(name = "targetProjectName", value = "TARGET_PROJECT_NAME", required = true, dataType = "String", example = "ddd")
}) })
@PostMapping(value = "/copy") @PostMapping(value = "/copy")
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
@ -151,10 +151,10 @@ public class ProcessDefinitionController extends BaseController {
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
public Result copyProcessDefinition(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, public Result copyProcessDefinition(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName,
@RequestParam(value = "processDefinitionIds", required = true) String processDefinitionIds, @RequestParam(value = "processDefinitionCodes", required = true) String processDefinitionCodes,
@RequestParam(value = "targetProjectId", required = true) int targetProjectId) { @RequestParam(value = "targetProjectName", required = true) String targetProjectName) {
return returnDataList( return returnDataList(
processDefinitionService.batchCopyProcessDefinition(loginUser, projectName, processDefinitionIds, targetProjectId)); processDefinitionService.batchCopyProcessDefinition(loginUser, projectName, processDefinitionCodes, targetProjectName));
} }
/** /**

28
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectController.java

@ -23,7 +23,7 @@ import static org.apache.dolphinscheduler.api.enums.Status.IMPORT_PROCESS_DEFINE
import static org.apache.dolphinscheduler.api.enums.Status.LOGIN_USER_QUERY_PROJECT_LIST_PAGING_ERROR; import static org.apache.dolphinscheduler.api.enums.Status.LOGIN_USER_QUERY_PROJECT_LIST_PAGING_ERROR;
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_AUTHORIZED_AND_USER_CREATED_PROJECT_ERROR; import static org.apache.dolphinscheduler.api.enums.Status.QUERY_AUTHORIZED_AND_USER_CREATED_PROJECT_ERROR;
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_AUTHORIZED_PROJECT; import static org.apache.dolphinscheduler.api.enums.Status.QUERY_AUTHORIZED_PROJECT;
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_PROJECT_DETAILS_BY_ID_ERROR; import static org.apache.dolphinscheduler.api.enums.Status.QUERY_PROJECT_DETAILS_BY_CODE_ERROR;
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_UNAUTHORIZED_PROJECT_ERROR; import static org.apache.dolphinscheduler.api.enums.Status.QUERY_UNAUTHORIZED_PROJECT_ERROR;
import static org.apache.dolphinscheduler.api.enums.Status.UPDATE_PROJECT_ERROR; import static org.apache.dolphinscheduler.api.enums.Status.UPDATE_PROJECT_ERROR;
@ -73,7 +73,7 @@ public class ProjectController extends BaseController {
/** /**
* create project * create project
* *
* @param loginUser login user * @param loginUser login user
* @param projectName project name * @param projectName project name
* @param description description * @param description description
* @return returns an error if it exists * @return returns an error if it exists
@ -97,8 +97,8 @@ public class ProjectController extends BaseController {
/** /**
* update project * update project
* *
* @param loginUser login user * @param loginUser login user
* @param projectCode project code * @param projectCode project code
* @param projectName project name * @param projectName project name
* @param description description * @param description description
* @return update result code * @return update result code
@ -136,10 +136,10 @@ public class ProjectController extends BaseController {
}) })
@GetMapping(value = "/query-by-code") @GetMapping(value = "/query-by-code")
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
@ApiException(QUERY_PROJECT_DETAILS_BY_ID_ERROR) @ApiException(QUERY_PROJECT_DETAILS_BY_CODE_ERROR)
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
public Result queryProjectById(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, public Result queryProjectByCode(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@RequestParam("projectCode") Long projectCode) { @RequestParam("projectCode") Long projectCode) {
Map<String, Object> result = projectService.queryByCode(loginUser, projectCode); Map<String, Object> result = projectService.queryByCode(loginUser, projectCode);
return returnDataList(result); return returnDataList(result);
} }
@ -149,8 +149,8 @@ public class ProjectController extends BaseController {
* *
* @param loginUser login user * @param loginUser login user
* @param searchVal search value * @param searchVal search value
* @param pageSize page size * @param pageSize page size
* @param pageNo page number * @param pageNo page number
* @return project list which the login user have permission to see * @return project list which the login user have permission to see
*/ */
@ApiOperation(value = "queryProjectListPaging", notes = "QUERY_PROJECT_LIST_PAGING_NOTES") @ApiOperation(value = "queryProjectListPaging", notes = "QUERY_PROJECT_LIST_PAGING_NOTES")
@ -201,7 +201,7 @@ public class ProjectController extends BaseController {
* query unauthorized project * query unauthorized project
* *
* @param loginUser login user * @param loginUser login user
* @param userId user id * @param userId user id
* @return the projects which user have not permission to see * @return the projects which user have not permission to see
*/ */
@ApiOperation(value = "queryUnauthorizedProject", notes = "QUERY_UNAUTHORIZED_PROJECT_NOTES") @ApiOperation(value = "queryUnauthorizedProject", notes = "QUERY_UNAUTHORIZED_PROJECT_NOTES")
@ -223,7 +223,7 @@ public class ProjectController extends BaseController {
* query authorized project * query authorized project
* *
* @param loginUser login user * @param loginUser login user
* @param userId user id * @param userId user id
* @return projects which the user have permission to see, Except for items created by this user * @return projects which the user have permission to see, Except for items created by this user
*/ */
@ApiOperation(value = "queryAuthorizedProject", notes = "QUERY_AUTHORIZED_PROJECT_NOTES") @ApiOperation(value = "queryAuthorizedProject", notes = "QUERY_AUTHORIZED_PROJECT_NOTES")
@ -259,13 +259,13 @@ public class ProjectController extends BaseController {
/** /**
* import process definition * import process definition
* *
* @param loginUser login user * @param loginUser login user
* @param file resource file * @param file resource file
* @param projectName project name * @param projectName project name
* @return import result code * @return import result code
*/ */
@ApiOperation(value = "importProcessDefinition", notes= "EXPORT_PROCESS_DEFINITION_NOTES") @ApiOperation(value = "importProcessDefinition", notes = "EXPORT_PROCESS_DEFINITION_NOTES")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "file", value = "RESOURCE_FILE", required = true, dataType = "MultipartFile") @ApiImplicitParam(name = "file", value = "RESOURCE_FILE", required = true, dataType = "MultipartFile")
}) })

4
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java

@ -74,7 +74,7 @@ public enum Status {
LIST_WORKERS_ERROR(10044, "list workers error", "查询worker列表错误"), LIST_WORKERS_ERROR(10044, "list workers error", "查询worker列表错误"),
LIST_MASTERS_ERROR(10045, "list masters error", "查询master列表错误"), LIST_MASTERS_ERROR(10045, "list masters error", "查询master列表错误"),
UPDATE_PROJECT_ERROR(10046, "update project error", "更新项目信息错误"), UPDATE_PROJECT_ERROR(10046, "update project error", "更新项目信息错误"),
QUERY_PROJECT_DETAILS_BY_ID_ERROR(10047, "query project details by id error", "查询项目详细信息错误"), QUERY_PROJECT_DETAILS_BY_CODE_ERROR(10047, "query project details by code error", "查询项目详细信息错误"),
CREATE_PROJECT_ERROR(10048, "create project error", "创建项目错误"), CREATE_PROJECT_ERROR(10048, "create project error", "创建项目错误"),
LOGIN_USER_QUERY_PROJECT_LIST_PAGING_ERROR(10049, "login user query project list paging error", "分页查询项目列表错误"), LOGIN_USER_QUERY_PROJECT_LIST_PAGING_ERROR(10049, "login user query project list paging error", "分页查询项目列表错误"),
DELETE_PROJECT_ERROR(10050, "delete project error", "删除项目错误"), DELETE_PROJECT_ERROR(10050, "delete project error", "删除项目错误"),
@ -189,7 +189,7 @@ public enum Status {
DELETE_PROCESS_DEFINITION_VERSION_ERROR(10156, "delete process definition version error", "删除工作流历史版本出错"), DELETE_PROCESS_DEFINITION_VERSION_ERROR(10156, "delete process definition version error", "删除工作流历史版本出错"),
QUERY_USER_CREATED_PROJECT_ERROR(10157, "query user created project error error", "查询用户创建的项目错误"), QUERY_USER_CREATED_PROJECT_ERROR(10157, "query user created project error error", "查询用户创建的项目错误"),
PROCESS_DEFINITION_IDS_IS_EMPTY(10158, "process definition ids is empty", "工作流IDS不能为空"), PROCESS_DEFINITION_CODES_IS_EMPTY(10158, "process definition codes is empty", "工作流CODES不能为空"),
BATCH_COPY_PROCESS_DEFINITION_ERROR(10159, "batch copy process definition error", "复制工作流错误"), BATCH_COPY_PROCESS_DEFINITION_ERROR(10159, "batch copy process definition error", "复制工作流错误"),
BATCH_MOVE_PROCESS_DEFINITION_ERROR(10160, "batch move process definition error", "移动工作流错误"), BATCH_MOVE_PROCESS_DEFINITION_ERROR(10160, "batch move process definition error", "移动工作流错误"),
QUERY_WORKFLOW_LINEAGE_ERROR(10161, "query workflow lineage error", "查询血缘失败"), QUERY_WORKFLOW_LINEAGE_ERROR(10161, "query workflow lineage error", "查询血缘失败"),

8
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java

@ -120,13 +120,13 @@ public interface ProcessDefinitionService {
* *
* @param loginUser loginUser * @param loginUser loginUser
* @param projectName projectName * @param projectName projectName
* @param processDefinitionIds processDefinitionIds * @param processDefinitionCodes processDefinitionCodes
* @param targetProjectId targetProjectId * @param targetProjectName targetProjectName
*/ */
Map<String, Object> batchCopyProcessDefinition(User loginUser, Map<String, Object> batchCopyProcessDefinition(User loginUser,
String projectName, String projectName,
String processDefinitionIds, String processDefinitionCodes,
int targetProjectId); String targetProjectName);
/** /**
* batch move process definition * batch move process definition

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

@ -67,6 +67,7 @@ import org.apache.dolphinscheduler.dao.entity.Tenant;
import org.apache.dolphinscheduler.dao.entity.User; import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionLogMapper; import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionLogMapper;
import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper; import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper;
import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationLogMapper;
import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationMapper; import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationMapper;
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper; import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper; import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
@ -107,7 +108,6 @@ import org.springframework.web.multipart.MultipartFile;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
@ -157,6 +157,9 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
@Autowired @Autowired
private ProcessTaskRelationMapper processTaskRelationMapper; private ProcessTaskRelationMapper processTaskRelationMapper;
@Autowired
private ProcessTaskRelationLogMapper processTaskRelationLogMapper;
@Autowired @Autowired
TaskDefinitionLogMapper taskDefinitionLogMapper; TaskDefinitionLogMapper taskDefinitionLogMapper;
@ -194,14 +197,11 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
String tenantCode, String tenantCode,
String taskRelationJson) { String taskRelationJson) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = checkProjectAndAuth(loginUser, projectName);
Project project = projectMapper.queryByName(projectName); if (result.get(Constants.STATUS) != Status.SUCCESS) {
// check project auth return result;
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultStatus = (Status) checkResult.get(Constants.STATUS);
if (resultStatus != Status.SUCCESS) {
return checkResult;
} }
long projectCode = (long) result.get(Constants.PROJECT_CODE);
List<ProcessTaskRelationLog> taskRelationList = JSONUtils.toList(taskRelationJson, ProcessTaskRelationLog.class); List<ProcessTaskRelationLog> taskRelationList = JSONUtils.toList(taskRelationJson, ProcessTaskRelationLog.class);
Map<String, Object> checkRelationJson = checkTaskRelationList(taskRelationList, taskRelationJson); Map<String, Object> checkRelationJson = checkTaskRelationList(taskRelationList, taskRelationJson);
@ -222,16 +222,23 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
putMsg(result, Status.CREATE_PROCESS_DEFINITION); putMsg(result, Status.CREATE_PROCESS_DEFINITION);
return result; return result;
} }
ProcessDefinition processDefinition = new ProcessDefinition(projectCode, name, processDefinitionCode, description,
globalParams, locations, connects, timeout, loginUser.getId(), tenant.getId());
int insertVersion = processService.saveProcessDefine(loginUser, project, name, description, globalParams, return createProcessDefine(loginUser, result, taskRelationList, processDefinition);
locations, connects, timeout, tenant.getId(), processDefinitionCode, 0, true); }
private Map<String, Object> createProcessDefine(User loginUser,
Map<String, Object> result,
List<ProcessTaskRelationLog> taskRelationList,
ProcessDefinition processDefinition) {
int insertVersion = processService.saveProcessDefine(loginUser, processDefinition, true);
if (insertVersion > 0) { if (insertVersion > 0) {
int insertResult = processService.saveTaskRelation(loginUser, project.getCode(), processDefinitionCode, insertVersion, taskRelationList); int insertResult = processService.saveTaskRelation(loginUser, processDefinition.getProjectCode(), processDefinition.getCode(), insertVersion, taskRelationList);
if (insertResult > 0) { if (insertResult > 0) {
putMsg(result, Status.SUCCESS); putMsg(result, Status.SUCCESS);
// return processDefinitionCode // return processDefinitionCode
result.put(Constants.DATA_LIST, processDefinitionCode); result.put(Constants.DATA_LIST, processDefinition.getCode());
} else { } else {
putMsg(result, Status.CREATE_PROCESS_DEFINITION); putMsg(result, Status.CREATE_PROCESS_DEFINITION);
} }
@ -282,17 +289,11 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
*/ */
@Override @Override
public Map<String, Object> queryProcessDefinitionList(User loginUser, String projectName) { public Map<String, Object> queryProcessDefinitionList(User loginUser, String projectName) {
Map<String, Object> result = checkProjectAndAuth(loginUser, projectName);
HashMap<String, Object> result = new HashMap<>(); if (result.get(Constants.STATUS) != Status.SUCCESS) {
Project project = projectMapper.queryByName(projectName); return result;
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultStatus = (Status) checkResult.get(Constants.STATUS);
if (resultStatus != Status.SUCCESS) {
return checkResult;
} }
List<ProcessDefinition> resourceList = processDefinitionMapper.queryAllDefinitionList((long) result.get(Constants.PROJECT_CODE));
List<ProcessDefinition> resourceList = processDefinitionMapper.queryAllDefinitionList(project.getCode());
resourceList.forEach(processDefinition -> { resourceList.forEach(processDefinition -> {
ProcessData processData = processService.genProcessData(processDefinition); ProcessData processData = processService.genProcessData(processDefinition);
@ -387,17 +388,12 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
@Override @Override
public Map<String, Object> queryProcessDefinitionByName(User loginUser, String projectName, String processDefinitionName) { public Map<String, Object> queryProcessDefinitionByName(User loginUser, String projectName, String processDefinitionName) {
Map<String, Object> result = checkProjectAndAuth(loginUser, projectName);
Map<String, Object> result = new HashMap<>(); if (result.get(Constants.STATUS) != Status.SUCCESS) {
Project project = projectMapper.queryByName(projectName); return result;
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultStatus = (Status) checkResult.get(Constants.STATUS);
if (resultStatus != Status.SUCCESS) {
return checkResult;
} }
long projectCode = (long) result.get(Constants.PROJECT_CODE);
ProcessDefinition processDefinition = processDefinitionMapper.queryByDefineName(project.getCode(), processDefinitionName); ProcessDefinition processDefinition = processDefinitionMapper.queryByDefineName(projectCode, processDefinitionName);
if (processDefinition == null) { if (processDefinition == null) {
putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processDefinitionName); putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processDefinitionName);
@ -438,14 +434,11 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
int timeout, int timeout,
String tenantCode, String tenantCode,
String taskRelationJson) { String taskRelationJson) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = checkProjectAndAuth(loginUser, projectName);
if (result.get(Constants.STATUS) != Status.SUCCESS) {
Project project = projectMapper.queryByName(projectName); return result;
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultStatus = (Status) checkResult.get(Constants.STATUS);
if (resultStatus != Status.SUCCESS) {
return checkResult;
} }
long projectCode = (long) result.get(Constants.PROJECT_CODE);
List<ProcessTaskRelationLog> taskRelationList = JSONUtils.toList(taskRelationJson, ProcessTaskRelationLog.class); List<ProcessTaskRelationLog> taskRelationList = JSONUtils.toList(taskRelationJson, ProcessTaskRelationLog.class);
Map<String, Object> checkRelationJson = checkTaskRelationList(taskRelationList, taskRelationJson); Map<String, Object> checkRelationJson = checkTaskRelationList(taskRelationList, taskRelationJson);
@ -471,10 +464,11 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
return result; return result;
} }
int insertVersion = processService.saveProcessDefine(loginUser, project, name, description, globalParams, processDefinition.set(projectCode, name, description, globalParams, locations, connects, timeout, tenant.getId());
locations, connects, timeout, tenant.getId(), code, processDefinition.getId(), true); processDefinition.setUpdateTime(new Date());
int insertVersion = processService.saveProcessDefine(loginUser, processDefinition, true);
if (insertVersion > 0) { if (insertVersion > 0) {
int insertResult = processService.saveTaskRelation(loginUser, project.getCode(), code, insertVersion, taskRelationList); int insertResult = processService.saveTaskRelation(loginUser, projectCode, code, insertVersion, taskRelationList);
if (insertResult > 0) { if (insertResult > 0) {
putMsg(result, Status.SUCCESS); putMsg(result, Status.SUCCESS);
result.put(Constants.DATA_LIST, processDefinition); result.put(Constants.DATA_LIST, processDefinition);
@ -1453,51 +1447,24 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
} }
private Map<String, Object> copyProcessDefinition(User loginUser, private Map<String, Object> copyProcessDefinition(User loginUser,
Integer processId, Long processCode,
Project targetProject) throws JsonProcessingException { long targetProjectCode) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
String currentTimeStamp = DateUtils.getCurrentTimeStamp(); ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(processCode);
ProcessDefinition processDefinition = processDefinitionMapper.selectById(processId);
if (processDefinition == null) { if (processDefinition == null) {
putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processId); putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processCode);
return result; return result;
} else { }
ProcessData processData = processService.genProcessData(processDefinition); List<ProcessTaskRelationLog> taskRelationList =
List<TaskNode> taskNodeList = processData.getTasks(); processTaskRelationLogMapper.queryByProcessCodeAndVersion(processDefinition.getCode(), processDefinition.getVersion());
String locations = processDefinition.getLocations(); if (taskRelationList.isEmpty()) {
ObjectNode locationsJN = JSONUtils.parseObject(locations); putMsg(result, Status.PROCESS_TASK_RELATION_NOT_EXIST, processCode);
for (TaskNode taskNode : taskNodeList) {
String suffix = "_copy_" + currentTimeStamp;
String id = taskNode.getId();
String newName = locationsJN.path(id).path("name").asText() + suffix;
((ObjectNode) locationsJN.get(id)).put("name", newName);
List<String> depList = taskNode.getDepList();
List<String> newDepList = depList.stream()
.map(s -> s + suffix)
.collect(Collectors.toList());
taskNode.setDepList(newDepList);
taskNode.setName(taskNode.getName() + suffix);
taskNode.setCode(0L);
}
processData.setTasks(taskNodeList);
String processDefinitionJson = JSONUtils.toJsonString(processData);
// TODO copy process
// return createProcessDefinition(
// loginUser,
// targetProject.getName(),
// processDefinition.getName() + "_copy_" + currentTimeStamp,
// processDefinitionJson,
// processDefinition.getDescription(),
// locationsJN.toString(),
// processDefinition.getConnects());
// TODO remove
return result; return result;
} }
processDefinition.setName(processDefinition.getName() + "_copy_" + DateUtils.getCurrentTimeStamp());
processDefinition.setProjectCode(targetProjectCode);
return createProcessDefine(loginUser, result, taskRelationList, processDefinition);
} }
/** /**
@ -1505,45 +1472,37 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
* *
* @param loginUser loginUser * @param loginUser loginUser
* @param projectName projectName * @param projectName projectName
* @param processDefinitionIds processDefinitionIds * @param processDefinitionCodes processDefinitionCodes
* @param targetProjectId targetProjectId * @param targetProjectName targetProjectName
*/ */
@Override @Override
public Map<String, Object> batchCopyProcessDefinition(User loginUser, public Map<String, Object> batchCopyProcessDefinition(User loginUser,
String projectName, String projectName,
String processDefinitionIds, String processDefinitionCodes,
int targetProjectId) { String targetProjectName) {
Map<String, Object> result = new HashMap<>();
List<String> failedProcessList = new ArrayList<>(); List<String> failedProcessList = new ArrayList<>();
if (StringUtils.isEmpty(processDefinitionIds)) {
putMsg(result, Status.PROCESS_DEFINITION_IDS_IS_EMPTY, processDefinitionIds);
return result;
}
//check src project auth //check src project auth
Map<String, Object> checkResult = checkProjectAndAuth(loginUser, projectName); Map<String, Object> result = checkProjectAndAuth(loginUser, projectName);
if (checkResult != null) { if (result.get(Constants.STATUS) != Status.SUCCESS) {
return checkResult; return result;
} }
if (StringUtils.isEmpty(processDefinitionCodes)) {
Project targetProject = projectMapper.queryDetailById(targetProjectId); putMsg(result, Status.PROCESS_DEFINITION_CODES_IS_EMPTY, processDefinitionCodes);
if (targetProject == null) {
putMsg(result, Status.PROJECT_NOT_FOUNT, targetProjectId);
return result; return result;
} }
long targetProjectCode = 0L;
if (!(targetProject.getName()).equals(projectName)) { if (!(targetProjectName).equals(projectName)) {
Map<String, Object> checkTargetProjectResult = checkProjectAndAuth(loginUser, targetProject.getName()); Map<String, Object> checkTargetProjectResult = checkProjectAndAuth(loginUser, targetProjectName);
if (checkTargetProjectResult != null) { if (checkTargetProjectResult.get(Constants.STATUS) != Status.SUCCESS) {
return checkTargetProjectResult; return checkTargetProjectResult;
} else {
targetProjectCode = (long) checkTargetProjectResult.get(Constants.PROJECT_CODE);
} }
} }
String[] processDefinitionIdList = processDefinitionIds.split(Constants.COMMA); String[] processDefinitionCodeList = processDefinitionCodes.split(Constants.COMMA);
doBatchCopyProcessDefinition(loginUser, targetProject, failedProcessList, processDefinitionIdList); doBatchCopyProcessDefinition(loginUser, targetProjectCode, failedProcessList, processDefinitionCodeList);
checkBatchOperateResult(projectName, targetProjectName, result, failedProcessList, true);
checkBatchOperateResult(projectName, targetProject.getName(), result, failedProcessList, true);
return result; return result;
} }
@ -1561,16 +1520,15 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
String projectName, String projectName,
String processDefinitionIds, String processDefinitionIds,
int targetProjectId) { int targetProjectId) {
Map<String, Object> result = new HashMap<>();
List<String> failedProcessList = new ArrayList<>(); List<String> failedProcessList = new ArrayList<>();
//check src project auth //check src project auth
Map<String, Object> checkResult = checkProjectAndAuth(loginUser, projectName); Map<String, Object> result = checkProjectAndAuth(loginUser, projectName);
if (checkResult != null) { if (result.get(Constants.STATUS) != Status.SUCCESS) {
return checkResult; return result;
} }
if (StringUtils.isEmpty(processDefinitionIds)) { if (StringUtils.isEmpty(processDefinitionIds)) {
putMsg(result, Status.PROCESS_DEFINITION_IDS_IS_EMPTY, processDefinitionIds); putMsg(result, Status.PROCESS_DEFINITION_CODES_IS_EMPTY, processDefinitionIds);
return result; return result;
} }
@ -1697,23 +1655,21 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
* batch copy process definition * batch copy process definition
* *
* @param loginUser loginUser * @param loginUser loginUser
* @param targetProject targetProject * @param targetProjectCode targetProjectCode
* @param failedProcessList failedProcessList * @param failedProcessList failedProcessList
* @param processDefinitionIdList processDefinitionIdList * @param processDefinitionCodeList processDefinitionCodeList
*/ */
private void doBatchCopyProcessDefinition(User loginUser, Project targetProject, List<String> failedProcessList, String[] processDefinitionIdList) { private void doBatchCopyProcessDefinition(User loginUser, long targetProjectCode, List<String> failedProcessList, String[] processDefinitionCodeList) {
for (String processDefinitionId : processDefinitionIdList) { for (String processDefinitionCode : processDefinitionCodeList) {
try { try {
Map<String, Object> copyProcessDefinitionResult = Map<String, Object> copyProcessDefinitionResult = copyProcessDefinition(loginUser, Long.valueOf(processDefinitionCode), targetProjectCode);
copyProcessDefinition(loginUser, Integer.valueOf(processDefinitionId), targetProject);
if (!Status.SUCCESS.equals(copyProcessDefinitionResult.get(Constants.STATUS))) { if (!Status.SUCCESS.equals(copyProcessDefinitionResult.get(Constants.STATUS))) {
setFailedProcessList(failedProcessList, processDefinitionId); setFailedProcessList(failedProcessList, processDefinitionCode);
logger.error((String) copyProcessDefinitionResult.get(Constants.MSG)); logger.error((String) copyProcessDefinitionResult.get(Constants.MSG));
} }
} catch (Exception e) { } catch (Exception e) {
setFailedProcessList(failedProcessList, processDefinitionId); setFailedProcessList(failedProcessList, processDefinitionCode);
logger.error("copy processDefinition error: {}", e.getMessage(), e); logger.error("copy processDefinition error: {}", e.getMessage(), e);
} }
} }
} }
@ -1741,15 +1697,12 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
*/ */
private Map<String, Object> checkProjectAndAuth(User loginUser, String projectName) { private Map<String, Object> checkProjectAndAuth(User loginUser, String projectName) {
Project project = projectMapper.queryByName(projectName); Project project = projectMapper.queryByName(projectName);
//check user access for project //check user access for project
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName); Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultStatus = (Status) checkResult.get(Constants.STATUS); if (result.get(Constants.STATUS) == Status.SUCCESS) {
result.put(Constants.PROJECT_CODE, project.getCode());
if (resultStatus != Status.SUCCESS) {
return checkResult;
} }
return null; return result;
} }
/** /**
@ -1811,13 +1764,9 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
return result; return result;
} }
Project project = projectMapper.queryByName(projectName); result = checkProjectAndAuth(loginUser, projectName);
if (result.get(Constants.STATUS) != Status.SUCCESS) {
// check project auth return result;
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultStatus = (Status) checkResult.get(Constants.STATUS);
if (resultStatus != Status.SUCCESS) {
return checkResult;
} }
ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(processDefinitionCode); ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(processDefinitionCode);

9
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionControllerTest.java

@ -67,7 +67,6 @@ public class ProcessDefinitionControllerTest {
loginUser.setId(1); loginUser.setId(1);
loginUser.setUserType(UserType.GENERAL_USER); loginUser.setUserType(UserType.GENERAL_USER);
loginUser.setUserName("admin"); loginUser.setUserName("admin");
user = loginUser; user = loginUser;
} }
@ -190,14 +189,14 @@ public class ProcessDefinitionControllerTest {
public void testBatchCopyProcessDefinition() throws Exception { public void testBatchCopyProcessDefinition() throws Exception {
String projectName = "test"; String projectName = "test";
int targetProjectId = 2; String targetProjectName = "test1";
String id = "1"; String code = "1";
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
putMsg(result, Status.SUCCESS); putMsg(result, Status.SUCCESS);
Mockito.when(processDefinitionService.batchCopyProcessDefinition(user, projectName, id, targetProjectId)).thenReturn(result); Mockito.when(processDefinitionService.batchCopyProcessDefinition(user, projectName, code, targetProjectName)).thenReturn(result);
Result response = processDefinitionController.copyProcessDefinition(user, projectName, id, targetProjectId); Result response = processDefinitionController.copyProcessDefinition(user, projectName, code, targetProjectName);
Assert.assertTrue(response != null && response.isSuccess()); Assert.assertTrue(response != null && response.isSuccess());
} }

272
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProjectControllerTest.java

@ -17,220 +17,140 @@
package org.apache.dolphinscheduler.api.controller; package org.apache.dolphinscheduler.api.controller;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.apache.dolphinscheduler.api.enums.Status; import org.apache.dolphinscheduler.api.enums.Status;
import org.apache.dolphinscheduler.api.service.impl.ProjectServiceImpl;
import org.apache.dolphinscheduler.api.utils.PageInfo;
import org.apache.dolphinscheduler.api.utils.Result; import org.apache.dolphinscheduler.api.utils.Result;
import org.apache.dolphinscheduler.common.utils.JSONUtils; import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.enums.UserType;
import org.apache.dolphinscheduler.dao.entity.Project;
import org.apache.dolphinscheduler.dao.entity.Resource;
import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.junit.runner.RunWith;
import org.slf4j.LoggerFactory; import org.mockito.InjectMocks;
import org.springframework.http.MediaType; import org.mockito.Mock;
import org.springframework.test.web.servlet.MvcResult; import org.mockito.Mockito;
import org.springframework.util.LinkedMultiValueMap; import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.util.MultiValueMap;
import com.fasterxml.jackson.core.type.TypeReference;
/** /**
* project controller test * project controller test
*/ */
public class ProjectControllerTest extends AbstractControllerTest { @RunWith(MockitoJUnitRunner.Silent.class)
public class ProjectControllerTest {
private static Logger logger = LoggerFactory.getLogger(ProjectControllerTest.class);
private String projectCode;
@Before
public void before() throws Exception {
projectCode = testCreateProject("project_test11", "the test project");
}
@After
public void after() throws Exception {
testDeleteProject(projectCode);
}
private String testCreateProject(String projectName, String description) throws Exception { @InjectMocks
private ProjectController projectController;
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); @Mock
paramsMap.add("projectName",projectName); private ProjectServiceImpl projectService;
paramsMap.add("description",description);
MvcResult mvcResult = mockMvc.perform(post("/projects/create") @Mock
.header(SESSION_ID, sessionId) private ProjectMapper projectMapper;
.params(paramsMap))
.andExpect(status().isCreated())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), new TypeReference<Result<String>>() {}); protected User user;
Assert.assertEquals(Status.SUCCESS.getCode(), result.getCode().intValue());
Assert.assertNotNull(result.getData());
logger.info("create project return result:{}", mvcResult.getResponse().getContentAsString());
return (String)result.getData(); @Before
public void before() {
User loginUser = new User();
loginUser.setId(1);
loginUser.setUserType(UserType.GENERAL_USER);
loginUser.setUserName("admin");
user = loginUser;
} }
@Test @Test
public void testUpdateProject() throws Exception { public void testUpdateProject() {
Map<String, Object> result = new HashMap<>();
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); putMsg(result, Status.SUCCESS);
paramsMap.add("projectCode", projectCode); result.put("projectId", 1);
paramsMap.add("projectName","project_test_update");
paramsMap.add("desc","the test project update"); long projectCode = 1L;
paramsMap.add("userName", "the project owner"); String projectName = "test";
String desc = "";
MvcResult mvcResult = mockMvc.perform(post("/projects/update") String userName = "jack";
.header(SESSION_ID, sessionId) Mockito.when(projectService.update(user, projectCode, projectName, desc, userName)).thenReturn(result);
.params(paramsMap)) Result response = projectController.updateProject(user, projectCode, projectName, desc, userName);
.andExpect(status().isOk()) Assert.assertEquals(Status.SUCCESS.getCode(), response.getCode().intValue());
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.USER_NOT_EXIST.getCode(),result.getCode().intValue());
logger.info("update project return result:{}", mvcResult.getResponse().getContentAsString());
} }
@Test @Test
public void testQueryProjectByCode() throws Exception { public void testQueryProjectByCode() {
Map<String, Object> result = new HashMap<>();
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); putMsg(result, Status.SUCCESS);
paramsMap.add("projectCode", projectCode); long projectCode = 1L;
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(getProject());
MvcResult mvcResult = mockMvc.perform(get("/projects/query-by-code") Mockito.when(projectService.queryByCode(user, projectCode)).thenReturn(result);
.header(SESSION_ID, sessionId) Result response = projectController.queryProjectByCode(user, projectCode);
.params(paramsMap)) Assert.assertEquals(Status.SUCCESS.getCode(), response.getCode().intValue());
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.SUCCESS.getCode(), result.getCode().intValue());
logger.info(mvcResult.getResponse().getContentAsString());
logger.info("query project by code :{}, return result:{}", projectCode, mvcResult.getResponse().getContentAsString());
} }
@Test @Test
public void testQueryProjectListPaging() throws Exception { public void testQueryProjectListPaging() {
int pageNo = 1;
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); int pageSize = 10;
paramsMap.add("searchVal","test"); String searchVal = "";
paramsMap.add("pageSize","2");
paramsMap.add("pageNo","2");
MvcResult mvcResult = mockMvc.perform(get("/projects/list-paging")
.header(SESSION_ID, sessionId)
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info("query list-paging project return result:{}", mvcResult.getResponse().getContentAsString());
}
@Test
public void testQueryUnauthorizedProject() throws Exception {
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); Map<String, Object> result = new HashMap<>();
paramsMap.add("userId","2"); putMsg(result, Status.SUCCESS);
result.put(Constants.DATA_LIST, new PageInfo<Resource>(1, 10));
MvcResult mvcResult = mockMvc.perform(get("/projects/unauth-project") Mockito.when(projectService.queryProjectListPaging(user, pageSize, pageNo, searchVal)).thenReturn(result);
.header(SESSION_ID, sessionId) Result response = projectController.queryProjectListPaging(user, searchVal, pageSize, pageNo);
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class); Assert.assertTrue(response != null && response.isSuccess());
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info("query unauth project return result:{}", mvcResult.getResponse().getContentAsString());
} }
@Test @Test
public void testQueryAuthorizedProject() throws Exception { public void testQueryUnauthorizedProject() {
Map<String, Object> result = new HashMap<>();
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); putMsg(result, Status.SUCCESS);
paramsMap.add("userId",String.valueOf(user.getId())); Mockito.when(projectService.queryUnauthorizedProject(user, 2)).thenReturn(result);
Result response = projectController.queryUnauthorizedProject(user, 2);
MvcResult mvcResult = mockMvc.perform(get("/projects/authed-project") Assert.assertEquals(Status.SUCCESS.getCode(), response.getCode().intValue());
.header(SESSION_ID, sessionId)
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info("query authed project return result:{}", mvcResult.getResponse().getContentAsString());
} }
@Test @Test
public void testQueryAllProjectList() throws Exception { public void testQueryAuthorizedProject() {
Map<String, Object> result = new HashMap<>();
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); putMsg(result, Status.SUCCESS);
Mockito.when(projectService.queryAuthorizedProject(user, 2)).thenReturn(result);
MvcResult mvcResult = mockMvc.perform(get("/projects/query-project-list") Result response = projectController.queryAuthorizedProject(user, 2);
.header(SESSION_ID, sessionId) Assert.assertEquals(Status.SUCCESS.getCode(), response.getCode().intValue());
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info("query all project return result:{}", mvcResult.getResponse().getContentAsString());
} }
@Ignore
@Test @Test
public void testImportProcessDefinition() throws Exception { public void testQueryAllProjectList() {
Map<String, Object> result = new HashMap<>();
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); putMsg(result, Status.SUCCESS);
paramsMap.add("file","test"); Mockito.when(projectService.queryAllProjectList()).thenReturn(result);
Result response = projectController.queryAllProjectList(user);
MvcResult mvcResult = mockMvc.perform(post("/projects/import-definition") Assert.assertEquals(Status.SUCCESS.getCode(), response.getCode().intValue());
.header(SESSION_ID, sessionId)
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.TEXT_PLAIN))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.IMPORT_PROCESS_DEFINE_ERROR.getCode(),result.getCode().intValue());
logger.info(mvcResult.getResponse().getContentAsString());
} }
private void testDeleteProject(String projectCode) throws Exception { private Project getProject() {
Project project = new Project();
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); project.setCode(1L);
paramsMap.add("projectCode", projectCode); project.setId(1);
project.setName("test");
MvcResult mvcResult = mockMvc.perform(get("/projects/delete") project.setUserId(1);
.header(SESSION_ID, sessionId) return project;
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info("delete project return result:{}", mvcResult.getResponse().getContentAsString());
} }
private void putMsg(Map<String, Object> result, Status status, Object... statusParams) {
result.put(Constants.STATUS, status);
if (statusParams != null && statusParams.length > 0) {
result.put(Constants.MSG, MessageFormat.format(status.getMsg(), statusParams));
} else {
result.put(Constants.MSG, status.getMsg());
}
}
} }

32
dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java

@ -387,6 +387,8 @@ public class ProcessDefinitionServiceTest {
//instance exit //instance exit
Mockito.when(processDefineMapper.queryByDefineName(project.getCode(), "test")).thenReturn(getProcessDefinition()); Mockito.when(processDefineMapper.queryByDefineName(project.getCode(), "test")).thenReturn(getProcessDefinition());
putMsg(result, Status.SUCCESS, projectName);
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result);
Map<String, Object> successRes = processDefinitionService.queryProcessDefinitionByName(loginUser, Map<String, Object> successRes = processDefinitionService.queryProcessDefinitionByName(loginUser,
"project_test1", "test"); "project_test1", "test");
Assert.assertEquals(Status.SUCCESS, successRes.get(Constants.STATUS)); Assert.assertEquals(Status.SUCCESS, successRes.get(Constants.STATUS));
@ -398,30 +400,32 @@ public class ProcessDefinitionServiceTest {
String projectName = "project_test1"; String projectName = "project_test1";
Project project = getProject(projectName); Project project = getProject(projectName);
User loginUser = new User(); User loginUser = new User();
loginUser.setId(-1); loginUser.setId(1);
loginUser.setUserType(UserType.GENERAL_USER); loginUser.setUserType(UserType.GENERAL_USER);
Mockito.when(projectMapper.queryByName(projectName)).thenReturn(getProject(projectName));
Map<String, Object> result = new HashMap<>();
putMsg(result, Status.SUCCESS, projectName);
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result);
// copy project definition ids empty test // copy project definition ids empty test
Map<String, Object> map = processDefinitionService.batchCopyProcessDefinition(loginUser, projectName, StringUtils.EMPTY, 0); Map<String, Object> map = processDefinitionService.batchCopyProcessDefinition(loginUser, projectName, StringUtils.EMPTY, "project_test2");
Assert.assertEquals(Status.PROCESS_DEFINITION_IDS_IS_EMPTY, map.get(Constants.STATUS)); Assert.assertEquals(Status.PROCESS_DEFINITION_CODES_IS_EMPTY, map.get(Constants.STATUS));
Map<String, Object> result = new HashMap<>();
// project check auth fail // project check auth fail
putMsg(result, Status.PROJECT_NOT_FOUNT, projectName); putMsg(result, Status.PROJECT_NOT_FOUNT, projectName);
Mockito.when(projectMapper.queryByName(projectName)).thenReturn(getProject(projectName));
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result); Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result);
Map<String, Object> map1 = processDefinitionService.batchCopyProcessDefinition( Map<String, Object> map1 = processDefinitionService.batchCopyProcessDefinition(
loginUser, projectName, String.valueOf(project.getId()), 0); loginUser, projectName, String.valueOf(project.getId()), "project_test2");
Assert.assertEquals(Status.PROJECT_NOT_FOUNT, map1.get(Constants.STATUS)); Assert.assertEquals(Status.PROJECT_NOT_FOUNT, map1.get(Constants.STATUS));
// project check auth success, target project is null // project check auth success, target project is null
putMsg(result, Status.SUCCESS, projectName);
Mockito.when(projectMapper.queryByName(projectName)).thenReturn(getProject(projectName)); Mockito.when(projectMapper.queryByName(projectName)).thenReturn(getProject(projectName));
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result); Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result);
Mockito.when(projectMapper.queryDetailById(0)).thenReturn(null); putMsg(result, Status.PROJECT_NOT_FOUNT, "project_test2");
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result);
Map<String, Object> map2 = processDefinitionService.batchCopyProcessDefinition( Map<String, Object> map2 = processDefinitionService.batchCopyProcessDefinition(
loginUser, projectName, String.valueOf(project.getId()), 0); loginUser, projectName, String.valueOf(project.getId()), "project_test2");
Assert.assertEquals(Status.PROJECT_NOT_FOUNT, map2.get(Constants.STATUS)); Assert.assertEquals(Status.PROJECT_NOT_FOUNT, map2.get(Constants.STATUS));
// project check auth success, target project name not equal project name, check auth target project fail // project check auth success, target project name not equal project name, check auth target project fail
@ -430,21 +434,13 @@ public class ProcessDefinitionServiceTest {
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result); Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectName)).thenReturn(result);
putMsg(result, Status.SUCCESS, projectName); putMsg(result, Status.SUCCESS, projectName);
String projectName2 = "project_test2";
Project project2 = getProject(projectName2);
Mockito.when(projectMapper.queryByName(projectName2)).thenReturn(project2);
Mockito.when(projectService.checkProjectAndAuth(loginUser, project2, projectName2)).thenReturn(result);
Mockito.when(projectMapper.queryDetailById(1)).thenReturn(project2);
// instance exit // instance exit
ProcessDefinition definition = getProcessDefinition(); ProcessDefinition definition = getProcessDefinition();
definition.setLocations("{\"tasks-36196\":{\"name\":\"ssh_test1\",\"targetarr\":\"\",\"x\":141,\"y\":70}}"); definition.setLocations("{\"tasks-36196\":{\"name\":\"ssh_test1\",\"targetarr\":\"\",\"x\":141,\"y\":70}}");
definition.setConnects("[]"); definition.setConnects("[]");
Mockito.when(processDefineMapper.selectById(46)).thenReturn(definition);
Mockito.when(processService.genProcessData(Mockito.any())).thenReturn(getProcessData());
Map<String, Object> map3 = processDefinitionService.batchCopyProcessDefinition( Map<String, Object> map3 = processDefinitionService.batchCopyProcessDefinition(
loginUser, projectName, "46", 1); loginUser, projectName, "46", projectName);
Assert.assertEquals(Status.COPY_PROCESS_DEFINITION_ERROR, map3.get(Constants.STATUS)); Assert.assertEquals(Status.COPY_PROCESS_DEFINITION_ERROR, map3.get(Constants.STATUS));
} }

4
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java

@ -709,6 +709,10 @@ public final class Constants {
* projectId * projectId
*/ */
public static final String PROJECT_ID = "projectId"; public static final String PROJECT_ID = "projectId";
/**
* projectCode
*/
public static final String PROJECT_CODE = "projectCode";
/** /**
* processId * processId
*/ */

37
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessDefinition.java

@ -190,6 +190,43 @@ public class ProcessDefinition {
public ProcessDefinition(){} public ProcessDefinition(){}
public ProcessDefinition(Long projectCode,
String name,
Long code,
String description,
String globalParams,
String locations,
String connects,
int timeout,
int userId,
int tenantId) {
set(projectCode, name, description, globalParams, connects, locations, timeout, tenantId);
this.code = code;
this.userId = userId;
Date date = new Date();
this.createTime = date;
this.updateTime = date;
}
public void set(long projectCode,
String name,
String description,
String globalParams,
String connects,
String locations,
int timeout,
int tenantId) {
this.projectCode = projectCode;
this.name = name;
this.description = description;
this.globalParams = globalParams;
this.locations = locations;
this.connects = connects;
this.timeout = timeout;
this.tenantId = tenantId;
this.flag = Flag.YES;
}
public String getName() { public String getName() {
return name; return name;
} }

28
dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java

@ -2205,36 +2205,20 @@ public class ProcessService {
/** /**
* save processDefinition (including create or update processDefinition) * save processDefinition (including create or update processDefinition)
*/ */
public int saveProcessDefine(User operator, Project project, String name, String description, String globalParams, public int saveProcessDefine(User operator, ProcessDefinition processDefinition, Boolean isFromProcessDefine) {
String locations, String connects, int timeout, int tenantId, long processDefinitionCode, ProcessDefinitionLog processDefinitionLog = new ProcessDefinitionLog(processDefinition);
int processDefinitionId, Boolean isFromProcessDefine) { Integer version = processDefineLogMapper.queryMaxVersionForDefinition(processDefinition.getCode());
ProcessDefinitionLog processDefinitionLog = new ProcessDefinitionLog();
Integer version = processDefineLogMapper.queryMaxVersionForDefinition(processDefinitionCode);
int insertVersion = version == null || version == 0 ? 1 : version + 1; int insertVersion = version == null || version == 0 ? 1 : version + 1;
processDefinitionLog.setUserId(operator.getId());
processDefinitionLog.setCode(processDefinitionCode);
processDefinitionLog.setVersion(insertVersion); processDefinitionLog.setVersion(insertVersion);
processDefinitionLog.setName(name);
processDefinitionLog.setFlag(Flag.YES);
processDefinitionLog.setReleaseState(isFromProcessDefine ? ReleaseState.OFFLINE : ReleaseState.ONLINE); processDefinitionLog.setReleaseState(isFromProcessDefine ? ReleaseState.OFFLINE : ReleaseState.ONLINE);
processDefinitionLog.setProjectCode(project.getCode());
processDefinitionLog.setDescription(description);
processDefinitionLog.setGlobalParams(globalParams);
processDefinitionLog.setLocations(locations);
processDefinitionLog.setConnects(connects);
processDefinitionLog.setTimeout(timeout);
processDefinitionLog.setTenantId(tenantId);
processDefinitionLog.setOperator(operator.getId()); processDefinitionLog.setOperator(operator.getId());
Date now = new Date(); processDefinitionLog.setOperateTime(processDefinition.getUpdateTime());
processDefinitionLog.setOperateTime(now);
processDefinitionLog.setUpdateTime(now);
processDefinitionLog.setCreateTime(now);
int insertLog = processDefineLogMapper.insert(processDefinitionLog); int insertLog = processDefineLogMapper.insert(processDefinitionLog);
int result; int result;
if (0 == processDefinitionId) { if (0 == processDefinition.getId()) {
result = processDefineMapper.insert(processDefinitionLog); result = processDefineMapper.insert(processDefinitionLog);
} else { } else {
processDefinitionLog.setId(processDefinitionId); processDefinitionLog.setId(processDefinition.getId());
result = processDefineMapper.updateById(processDefinitionLog); result = processDefineMapper.updateById(processDefinitionLog);
} }
return (insertLog & result) > 0 ? insertVersion : 0; return (insertLog & result) > 0 ? insertVersion : 0;

Loading…
Cancel
Save