diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java index 9ce62107f8..49df47bd13 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java @@ -109,7 +109,7 @@ public class ProcessDefinitionController extends BaseController { @ApiImplicitParam(name = "name", value = "PROCESS_DEFINITION_NAME", required = true, type = "String"), @ApiImplicitParam(name = "locations", value = "PROCESS_DEFINITION_LOCATIONS", required = true, type = "String"), @ApiImplicitParam(name = "connects", value = "PROCESS_DEFINITION_CONNECTS", required = true, type = "String"), - @ApiImplicitParam(name = "description", value = "PROCESS_DEFINITION_DESC", required = false, type = "String"), + @ApiImplicitParam(name = "description", value = "PROCESS_DEFINITION_DESC", required = false, type = "String") }) @PostMapping(value = "/save") @ResponseStatus(HttpStatus.CREATED) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/TaskDefinitionController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/TaskDefinitionController.java new file mode 100644 index 0000000000..62a3aa60ed --- /dev/null +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/TaskDefinitionController.java @@ -0,0 +1,289 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.api.controller; + +import static org.apache.dolphinscheduler.api.enums.Status.CREATE_TASK_DEFINITION; +import static org.apache.dolphinscheduler.api.enums.Status.DELETE_TASK_DEFINE_BY_CODE_ERROR; +import static org.apache.dolphinscheduler.api.enums.Status.DELETE_TASK_DEFINITION_VERSION_ERROR; +import static org.apache.dolphinscheduler.api.enums.Status.QUERY_DETAIL_OF_TASK_DEFINITION_ERROR; +import static org.apache.dolphinscheduler.api.enums.Status.QUERY_TASK_DEFINITION_LIST_PAGING_ERROR; +import static org.apache.dolphinscheduler.api.enums.Status.QUERY_TASK_DEFINITION_VERSIONS_ERROR; +import static org.apache.dolphinscheduler.api.enums.Status.SWITCH_TASK_DEFINITION_VERSION_ERROR; +import static org.apache.dolphinscheduler.api.enums.Status.UPDATE_TASK_DEFINITION_ERROR; + +import org.apache.dolphinscheduler.api.aspect.AccessLogAnnotation; +import org.apache.dolphinscheduler.api.enums.Status; +import org.apache.dolphinscheduler.api.exceptions.ApiException; +import org.apache.dolphinscheduler.api.service.TaskDefinitionService; +import org.apache.dolphinscheduler.api.utils.Result; +import org.apache.dolphinscheduler.common.Constants; +import org.apache.dolphinscheduler.common.utils.ParameterUtils; +import org.apache.dolphinscheduler.dao.entity.User; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import springfox.documentation.annotations.ApiIgnore; + +/** + * task definition controller + */ +@Api(tags = "TASK_DEFINITION_TAG") +@RestController +@RequestMapping("projects/{projectName}/task") +public class TaskDefinitionController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(TaskDefinitionController.class); + + @Autowired + private TaskDefinitionService taskDefinitionService; + + /** + * create task definition + * + * @param loginUser login user + * @param projectName project name + * @param taskDefinitionJson task definition json + * @return create result code + */ + @ApiOperation(value = "save", notes = "CREATE_TASK_DEFINITION_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectName", value = "PROJECT_NAME", required = true, type = "String"), + @ApiImplicitParam(name = "taskDefinitionJson", value = "TASK_DEFINITION_JSON", required = true, type = "String") + }) + @PostMapping(value = "/save") + @ResponseStatus(HttpStatus.CREATED) + @ApiException(CREATE_TASK_DEFINITION) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result createTaskDefinition(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam(value = "taskDefinitionJson", required = true) String taskDefinitionJson) { + + Map result = taskDefinitionService.createTaskDefinition(loginUser, projectName, taskDefinitionJson); + return returnDataList(result); + } + + /** + * update task definition + * + * @param loginUser login user + * @param projectName project name + * @param taskDefinitionCode task definition code + * @param taskDefinitionJson task definition json + * @return update result code + */ + @ApiOperation(value = "update", notes = "UPDATE_TASK_DEFINITION_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectName", value = "PROJECT_NAME", required = true, type = "String"), + @ApiImplicitParam(name = "code", value = "TASK_DEFINITION_CODE", required = true, dataType = "Long", example = "1"), + @ApiImplicitParam(name = "taskDefinitionJson", value = "TASK_DEFINITION_JSON", required = true, type = "String") + }) + @PostMapping(value = "/update") + @ResponseStatus(HttpStatus.OK) + @ApiException(UPDATE_TASK_DEFINITION_ERROR) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result updateTaskDefinition(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam(value = "taskDefinitionCode") long taskDefinitionCode, + @RequestParam(value = "taskDefinitionJson", required = true) String taskDefinitionJson) { + Map result = taskDefinitionService.updateTaskDefinition(loginUser, projectName, taskDefinitionCode, taskDefinitionJson); + return returnDataList(result); + } + + /** + * query task definition version paging list info + * + * @param loginUser login user info + * @param projectName project name + * @param pageNo the task definition version list current page number + * @param pageSize the task definition version list page size + * @param taskDefinitionCode the task definition code + * @return the task definition version list + */ + @ApiOperation(value = "queryVersions", notes = "QUERY_TASK_DEFINITION_VERSIONS_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNo", value = "PAGE_NO", required = true, dataType = "Int", example = "100"), + @ApiImplicitParam(name = "pageSize", value = "PAGE_SIZE", required = true, dataType = "Int", example = "100"), + @ApiImplicitParam(name = "taskDefinitionCode", value = "TASK_DEFINITION_CODE", required = true, dataType = "Long", example = "1") + }) + @GetMapping(value = "/versions") + @ResponseStatus(HttpStatus.OK) + @ApiException(QUERY_TASK_DEFINITION_VERSIONS_ERROR) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result queryTaskDefinitionVersions(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam(value = "pageNo") int pageNo, + @RequestParam(value = "pageSize") int pageSize, + @RequestParam(value = "taskDefinitionCode") long taskDefinitionCode) { + Map result = taskDefinitionService.queryTaskDefinitionVersions(loginUser, + projectName, pageNo, pageSize, taskDefinitionCode); + return returnDataList(result); + } + + /** + * switch task definition version + * + * @param loginUser login user info + * @param projectName project name + * @param taskDefinitionCode the task definition code + * @param version the version user want to switch + * @return switch version result code + */ + @ApiOperation(value = "switchVersion", notes = "SWITCH_TASK_DEFINITION_VERSION_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "taskDefinitionCode", value = "TASK_DEFINITION_CODE", required = true, dataType = "Long", example = "1"), + @ApiImplicitParam(name = "version", value = "VERSION", required = true, dataType = "Int", example = "100") + }) + @GetMapping(value = "/version/switch") + @ResponseStatus(HttpStatus.OK) + @ApiException(SWITCH_TASK_DEFINITION_VERSION_ERROR) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result switchTaskDefinitionVersion(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam(value = "taskDefinitionCode") long taskDefinitionCode, + @RequestParam(value = "version") int version) { + Map result = taskDefinitionService.switchVersion(loginUser, projectName, taskDefinitionCode, version); + return returnDataList(result); + } + + /** + * delete the certain task definition version by version and code + * + * @param loginUser login user info + * @param projectName the task definition project name + * @param taskDefinitionCode the task definition code + * @param version the task definition version user want to delete + * @return delete version result code + */ + @ApiOperation(value = "deleteVersion", notes = "DELETE_TASK_DEFINITION_VERSION_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "taskDefinitionCode", value = "TASK_DEFINITION_CODE", required = true, dataType = "Long", example = "1"), + @ApiImplicitParam(name = "version", value = "VERSION", required = true, dataType = "Int", example = "100") + }) + @GetMapping(value = "/version/delete") + @ResponseStatus(HttpStatus.OK) + @ApiException(DELETE_TASK_DEFINITION_VERSION_ERROR) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result deleteTaskDefinitionVersion(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam(value = "taskDefinitionCode") long taskDefinitionCode, + @RequestParam(value = "version") int version) { + Map result = taskDefinitionService.deleteByCodeAndVersion(loginUser, projectName, taskDefinitionCode, version); + return returnDataList(result); + } + + /** + * delete task definition by code + * + * @param loginUser login user + * @param projectName project name + * @param taskDefinitionCode the task definition code + * @return delete result code + */ + @ApiOperation(value = "deleteTaskDefinition", notes = "DELETE_TASK_DEFINITION_BY_CODE_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "taskDefinitionCode", value = "TASK_DEFINITION_CODE", required = true, dataType = "Long", example = "1") + }) + @GetMapping(value = "/delete") + @ResponseStatus(HttpStatus.OK) + @ApiException(DELETE_TASK_DEFINE_BY_CODE_ERROR) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result deleteTaskDefinitionByCode(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam(value = "taskDefinitionCode") long taskDefinitionCode) { + Map result = taskDefinitionService.deleteTaskDefinitionByCode(loginUser, projectName, taskDefinitionCode); + return returnDataList(result); + } + + /** + * query detail of task definition by code + * + * @param loginUser login user + * @param projectName project name + * @param taskDefinitionCode the task definition code + * @return task definition detail + */ + @ApiOperation(value = "queryTaskDefinitionDetail", notes = "QUERY_TASK_DEFINITION_DETAIL_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "taskDefinitionCode", value = "TASK_DEFINITION_CODE", required = true, dataType = "Long", example = "1") + }) + @GetMapping(value = "/select-by-code") + @ResponseStatus(HttpStatus.OK) + @ApiException(QUERY_DETAIL_OF_TASK_DEFINITION_ERROR) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result queryTaskDefinitionDetail(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam(value = "taskDefinitionCode") long taskDefinitionCode) { + Map result = taskDefinitionService.queryTaskDefinitionDetail(loginUser, projectName, taskDefinitionCode); + return returnDataList(result); + } + + /** + * query task definition list paging + * + * @param loginUser login user + * @param projectName project name + * @param searchVal search value + * @param pageNo page number + * @param pageSize page size + * @param userId user id + * @return task definition page + */ + @ApiOperation(value = "queryTaskDefinitionListPaging", notes = "QUERY_TASK_DEFINITION_LIST_PAGING_NOTES") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNo", value = "PAGE_NO", required = true, dataType = "Int", example = "100"), + @ApiImplicitParam(name = "searchVal", value = "SEARCH_VAL", required = false, type = "String"), + @ApiImplicitParam(name = "userId", value = "USER_ID", required = false, dataType = "Int", example = "100"), + @ApiImplicitParam(name = "pageSize", value = "PAGE_SIZE", required = true, dataType = "Int", example = "100") + }) + @GetMapping(value = "/list-paging") + @ResponseStatus(HttpStatus.OK) + @ApiException(QUERY_TASK_DEFINITION_LIST_PAGING_ERROR) + @AccessLogAnnotation(ignoreRequestArgs = "loginUser") + public Result queryTaskDefinitionListPaging(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @ApiParam(name = "projectName", value = "PROJECT_NAME", required = true) @PathVariable String projectName, + @RequestParam("pageNo") Integer pageNo, + @RequestParam(value = "searchVal", required = false) String searchVal, + @RequestParam(value = "userId", required = false, defaultValue = "0") Integer userId, + @RequestParam("pageSize") Integer pageSize) { + Map result = checkPageParams(pageNo, pageSize); + if (result.get(Constants.STATUS) != Status.SUCCESS) { + return returnDataListPaging(result); + } + searchVal = ParameterUtils.handleEscapes(searchVal); + result = taskDefinitionService.queryTaskDefinitionListPaging(loginUser, projectName, searchVal, pageNo, pageSize, userId); + return returnDataListPaging(result); + } +} diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java index dd9d4bcf78..9e06558f2d 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java @@ -265,12 +265,19 @@ public enum Status { BATCH_EXPORT_PROCESS_DEFINE_BY_IDS_ERROR(50028, "batch export process definition by ids error", "批量导出工作流定义错误"), IMPORT_PROCESS_DEFINE_ERROR(50029, "import process definition error", "导入工作流定义错误"), TASK_DEFINE_NOT_EXIST(50030, "task definition {0} does not exist", "任务定义[{0}]不存在"), - DELETE_TASK_DEFINE_BY_CODE_ERROR(50031, "delete task definition by code error", "删除任务定义错误"), DELETE_PROCESS_TASK_RELATION_ERROR(50032, "delete process task relation error", "删除工作流任务关系错误"), PROCESS_TASK_RELATION_NOT_EXIST(50033, "process task relation {0} does not exist", "工作流任务关系[{0}]不存在"), PROCESS_TASK_RELATION_EXIST(50034, "process task relation is already exist, processCode:[{0}]", "工作流任务关系已存在, processCode:[{0}]"), PROCESS_DAG_IS_EMPTY(50035, "process dag can not be empty", "工作流dag不能为空"), CHECK_PROCESS_TASK_RELATION_ERROR(50036, "check process task relation error", "工作流任务关系参数错误"), + CREATE_TASK_DEFINITION(50037, "create task definition", "创建任务错误"), + UPDATE_TASK_DEFINITION_ERROR(50038, "update task definition error", "更新任务定义错误"), + QUERY_TASK_DEFINITION_VERSIONS_ERROR(50039, "query task definition versions error", "查询任务历史版本信息出错"), + SWITCH_TASK_DEFINITION_VERSION_ERROR(50040, "Switch task definition version error", "切换任务版本出错"), + DELETE_TASK_DEFINITION_VERSION_ERROR(50041, "delete task definition version error", "删除任务历史版本出错"), + DELETE_TASK_DEFINE_BY_CODE_ERROR(50042, "delete task definition by code error", "删除任务定义错误"), + QUERY_DETAIL_OF_TASK_DEFINITION_ERROR(50043, "query detail of task definition error", "查询任务详细信息错误"), + QUERY_TASK_DEFINITION_LIST_PAGING_ERROR(50044, "query task definition list paging error", "分页查询任务定义列表错误"), HDFS_NOT_STARTUP(60001, "hdfs not startup", "hdfs未启用"), /** diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskDefinitionService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskDefinitionService.java index ea0031ab76..d3f2dc47b3 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskDefinitionService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskDefinitionService.java @@ -57,7 +57,7 @@ public interface TaskDefinitionService { */ Map deleteTaskDefinitionByCode(User loginUser, String projectName, - Long taskCode); + long taskCode); /** * update task definition @@ -69,7 +69,7 @@ public interface TaskDefinitionService { */ Map updateTaskDefinition(User loginUser, String projectName, - Long taskCode, + long taskCode, String taskDefinitionJson); /** @@ -82,7 +82,67 @@ public interface TaskDefinitionService { */ Map switchVersion(User loginUser, String projectName, - Long taskCode, + long taskCode, int version); + + /** + * query the pagination versions info by one certain task definition code + * + * @param loginUser login user info to check auth + * @param projectName project name + * @param pageNo page number + * @param pageSize page size + * @param taskCode task definition code + * @return the pagination task definition versions info of the certain task definition + */ + Map queryTaskDefinitionVersions(User loginUser, + String projectName, + int pageNo, + int pageSize, + long taskCode); + + /** + * delete the certain task definition version by version and code + * + * @param loginUser login user info + * @param projectName the task definition project name + * @param taskCode the task definition code + * @param version the task definition version user want to delete + * @return delete version result code + */ + Map deleteByCodeAndVersion(User loginUser, + String projectName, + long taskCode, + int version); + + /** + * query detail of task definition by code + * + * @param loginUser login user + * @param projectName project name + * @param taskCode the task definition code + * @return task definition detail + */ + Map queryTaskDefinitionDetail(User loginUser, + String projectName, + long taskCode); + + /** + * query task definition list paging + * + * @param loginUser login user + * @param projectName project name + * @param searchVal search value + * @param pageNo page number + * @param pageSize page size + * @param userId user id + * @return task definition page + */ + Map queryTaskDefinitionListPaging(User loginUser, + String projectName, + String searchVal, + Integer pageNo, + Integer pageSize, + Integer userId); } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java index e3608a72da..04380f1581 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java @@ -163,7 +163,7 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe */ @Transactional(rollbackFor = RuntimeException.class) @Override - public Map deleteTaskDefinitionByCode(User loginUser, String projectName, Long taskCode) { + public Map deleteTaskDefinitionByCode(User loginUser, String projectName, long taskCode) { Map result = new HashMap<>(5); Project project = projectMapper.queryByName(projectName); @@ -200,7 +200,7 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe */ @Transactional(rollbackFor = RuntimeException.class) @Override - public Map updateTaskDefinition(User loginUser, String projectName, Long taskCode, String taskDefinitionJson) { + public Map updateTaskDefinition(User loginUser, String projectName, long taskCode, String taskDefinitionJson) { Map result = new HashMap<>(5); Project project = projectMapper.queryByName(projectName); @@ -251,7 +251,7 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe * @param version the version user want to switch */ @Override - public Map switchVersion(User loginUser, String projectName, Long taskCode, int version) { + public Map switchVersion(User loginUser, String projectName, long taskCode, int version) { Map result = new HashMap<>(5); Project project = projectMapper.queryByName(projectName); @@ -277,5 +277,30 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe putMsg(result, Status.SUCCESS); return result; } + + @Override + public Map queryTaskDefinitionVersions(User loginUser, String projectName, int pageNo, int pageSize, long taskCode) { + return null; + } + + @Override + public Map deleteByCodeAndVersion(User loginUser, String projectName, long taskCode, int version) { + return null; + } + + @Override + public Map queryTaskDefinitionDetail(User loginUser, String projectName, long taskCode) { + return null; + } + + @Override + public Map queryTaskDefinitionListPaging(User loginUser, + String projectName, + String searchVal, + Integer pageNo, + Integer pageSize, + Integer userId) { + return null; + } }