Rubik-W commented on a change in pull request #2884:
URL:
https://github.com/apache/incubator-dolphinscheduler/pull/2884#discussion_r438528485
##########
File path:
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
##########
@@ -295,36 +295,188 @@ private String getResourceIds(ProcessData processData) {
/**
* copy process definition
- *
* @param loginUser login user
- * @param projectName project name
* @param processId process definition id
* @return copy result code
*/
Review comment:
Annotate is wrong
##########
File path:
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
##########
@@ -95,27 +95,33 @@ public Result createProcessDefinition(@ApiIgnore
@RequestAttribute(value = Const
}
/**
- * copy process definition
+ * copy or move process definition
*
* @param loginUser login user
* @param projectName project name
- * @param processId process definition id
+ * @param isCopy isCopy
+ * @param processDefinitionIds process definition ids
+ * @param targetProjectName target project name
* @return copy result code
*/
- @ApiOperation(value = "copyProcessDefinition", notes=
"COPY_PROCESS_DEFINITION_NOTES")
+ @ApiOperation(value = "copyOrMoveProcessDefinition", notes=
"COPY_OR_MOVE_PROCESS_DEFINITION_NOTES")
@ApiImplicitParams({
- @ApiImplicitParam(name = "processId", value =
"PROCESS_DEFINITION_ID", required = true, dataType = "Int", example = "100")
+ @ApiImplicitParam(name = "processDefinitionIds", value =
"PROCESS_DEFINITION_IDS", required = true, dataType = "String", example = "3,4")
})
- @PostMapping(value = "/copy")
+ @PostMapping(value = "/copy-or-move")
@ResponseStatus(HttpStatus.OK)
- @ApiException(COPY_PROCESS_DEFINITION_ERROR)
- public Result copyProcessDefinition(@ApiIgnore @RequestAttribute(value =
Constants.SESSION_USER) User loginUser,
- @ApiParam(name = "projectName", value
= "PROJECT_NAME", required = true) @PathVariable String projectName,
- @RequestParam(value = "processId",
required = true) int processId) throws JsonProcessingException {
- logger.info("copy process definition, login user:{}, project name:{},
process definition id:{}",
- loginUser.getUserName(), projectName, processId);
- Map<String, Object> result =
processDefinitionService.copyProcessDefinition(loginUser, projectName,
processId);
- return returnDataList(result);
+ @ApiException(COPY_OR_MOVE_PROCESS_DEFINITION_ERROR)
+ public Result copyOrMoveProcessDefinition(@ApiIgnore
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+ @ApiParam(name = "projectName",
value = "PROJECT_NAME", required = true) @PathVariable String projectName,
+ @RequestParam(value =
"processDefinitionIds", required = true) String processDefinitionIds,
+ @RequestParam(value =
"targetProjectName",required = true) String targetProjectName,
+ @RequestParam(value = "isCopy",
required = true) boolean isCopy) {
Review comment:
Please add parameters to ApiImplicitParams()
##########
File path:
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
##########
@@ -95,27 +95,33 @@ public Result createProcessDefinition(@ApiIgnore
@RequestAttribute(value = Const
}
/**
- * copy process definition
+ * copy or move process definition
*
* @param loginUser login user
* @param projectName project name
- * @param processId process definition id
+ * @param isCopy isCopy
+ * @param processDefinitionIds process definition ids
+ * @param targetProjectName target project name
* @return copy result code
*/
- @ApiOperation(value = "copyProcessDefinition", notes=
"COPY_PROCESS_DEFINITION_NOTES")
+ @ApiOperation(value = "copyOrMoveProcessDefinition", notes=
"COPY_OR_MOVE_PROCESS_DEFINITION_NOTES")
@ApiImplicitParams({
- @ApiImplicitParam(name = "processId", value =
"PROCESS_DEFINITION_ID", required = true, dataType = "Int", example = "100")
+ @ApiImplicitParam(name = "processDefinitionIds", value =
"PROCESS_DEFINITION_IDS", required = true, dataType = "String", example = "3,4")
})
- @PostMapping(value = "/copy")
+ @PostMapping(value = "/copy-or-move")
@ResponseStatus(HttpStatus.OK)
- @ApiException(COPY_PROCESS_DEFINITION_ERROR)
- public Result copyProcessDefinition(@ApiIgnore @RequestAttribute(value =
Constants.SESSION_USER) User loginUser,
- @ApiParam(name = "projectName", value
= "PROJECT_NAME", required = true) @PathVariable String projectName,
- @RequestParam(value = "processId",
required = true) int processId) throws JsonProcessingException {
- logger.info("copy process definition, login user:{}, project name:{},
process definition id:{}",
- loginUser.getUserName(), projectName, processId);
- Map<String, Object> result =
processDefinitionService.copyProcessDefinition(loginUser, projectName,
processId);
- return returnDataList(result);
+ @ApiException(COPY_OR_MOVE_PROCESS_DEFINITION_ERROR)
+ public Result copyOrMoveProcessDefinition(@ApiIgnore
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+ @ApiParam(name = "projectName",
value = "PROJECT_NAME", required = true) @PathVariable String projectName,
+ @RequestParam(value =
"processDefinitionIds", required = true) String processDefinitionIds,
+ @RequestParam(value =
"targetProjectName",required = true) String targetProjectName,
+ @RequestParam(value = "isCopy",
required = true) boolean isCopy) {
+
+
+ logger.info("batch {} process definition, login user:{}, project
name:{}, process definition ids:{},target project name:{}",
+
isCopy?"copy":"move",StringUtils.replaceNRTtoUnderline(loginUser.getUserName()),
StringUtils.replaceNRTtoUnderline(projectName),
StringUtils.replaceNRTtoUnderline(processDefinitionIds),StringUtils.replaceNRTtoUnderline(targetProjectName));
Review comment:
Please add parameters to log
##########
File path:
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
##########
@@ -176,6 +176,10 @@
DELETE_WORKER_GROUP_FAIL(10147,"delete worker group fail ",
"删除worker分组失败"),
COPY_PROCESS_DEFINITION_ERROR(10148,"copy process definition error",
"复制工作流错误"),
USER_DISABLED(10149,"The current user is disabled", "当前用户已停用"),
+ QUERY_USER_CREATED_PROJECT_ERROR(10151,"query user created project error
error", "查询用户创建的项目错误"),
+ PROCESS_DEFINITION_IDS_IS_EMPTY(10152,"process definition ids is empty",
"工作流IDS不能为空"),
+ COPY_OR_MOVE_PROCESS_DEFINITION_ERROR(10148,"copy or move process
definition error", "复制或者移动工作流错误"),
+ MOVE_PROCESS_DEFINITION_ERROR(10150,"move process definition error",
"移动工作流错误"),
Review comment:
1. 10148 repeat
2. arranged in order
##########
File path:
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
##########
@@ -295,36 +295,188 @@ private String getResourceIds(ProcessData processData) {
/**
* copy process definition
- *
* @param loginUser login user
- * @param projectName project name
* @param processId process definition id
* @return copy result code
*/
- public Map<String, Object> copyProcessDefinition(User loginUser, String
projectName, Integer processId) throws JsonProcessingException {
+ private Map<String, Object> copyProcessDefinition(User loginUser,
+ Integer processId,
+ String targetProjectName)
throws JsonProcessingException {
Map<String, Object> result = new HashMap<>(5);
+
+ ProcessDefinition processDefinition =
processDefineMapper.selectById(processId);
+ if (processDefinition == null) {
+ putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processId);
+ return result;
+ } else {
+ Project targetProject =
projectMapper.queryByName(targetProjectName);
Review comment:
It is recommended to use the project ID.
Future projects will be logic delete, The project name may be duplicated.
##########
File path:
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
##########
@@ -295,36 +295,188 @@ private String getResourceIds(ProcessData processData) {
/**
* copy process definition
- *
* @param loginUser login user
- * @param projectName project name
* @param processId process definition id
* @return copy result code
*/
- public Map<String, Object> copyProcessDefinition(User loginUser, String
projectName, Integer processId) throws JsonProcessingException {
+ private Map<String, Object> copyProcessDefinition(User loginUser,
+ Integer processId,
+ String targetProjectName)
throws JsonProcessingException {
Map<String, Object> result = new HashMap<>(5);
+
+ ProcessDefinition processDefinition =
processDefineMapper.selectById(processId);
+ if (processDefinition == null) {
+ putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processId);
+ return result;
+ } else {
+ Project targetProject =
projectMapper.queryByName(targetProjectName);
+ if(targetProject == null){
+ putMsg(result, Status.PROJECT_NOT_FOUNT, targetProjectName);
+ return result;
+ }else{
+ return createProcessDefinition(
+ loginUser,
+ targetProjectName,
+ processDefinition.getName() + "_copy_" +
System.currentTimeMillis(),
+ processDefinition.getProcessDefinitionJson(),
+ processDefinition.getDescription(),
+ processDefinition.getLocations(),
+ processDefinition.getConnects());
+ }
+ }
+ }
+
+ /**
+ * batch copy or move process definition
+ * @param loginUser loginUser
+ * @param projectName projectName
+ * @param processDefinitionIds processDefinitionIds
+ * @param targetProjectName targetProjectName
+ * @return
+ */
+ public Map<String, Object> batchCopyOrMoveProcessDefinition(User loginUser,
+ String projectName,
+ String
processDefinitionIds,
+ String
targetProjectName, boolean isCopy){
+ Map<String, Object> result = new HashMap<>(5);
+ List<String> failedIdList = new ArrayList<>();
+
+ if (StringUtils.isEmpty(processDefinitionIds)) {
+ putMsg(result, Status.PROCESS_DEFINITION_IDS_IS_EMPTY,
targetProjectName);
+ return result;
+ }
+
+ //check src project auth
+ Map<String, Object> checkResult = checkProjectAndAuth(loginUser,
projectName);
+ if (checkResult != null) {
+ return checkResult;
+ }
+
+ if(!targetProjectName.equals(projectName)){
+ Map<String, Object> checkTargetProjectResult =
checkProjectAndAuth(loginUser, targetProjectName);
+ if (checkTargetProjectResult != null) {
+ return checkTargetProjectResult;
+ }
+ }
+
+ String[] processDefinitionIdList =
processDefinitionIds.split(Constants.COMMA);
+ if(isCopy){
+ doBatchCopyProcessDefinition(loginUser, targetProjectName,
failedIdList, processDefinitionIdList);
+ }else{
+ doBatchMoveProcessDefinition(targetProjectName, failedIdList,
processDefinitionIdList);
+ }
+
+ checkBatchOperateResult(result, failedIdList);
+
+ return result;
+ }
+
+ /**
+ * batch move process definition
+ * @param targetProjectName targetProjectName
+ * @param failedIdList failedIdList
+ * @param processDefinitionIdList processDefinitionIdList
+ */
+ private void doBatchMoveProcessDefinition(String targetProjectName,
List<String> failedIdList, String[] processDefinitionIdList) {
+ for(String processDefinitionId:processDefinitionIdList){
+ try {
+ Map<String, Object> moveProcessDefinitionResult =
+
moveProcessDefinition(Integer.valueOf(processDefinitionId),targetProjectName);
+ if
(!Status.SUCCESS.equals(moveProcessDefinitionResult.get(Constants.STATUS))) {
+ failedIdList.add(processDefinitionId);
+ logger.error((String)
moveProcessDefinitionResult.get(Constants.MSG));
+ }
+ } catch (Exception e) {
+ failedIdList.add(processDefinitionId);
+ }
+ }
+ }
+
+ /**
+ * batch copy process definition
+ * @param loginUser loginUser
+ * @param targetProjectName targetProjectName
+ * @param failedIdList failedIdList
+ * @param processDefinitionIdList processDefinitionIdList
+ */
+ private void doBatchCopyProcessDefinition(User loginUser, String
targetProjectName, List<String> failedIdList, String[] processDefinitionIdList)
{
+ for(String processDefinitionId:processDefinitionIdList){
+ try {
+ Map<String, Object> copyProcessDefinitionResult =
+
copyProcessDefinition(loginUser,Integer.valueOf(processDefinitionId),targetProjectName);
+ if
(!Status.SUCCESS.equals(copyProcessDefinitionResult.get(Constants.STATUS))) {
+ failedIdList.add(processDefinitionId);
+ logger.error((String)
copyProcessDefinitionResult.get(Constants.MSG));
+ }
+ } catch (Exception e) {
+ failedIdList.add(processDefinitionId);
+ }
+ }
+ }
+
+ /**
+ * check project and auth
+ * @param loginUser
+ * @param projectName
+ * @return
+ */
+ private Map<String, Object> checkProjectAndAuth(User loginUser, String
projectName) {
Project project = projectMapper.queryByName(projectName);
+ //check user access for project
Map<String, Object> checkResult =
projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultStatus = (Status) checkResult.get(Constants.STATUS);
+
if (resultStatus != Status.SUCCESS) {
return checkResult;
}
+ return null;
+ }
+
+ /**
+ * move process definition
+ * @param processId processId
+ * @param targetProjectName targetProjectName
+ * @return move result code
+ */
+ private Map<String, Object> moveProcessDefinition(Integer processId,
+ String targetProjectName)
{
+
+ Map<String, Object> result = new HashMap<>(5);
ProcessDefinition processDefinition =
processDefineMapper.selectById(processId);
if (processDefinition == null) {
putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processId);
return result;
} else {
- return createProcessDefinition(
- loginUser,
- projectName,
- processDefinition.getName() + "_copy_" +
System.currentTimeMillis(),
- processDefinition.getProcessDefinitionJson(),
- processDefinition.getDescription(),
- processDefinition.getLocations(),
- processDefinition.getConnects());
+ Project targetProject =
projectMapper.queryByName(targetProjectName);
+ if(targetProject == null){
+ putMsg(result, Status.PROJECT_NOT_FOUNT, processId);
+ return result;
+ }else{
+ processDefinition.setProjectId(targetProject.getId());
+ processDefinition.setUpdateTime(new Date());
+ if (processDefineMapper.updateById(processDefinition) > 0) {
+ putMsg(result, Status.SUCCESS);
+ } else {
+ putMsg(result, Status.UPDATE_PROCESS_DEFINITION_ERROR);
+ }
+ return result;
+ }
+ }
+ }
+
+ /**
+ * check batch operate result
+ * @param result
+ * @param failedIdList
+ */
+ private void checkBatchOperateResult(Map<String, Object> result,
List<String> failedIdList) {
+ if (!failedIdList.isEmpty()) {
+ putMsg(result, Status.MOVE_PROCESS_DEFINITION_ERROR,
String.join(",", failedIdList));
Review comment:
It is recommended the error message return project name.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]