From ae042fc5c73cf9eb1ecd3194843c00c9623caeb3 Mon Sep 17 00:00:00 2001 From: ligang Date: Fri, 10 May 2019 14:41:22 +0800 Subject: [PATCH 1/4] add delete eschedule by id --- .../api/controller/SchedulerController.java | 25 +++++++++++ .../java/cn/escheduler/api/enums/Status.java | 1 + .../api/service/SchedulerService.java | 42 +++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/escheduler-api/src/main/java/cn/escheduler/api/controller/SchedulerController.java b/escheduler-api/src/main/java/cn/escheduler/api/controller/SchedulerController.java index 8449bd1d38..cff662a160 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/controller/SchedulerController.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/controller/SchedulerController.java @@ -230,4 +230,29 @@ public class SchedulerController extends BaseController{ return error(Status.QUERY_SCHEDULE_LIST_ERROR.getCode(), Status.QUERY_SCHEDULE_LIST_ERROR.getMsg()); } } + + /** + * delete schedule by id + * + * @param loginUser + * @param projectName + * @param scheduleId + * @return + */ + @GetMapping(value="/delete") + @ResponseStatus(HttpStatus.OK) + public Result deleteScheduleById(@RequestAttribute(value = SESSION_USER) User loginUser, + @PathVariable String projectName, + @RequestParam("scheduleId") Integer scheduleId + ){ + try{ + logger.info("delete schedule by id, login user:{}, project name:{}, schedule id:{}", + loginUser.getUserName(), projectName, scheduleId); + Map result = schedulerService.deleteScheduleById(loginUser, projectName, scheduleId); + return returnDataList(result); + }catch (Exception e){ + logger.error(DELETE_SCHEDULE_CRON_BY_ID_ERROR.getMsg(),e); + return error(Status.DELETE_SCHEDULE_CRON_BY_ID_ERROR.getCode(), Status.DELETE_SCHEDULE_CRON_BY_ID_ERROR.getMsg()); + } + } } diff --git a/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java b/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java index 24b92b8382..9c071cd0f0 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java @@ -203,6 +203,7 @@ public enum Status { PROCESS_DEFINE_STATE_ONLINE(50021, "process definition {0} is already on line"), DELETE_PROCESS_DEFINE_BY_ID_ERROR(50022,"delete process definition by id error"), SCHEDULE_CRON_STATE_ONLINE(50023,"the status of schedule {0} is already on line"), + DELETE_SCHEDULE_CRON_BY_ID_ERROR(50024,"delete schedule by id error"), HDFS_NOT_STARTUP(60001,"hdfs not startup"), diff --git a/escheduler-api/src/main/java/cn/escheduler/api/service/SchedulerService.java b/escheduler-api/src/main/java/cn/escheduler/api/service/SchedulerService.java index 232b9d7b15..f2cf8e1905 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/service/SchedulerService.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/service/SchedulerService.java @@ -488,4 +488,46 @@ public class SchedulerService extends BaseService { } return null; } + + /** + * delete schedule by id + * + * @param loginUser + * @param projectName + * @param scheduleId + * @return + */ + public Map deleteScheduleById(User loginUser, String projectName, Integer scheduleId) { + + Map result = new HashMap<>(5); + Project project = projectMapper.queryByName(projectName); + + Map checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName); + Status resultEnum = (Status) checkResult.get(Constants.STATUS); + if (resultEnum != Status.SUCCESS) { + return checkResult; + } + + Schedule schedule = scheduleMapper.queryById(scheduleId); + + if (schedule == null) { + putMsg(result, Status.SCHEDULE_CRON_NOT_EXISTS, scheduleId); + return result; + } + // check schedule is already online + if(schedule.getReleaseState() == ReleaseState.ONLINE){ + putMsg(result, Status.SCHEDULE_CRON_STATE_ONLINE,schedule.getId()); + return result; + } + + + int delete = scheduleMapper.delete(scheduleId); + + if (delete > 0) { + putMsg(result, Status.SUCCESS); + } else { + putMsg(result, Status.DELETE_SCHEDULE_CRON_BY_ID_ERROR); + } + return result; + } } \ No newline at end of file From 3f87b3865c47469c75fa83d48a1aa039343a767f Mon Sep 17 00:00:00 2001 From: ligang Date: Fri, 10 May 2019 17:22:33 +0800 Subject: [PATCH 2/4] add listFileStatus --- .../cn/escheduler/common/utils/HadoopUtils.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/escheduler-common/src/main/java/cn/escheduler/common/utils/HadoopUtils.java b/escheduler-common/src/main/java/cn/escheduler/common/utils/HadoopUtils.java index b76d6347da..bba9e610fc 100644 --- a/escheduler-common/src/main/java/cn/escheduler/common/utils/HadoopUtils.java +++ b/escheduler-common/src/main/java/cn/escheduler/common/utils/HadoopUtils.java @@ -28,6 +28,7 @@ import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.yarn.client.cli.RMAdminCLI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -263,6 +264,22 @@ public class HadoopUtils implements Closeable { return fs.exists(new Path(hdfsFilePath)); } + /** + * Gets a list of files in the directory + * + * @param filePath + * @return {@link FileStatus} + */ + public FileStatus[] listFileStatus(String filePath)throws Exception{ + Path path = new Path(filePath); + try { + return fs.listStatus(new Path(filePath)); + } catch (IOException e) { + logger.error("Get file list exception", e); + throw new Exception("Get file list exception", e); + } + } + /** * Renames Path src to Path dst. Can take place on local fs * or remote DFS. From 81ecdf42ce33b7c236d271d25479d1b485abeba6 Mon Sep 17 00:00:00 2001 From: ligang Date: Fri, 10 May 2019 17:25:01 +0800 Subject: [PATCH 3/4] update method deleteTenantById --- .../main/java/cn/escheduler/api/enums/Status.java | 2 ++ .../cn/escheduler/api/service/TenantService.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java b/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java index d7d404c644..bda65de9cd 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java @@ -207,6 +207,8 @@ public enum Status { DELETE_SCHEDULE_CRON_BY_ID_ERROR(50024,"delete schedule by id error"), HDFS_NOT_STARTUP(60001,"hdfs not startup"), + HDFS_TERANT_RESOURCES_FILE_EXISTS(60002,"resource file exists,please delete resource first"), + HDFS_TERANT_UDFS_FILE_EXISTS(60003,"udf file exists,please delete resource first"), /** * for monitor diff --git a/escheduler-api/src/main/java/cn/escheduler/api/service/TenantService.java b/escheduler-api/src/main/java/cn/escheduler/api/service/TenantService.java index 9fa8466175..68fbc55348 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/service/TenantService.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/service/TenantService.java @@ -26,6 +26,7 @@ import cn.escheduler.dao.mapper.TenantMapper; import cn.escheduler.dao.model.Tenant; import cn.escheduler.dao.model.User; import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.fs.FileStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -219,6 +220,7 @@ public class TenantService extends BaseService{ * @param id * @return */ + @Transactional(value = "TransactionManager", rollbackFor = Exception.class) public Map deleteTenantById(User loginUser, int id) throws Exception { Map result = new HashMap<>(5); @@ -229,6 +231,19 @@ public class TenantService extends BaseService{ Tenant tenant = tenantMapper.queryById(id); String tenantPath = HadoopUtils.getHdfsDataBasePath() + "/" + tenant.getTenantCode(); + + String resourcePath = HadoopUtils.getHdfsDir(tenant.getTenantCode()); + FileStatus[] fileStatus = HadoopUtils.getInstance().listFileStatus(resourcePath); + if (fileStatus.length > 0) { + putMsg(result, Status.HDFS_TERANT_RESOURCES_FILE_EXISTS); + return result; + } + fileStatus = HadoopUtils.getInstance().listFileStatus(HadoopUtils.getHdfsUdfDir(tenant.getTenantCode())); + if (fileStatus.length > 0) { + putMsg(result, Status.HDFS_TERANT_UDFS_FILE_EXISTS); + return result; + } + HadoopUtils.getInstance().delete(tenantPath, true); tenantMapper.deleteById(id); From e577776c035d800ae45afa26389196a4d0a28e3b Mon Sep 17 00:00:00 2001 From: ligang Date: Fri, 10 May 2019 19:34:53 +0800 Subject: [PATCH 4/4] add queryByProcessDefinitionId --- .../api/service/ProcessDefinitionService.java | 2 +- .../escheduler/dao/mapper/ScheduleMapper.java | 24 +++++++++++++++++++ .../dao/mapper/ScheduleMapperProvider.java | 14 +++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/escheduler-api/src/main/java/cn/escheduler/api/service/ProcessDefinitionService.java b/escheduler-api/src/main/java/cn/escheduler/api/service/ProcessDefinitionService.java index cfa3814616..57b67ec503 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/service/ProcessDefinitionService.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/service/ProcessDefinitionService.java @@ -370,7 +370,7 @@ public class ProcessDefinitionService extends BaseDAGService { } // get the timing according to the process definition - List schedules = scheduleMapper.selectAllByProcessDefineArray(new int[processDefinitionId]); + List schedules = scheduleMapper.queryByProcessDefinitionId(processDefinitionId); if (!schedules.isEmpty() && schedules.size() > 1) { logger.warn("scheduler num is {},Greater than 1",schedules.size()); putMsg(result, Status.DELETE_PROCESS_DEFINE_BY_ID_ERROR); diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapper.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapper.java index 4806979b82..31cc99232a 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapper.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapper.java @@ -173,6 +173,30 @@ public interface ScheduleMapper { @SelectProvider(type = ScheduleMapperProvider.class, method = "selectAllByProcessDefineArray") List selectAllByProcessDefineArray(@Param("processDefineIds") int[] processDefineIds); + /** + * query schedule list by definition id + * @param processDefinitionId + * @return + */ + @Results(value = { + @Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER), + @Result(property = "processDefinitionId", column = "process_definition_id", id = true, javaType = int.class, jdbcType = JdbcType.INTEGER), + @Result(property = "startTime", column = "start_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP), + @Result(property = "endTime", column = "end_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP), + @Result(property = "crontab", column = "crontab", javaType = String.class, jdbcType = JdbcType.VARCHAR), + @Result(property = "failureStrategy", column = "failure_strategy", typeHandler = EnumOrdinalTypeHandler.class, javaType = FailureStrategy.class, jdbcType = JdbcType.TINYINT), + @Result(property = "warningType", column = "warning_type", typeHandler = EnumOrdinalTypeHandler.class, javaType = WarningType.class, jdbcType = JdbcType.TINYINT), + @Result(property = "createTime", column = "create_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP), + @Result(property = "updateTime", column = "update_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP), + @Result(property = "userId", column = "user_id", javaType = int.class, jdbcType = JdbcType.INTEGER), + @Result(property = "releaseState", column = "release_state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ReleaseState.class, jdbcType = JdbcType.TINYINT), + @Result(property = "warningGroupId", column = "warning_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER), + @Result(property = "workerGroupId", column = "worker_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER), + @Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT) + }) + @SelectProvider(type = ScheduleMapperProvider.class, method = "queryByProcessDefinitionId") + List queryByProcessDefinitionId(@Param("processDefinitionId") int processDefinitionId); + /** * delete schedule by id * @param scheduleId diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapperProvider.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapperProvider.java index bdfeb409e2..887c3c9117 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapperProvider.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ScheduleMapperProvider.java @@ -181,6 +181,20 @@ public class ScheduleMapperProvider { }}.toString(); } + /** + * query schedule by process definition id + * @param parameter + * @return + */ + public String queryByProcessDefinitionId(Map parameter) { + + return new SQL() {{ + SELECT("*"); + FROM(DB_NAME); + WHERE("process_definition_id = #{processDefinitionId}"); + }}.toString(); + } + /** * delete schedule by id *