diff --git a/escheduler-api/src/main/java/cn/escheduler/api/controller/DataAnalysisController.java b/escheduler-api/src/main/java/cn/escheduler/api/controller/DataAnalysisController.java index 96b8c77ff0..568af1f173 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/controller/DataAnalysisController.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/controller/DataAnalysisController.java @@ -57,8 +57,7 @@ public class DataAnalysisController extends BaseController{ public Result countTaskState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser, @RequestParam(value="startDate", required=false) String startDate, @RequestParam(value="endDate", required=false) String endDate, - @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId - ){ + @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){ try{ logger.info("count task state, user:{}, start date: {}, end date:{}, project id {}", loginUser.getUserName(), startDate, endDate, projectId); @@ -82,12 +81,11 @@ public class DataAnalysisController extends BaseController{ public Result countProcessInstanceState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser, @RequestParam(value="startDate", required=false) String startDate, @RequestParam(value="endDate", required=false) String endDate, - @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId - ){ + @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){ try{ logger.info("count process instance state, user:{}, start date: {}, end date:{}, project id", loginUser.getUserName(), startDate, endDate, projectId); - Map result = dataAnalysisService.countProcessInstanceStateByProject(loginUser,projectId, startDate, endDate); + Map result = dataAnalysisService.countProcessInstanceStateByProject(loginUser, projectId, startDate, endDate); return returnDataList(result); }catch (Exception e){ logger.error(COUNT_PROCESS_INSTANCE_STATE_ERROR.getMsg(),e); @@ -105,8 +103,7 @@ public class DataAnalysisController extends BaseController{ @GetMapping(value="/define-user-count") @ResponseStatus(HttpStatus.OK) public Result countDefinitionByUser(@RequestAttribute(value = Constants.SESSION_USER) User loginUser, - @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId - ){ + @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){ try{ logger.info("count process definition , user:{}, project id", loginUser.getUserName(), projectId); @@ -119,4 +116,51 @@ public class DataAnalysisController extends BaseController{ } + /** + * statistical command status data + * + * @param loginUser + * @param projectId + * @return + */ + @GetMapping(value="/command-state-count") + @ResponseStatus(HttpStatus.OK) + public Result countCommandState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @RequestParam(value="startDate", required=false) String startDate, + @RequestParam(value="endDate", required=false) String endDate, + @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){ + try{ + logger.info("count command state, user:{}, start date: {}, end date:{}, project id {}", + loginUser.getUserName(), startDate, endDate, projectId); + Map result = dataAnalysisService.countCommandState(loginUser, projectId, startDate, endDate); + return returnDataList(result); + }catch (Exception e){ + logger.error(COMMAND_STATE_COUNT_ERROR.getMsg(),e); + return error(COMMAND_STATE_COUNT_ERROR.getCode(), COMMAND_STATE_COUNT_ERROR.getMsg()); + } + } + + /** + * queue count + * + * @param loginUser + * @param projectId + * @return + */ + @GetMapping(value="/queue-count") + @ResponseStatus(HttpStatus.OK) + public Result countQueueState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser, + @RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){ + try{ + logger.info("count command state, user:{}, start date: {}, end date:{}, project id {}", + loginUser.getUserName(), projectId); + Map result = dataAnalysisService.countQueueState(loginUser, projectId); + return returnDataList(result); + }catch (Exception e){ + logger.error(QUEUE_COUNT_ERROR.getMsg(),e); + return error(QUEUE_COUNT_ERROR.getCode(), QUEUE_COUNT_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 64d381c7db..f32d290ab6 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 @@ -209,6 +209,11 @@ public enum Status { GENERATE_TOKEN_ERROR(70002,"generate token error"), QUERY_ACCESSTOKEN_LIST_PAGING_ERROR(70003,"query access token list paging error"), + + COMMAND_STATE_COUNT_ERROR(80001,"task instance state count error"), + + QUEUE_COUNT_ERROR(90001,"queue count error"), + ; private int code; diff --git a/escheduler-api/src/main/java/cn/escheduler/api/interceptor/LoginHandlerInterceptor.java b/escheduler-api/src/main/java/cn/escheduler/api/interceptor/LoginHandlerInterceptor.java index f3836dc467..f67acbf850 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/interceptor/LoginHandlerInterceptor.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/interceptor/LoginHandlerInterceptor.java @@ -79,15 +79,20 @@ public class LoginHandlerInterceptor implements HandlerInterceptor { //get user object from session user = userMapper.queryById(session.getUserId()); + + // if user is null + if (user == null) { + response.setStatus(HttpStatus.SC_UNAUTHORIZED); + logger.info("user does not exist"); + return false; + } }else { user = userMapper.queryUserByToken(token); - } - - // if user is null - if (user == null) { - response.setStatus(HttpStatus.SC_UNAUTHORIZED); - logger.info("user does not exist"); - return false; + if (user == null) { + response.setStatus(HttpStatus.SC_UNAUTHORIZED); + logger.info("user token has expired"); + return false; + } } request.setAttribute(Constants.SESSION_USER, user); return true; diff --git a/escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java b/escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java index 8cceed11e0..d2a3cdf1ca 100644 --- a/escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java +++ b/escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java @@ -21,15 +21,17 @@ import cn.escheduler.api.dto.DefineUserDto; import cn.escheduler.api.dto.TaskCountDto; import cn.escheduler.api.enums.Status; import cn.escheduler.api.utils.Constants; +import cn.escheduler.common.enums.ExecutionStatus; +import cn.escheduler.common.enums.UserType; +import cn.escheduler.common.queue.ITaskQueue; +import cn.escheduler.common.queue.TaskQueueFactory; import cn.escheduler.common.utils.DateUtils; -import cn.escheduler.dao.mapper.ProcessDefinitionMapper; -import cn.escheduler.dao.mapper.ProcessInstanceMapper; -import cn.escheduler.dao.mapper.ProjectMapper; -import cn.escheduler.dao.mapper.TaskInstanceMapper; +import cn.escheduler.dao.mapper.*; import cn.escheduler.dao.model.DefinitionGroupByUser; import cn.escheduler.dao.model.ExecuteStatusCount; import cn.escheduler.dao.model.Project; import cn.escheduler.dao.model.User; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -55,15 +57,21 @@ public class DataAnalysisService { @Autowired ProjectService projectService; - @Autowired - TaskInstanceMapper taskInstanceMapper; - @Autowired ProcessInstanceMapper processInstanceMapper; @Autowired ProcessDefinitionMapper processDefinitionMapper; + @Autowired + CommandMapper commandMapper; + + @Autowired + ErrorCommandMapper errorCommandMapper; + + @Autowired + TaskInstanceMapper taskInstanceMapper; + /** * statistical task instance status data * @@ -206,4 +214,157 @@ public class DataAnalysisService { } return false; } + + /** + * statistical command status data + * + * @param loginUser + * @param projectId + * @param startDate + * @param endDate + * @return + */ + public Map countCommandState(User loginUser, int projectId, String startDate, String endDate) { + + Map result = new HashMap<>(5); + if(projectId != 0){ + Project project = projectMapper.queryById(projectId); + result = projectService.checkProjectAndAuth(loginUser, project, String.valueOf(projectId)); + + if (getResultStatus(result)){ + return result; + } + } + + /** + * find all the task lists in the project under the user + * statistics based on task status execution, failure, completion, wait, total + */ + Date start = null; + Date end = null; + + try { + start = DateUtils.getScheduleDate(startDate); + end = DateUtils.getScheduleDate(endDate); + } catch (Exception e) { + logger.error(e.getMessage(),e); + putErrorRequestParamsMsg(result); + return result; + } + + // count command state + List commandStateCounts = + commandMapper.countCommandState(loginUser.getId(), + loginUser.getUserType(), start, end, projectId); + + // count error command state + List errorCommandStateCounts = + errorCommandMapper.countCommandState(loginUser.getId(), + loginUser.getUserType(), start, end, projectId); + + // + Map> dataMap = new HashMap<>(); + + Map commonCommand = new HashMap<>(); + commonCommand.put("commandState",0); + commonCommand.put("errorCommandState",0); + + + // init data map + dataMap.put(ExecutionStatus.SUBMITTED_SUCCESS,commonCommand); + dataMap.put(ExecutionStatus.RUNNING_EXEUTION,commonCommand); + dataMap.put(ExecutionStatus.READY_PAUSE,commonCommand); + dataMap.put(ExecutionStatus.PAUSE,commonCommand); + dataMap.put(ExecutionStatus.READY_STOP,commonCommand); + dataMap.put(ExecutionStatus.STOP,commonCommand); + dataMap.put(ExecutionStatus.FAILURE,commonCommand); + dataMap.put(ExecutionStatus.SUCCESS,commonCommand); + dataMap.put(ExecutionStatus.NEED_FAULT_TOLERANCE,commonCommand); + dataMap.put(ExecutionStatus.KILL,commonCommand); + dataMap.put(ExecutionStatus.WAITTING_THREAD,commonCommand); + dataMap.put(ExecutionStatus.WAITTING_DEPEND,commonCommand); + + // put command state + for (ExecuteStatusCount executeStatusCount : commandStateCounts){ + Map commandStateCountsMap = new HashMap<>(dataMap.get(executeStatusCount.getExecutionStatus())); + commandStateCountsMap.put("commandState", executeStatusCount.getCount()); + dataMap.put(executeStatusCount.getExecutionStatus(),commandStateCountsMap); + } + + // put error command state + for (ExecuteStatusCount errorExecutionStatus : errorCommandStateCounts){ + Map errorCommandStateCountsMap = new HashMap<>(dataMap.get(errorExecutionStatus.getExecutionStatus())); + errorCommandStateCountsMap.put("errorCommandState",errorExecutionStatus.getCount()); + dataMap.put(errorExecutionStatus.getExecutionStatus(),errorCommandStateCountsMap); + } + + result.put(Constants.DATA_LIST, dataMap); + putMsg(result, Status.SUCCESS); + return result; + } + + /** + * count queue state + * @param loginUser + * @param projectId + * @return + */ + public Map countQueueState(User loginUser, int projectId) { + Map result = new HashMap<>(5); + if(projectId != 0){ + Project project = projectMapper.queryById(projectId); + result = projectService.checkProjectAndAuth(loginUser, project, String.valueOf(projectId)); + + if (getResultStatus(result)){ + return result; + } + } + + ITaskQueue tasksQueue = TaskQueueFactory.getTaskQueueInstance(); + List tasksQueueList = tasksQueue.getAllTasks(cn.escheduler.common.Constants.SCHEDULER_TASKS_QUEUE); + List tasksKillList = tasksQueue.getAllTasks(cn.escheduler.common.Constants.SCHEDULER_TASKS_KILL); + + Map dataMap = new HashMap<>(); + if (loginUser.getUserType() == UserType.ADMIN_USER){ + dataMap.put("taskQueue",tasksQueueList.size()); + dataMap.put("taskKill",tasksKillList.size()); + + result.put(Constants.DATA_LIST, dataMap); + putMsg(result, Status.SUCCESS); + return result; + } + + int[] tasksQueueIds = new int[tasksQueueList.size()]; + int[] tasksKillIds = new int[tasksKillList.size()]; + + int i =0; + for (String taskQueueStr : tasksQueueList){ + if (StringUtils.isNotEmpty(taskQueueStr)){ + String[] splits = taskQueueStr.split("_"); + if (splits.length == 4){ + tasksQueueIds[i++]=Integer.parseInt(splits[3]); + } + } + } + + i = 0; + for (String taskKillStr : tasksKillList){ + if (StringUtils.isNotEmpty(taskKillStr)){ + String[] splits = taskKillStr.split("_"); + if (splits.length == 2){ + tasksKillIds[i++]=Integer.parseInt(splits[1]); + } + } + } + + Integer taskQueueCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksQueueIds); + Integer taskKillCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksQueueIds); + + dataMap.put("taskQueue",taskQueueCount); + dataMap.put("taskKill",taskKillCount); + + result.put(Constants.DATA_LIST, dataMap); + putMsg(result, Status.SUCCESS); + return result; + } } diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapper.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapper.java index 4f5e371ed4..a577e99a75 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapper.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapper.java @@ -18,12 +18,15 @@ package cn.escheduler.dao.mapper; import cn.escheduler.common.enums.*; import cn.escheduler.dao.model.Command; +import cn.escheduler.dao.model.ExecuteStatusCount; import org.apache.ibatis.annotations.*; import org.apache.ibatis.type.EnumOrdinalTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.Timestamp; +import java.util.Date; import java.util.List; +import java.util.Map; /** * command mapper @@ -103,4 +106,17 @@ public interface CommandMapper { @SelectProvider(type = CommandMapperProvider.class, method = "queryAllCommand") List queryAllCommand(); + + + @Results(value = { + @Result(property = "state", column = "state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ExecutionStatus.class, jdbcType = JdbcType.TINYINT), + @Result(property = "count", column = "count", javaType = Integer.class, jdbcType = JdbcType.INTEGER), + }) + @SelectProvider(type = CommandMapperProvider.class, method = "countCommandState") + List countCommandState( + @Param("userId") int userId, + @Param("userType") UserType userType, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime, + @Param("projectId") int projectId); } diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapperProvider.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapperProvider.java index 8f11c8af26..e32f047125 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapperProvider.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapperProvider.java @@ -139,6 +139,35 @@ public class CommandMapperProvider { }.toString(); } + /** + * + * count command type + * @param parameter + * @return + */ + public String countCommandState(Map parameter){ + return new SQL(){ + { + SELECT ("command_type as state,COUNT(*) AS count"); + FROM(TABLE_NAME + " cmd,t_escheduler_process_definition process"); + WHERE("cmd.process_definition_id = process.id"); + if(parameter.get("projectId") != null && (int)parameter.get("projectId") != 0){ + WHERE( "process.project_id = #{projectId} "); + }else{ + if(parameter.get("userType") != null && String.valueOf(parameter.get("userType")) == "GENERAL_USER") { + AND(); + WHERE("process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} " + + "union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )"); + + } + } + WHERE("cmd.start_time >= #{startTime} and cmd.update_time <= #{endTime}"); + GROUP_BY("cmd.command_type"); + } + }.toString(); + } + + } diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapper.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapper.java index 5c702acf79..c7574c926e 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapper.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapper.java @@ -19,11 +19,13 @@ package cn.escheduler.dao.mapper; import cn.escheduler.common.enums.*; import cn.escheduler.dao.model.Command; import cn.escheduler.dao.model.ErrorCommand; +import cn.escheduler.dao.model.ExecuteStatusCount; import org.apache.ibatis.annotations.*; import org.apache.ibatis.type.EnumOrdinalTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.Timestamp; +import java.util.Date; import java.util.List; /** @@ -41,5 +43,17 @@ public interface ErrorCommandMapper { @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "errorCommand.id", before = false, resultType = int.class) int insert(@Param("errorCommand") ErrorCommand errorCommand); + @Results(value = { + @Result(property = "state", column = "state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ExecutionStatus.class, jdbcType = JdbcType.TINYINT), + @Result(property = "count", column = "count", javaType = Integer.class, jdbcType = JdbcType.INTEGER), + }) + @SelectProvider(type = ErrorCommandMapperProvider.class, method = "countCommandState") + List countCommandState( + @Param("userId") int userId, + @Param("userType") UserType userType, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime, + @Param("projectId") int projectId); + } diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapperProvider.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapperProvider.java index d5c3f992c7..46cec52aa8 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapperProvider.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapperProvider.java @@ -38,4 +38,32 @@ public class ErrorCommandMapperProvider { } }.toString(); } + + /** + * + * count command type + * @param parameter + * @return + */ + public String countCommandState(Map parameter){ + return new SQL(){ + { + SELECT("command_type as state,COUNT(*) AS count"); + FROM(TABLE_NAME + " cmd,t_escheduler_process_definition process"); + WHERE("cmd.process_definition_id = process.id"); + if(parameter.get("projectId") != null && (int)parameter.get("projectId") != 0){ + WHERE( "process.project_id = #{projectId} "); + }else{ + if(parameter.get("userType") != null && String.valueOf(parameter.get("userType")) == "GENERAL_USER") { + AND(); + WHERE("process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} " + + "union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )"); + + } + } + WHERE("cmd.start_time >= #{startTime} and cmd.update_time <= #{endTime}"); + GROUP_BY("cmd.command_type"); + } + }.toString(); + } } diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapper.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapper.java index e7838e7730..c3d44440d2 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapper.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapper.java @@ -304,4 +304,18 @@ public interface TaskInstanceMapper { @SelectProvider(type = TaskInstanceMapperProvider.class, method = "queryByInstanceIdAndName") TaskInstance queryByInstanceIdAndName(@Param("processInstanceId") int processInstanceId, @Param("name") String name); + + + /** + * count task + * @param userId + * @param userType + * @param projectId + * @return + */ + @SelectProvider(type = TaskInstanceMapperProvider.class, method = "countTask") + Integer countTask(@Param("userId") int userId, + @Param("userType") UserType userType, + @Param("projectId") int projectId, + @Param("taskIds") int[] taskIds); } diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapperProvider.java b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapperProvider.java index 09ffb0125b..141b152568 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapperProvider.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapperProvider.java @@ -185,7 +185,7 @@ public class TaskInstanceMapperProvider { { SELECT ("state, count(0) as count"); FROM(TABLE_NAME + " t"); - LEFT_OUTER_JOIN(DEFINE_TABLE_NAME+ " d on d.id=t.process_definition_id"); + LEFT_OUTER_JOIN(DEFINE_TABLE_NAME + " d on d.id=t.process_definition_id"); LEFT_OUTER_JOIN("t_escheduler_project p on p.id=d.project_id"); if(parameter.get("projectId") != null && (int)parameter.get("projectId") != 0){ WHERE( "p.id = #{projectId} "); @@ -404,4 +404,42 @@ public class TaskInstanceMapperProvider { } + /** + * + * count task + * @param parameter + * @return + */ + public String countTask(Map parameter){ + + StringBuffer taskIdsStr = new StringBuffer(); + int[] stateArray = (int[]) parameter.get("taskIds"); + for(int i=0;i NOW()"); } }.toString(); } diff --git a/escheduler-dao/src/main/java/cn/escheduler/dao/model/ExecuteStatusCount.java b/escheduler-dao/src/main/java/cn/escheduler/dao/model/ExecuteStatusCount.java index e85af98bbb..cf2140e89a 100644 --- a/escheduler-dao/src/main/java/cn/escheduler/dao/model/ExecuteStatusCount.java +++ b/escheduler-dao/src/main/java/cn/escheduler/dao/model/ExecuteStatusCount.java @@ -50,4 +50,12 @@ public class ExecuteStatusCount { public void setCount(int count) { this.count = count; } + + @Override + public String toString() { + return "ExecuteStatusCount{" + + "state=" + state + + ", count=" + count + + '}'; + } } diff --git a/escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue b/escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue index 3c08497b23..78883c6baf 100644 --- a/escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue +++ b/escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue @@ -474,5 +474,5 @@ diff --git a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue index b7875a6fde..e2d0a80b54 100644 --- a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue +++ b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue @@ -33,7 +33,7 @@ import disabledState from '@/module/mixin/disabledState' export default { - name: 'select-input', + name: 'form-select-input', data () { return { isIconState: false, diff --git a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue index 74e18b2efb..f2658d4c6e 100644 --- a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue +++ b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue @@ -46,7 +46,7 @@ import disabledState from '@/module/mixin/disabledState' export default { - name: 'timeout-alarm', + name: 'form-timeout-alarm', data () { return { // Timeout display hiding diff --git a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/workerGroups.vue b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/workerGroups.vue new file mode 100644 index 0000000000..09f5363924 --- /dev/null +++ b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/workerGroups.vue @@ -0,0 +1,46 @@ + + diff --git a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.scss b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.scss new file mode 100644 index 0000000000..49f0d9c630 --- /dev/null +++ b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.scss @@ -0,0 +1,109 @@ +.form-model-model { + width: 720px; + position: relative; + .title-box { + height: 61px; + border-bottom: 1px solid #DCDEDC; + position: relative; + .name { + position: absolute; + left: 24px; + top: 18px; + font-size: 16px; + } + .go-subtask { + position: absolute; + right: 30px; + top: 17px; + a { + font-size: 14px; + color: #0097e0; + margin-left: 10px; + i.iconfont { + font-size: 18px; + vertical-align: middle; + } + em { + color: #333; + vertical-align: middle; + font-style: normal; + vertical-align: middle; + padding-left: 2px; + } + &:hover { + em { + text-decoration: underline; + } + } + } + } + } + .bottom-box { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + text-align: right; + height: 60px; + line-height: 60px; + border-top: 1px solid #DCDEDC; + background: #fff; + .submit { + padding-right: 20px; + position: relative; + z-index: 9; + } + } + .content-box { + overflow-y: scroll; + height: calc(100vh - 61px); + padding-bottom: 60px; + } +} +.from-model { + padding-top: 26px; + >div { + clear: both; + } + .list { + position: relative; + margin-bottom: 10px; + .text-box { + width: 112px; + float: left; + text-align: right; + margin-right: 8px; + >span { + font-size: 14px; + color: #777; + display: inline-block; + padding-top: 6px; + } + } + .cont-box { + width: 580px; + float: left; + .label-box { + width: 100%; + } + .text-b { + font-size: 14px; + color: #777; + display: inline-block; + padding:0 6px 0 20px; + } + } + .add { + line-height: 32px; + a { + color: #0097e0; + } + } + &:hover { + } + .list-t { + width: 50%; + float: left; + } + } +} \ No newline at end of file diff --git a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue index 98d2234450..a0cdc36713 100644 --- a/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue +++ b/escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue @@ -13,7 +13,6 @@
-
{{$t('Node name')}}
@@ -51,7 +50,6 @@ {{$t('Description')}}
-
- + + + + Worker分组 +
@@ -178,15 +178,16 @@ import mShell from './tasks/shell' import mSpark from './tasks/spark' import mPython from './tasks/python' - import { isNameExDag, rtBantpl } from './../plugIn/util' import JSP from './../plugIn/jsPlumbHandle' import mProcedure from './tasks/procedure' import mDependent from './tasks/dependent' import mSubProcess from './tasks/sub_process' import mSelectInput from './_source/selectInput' import mTimeoutAlarm from './_source/timeoutAlarm' + import mWorkerGroups from './_source/workerGroups' import clickoutside from '@/module/util/clickoutside' import disabledState from '@/module/mixin/disabledState' + import { isNameExDag, rtBantpl } from './../plugIn/util' import mPriority from '@/module/components/priority/priority' export default { @@ -218,7 +219,9 @@ // Task timeout alarm timeout: {}, // Task priority - taskInstancePriority: 'MEDIUM' + taskInstancePriority: 'MEDIUM', + // worker group id + workerGroupId: null } }, /** @@ -349,7 +352,8 @@ maxRetryTimes: this.maxRetryTimes, retryInterval: this.retryInterval, timeout: this.timeout, - taskInstancePriority: this.taskInstancePriority + taskInstancePriority: this.taskInstancePriority, + workerGroupId: this.workerGroupId }, fromThis: this }) @@ -420,6 +424,7 @@ this.desc = o.desc this.maxRetryTimes = o.maxRetryTimes this.retryInterval = o.retryInterval + this.workerGroupId = o.workerGroupId } } this.isContentBox = true @@ -451,119 +456,12 @@ mDependent, mSelectInput, mTimeoutAlarm, - mPriority + mPriority, + mWorkerGroups } } diff --git a/escheduler-ui/src/js/conf/home/pages/dag/definitionDetails.vue b/escheduler-ui/src/js/conf/home/pages/dag/definitionDetails.vue index c4ee4d79d9..e377ebfa7f 100644 --- a/escheduler-ui/src/js/conf/home/pages/dag/definitionDetails.vue +++ b/escheduler-ui/src/js/conf/home/pages/dag/definitionDetails.vue @@ -26,6 +26,7 @@ methods: { ...mapMutations('dag', ['resetParams', 'setIsDetails']), ...mapActions('dag', ['getProcessList', 'getResourcesList', 'getProcessDetails']), + ...mapActions('security', ['getWorkerGroupsAll']), /** * init */ @@ -40,7 +41,9 @@ // get process definition this.getProcessList(), // get resource - this.getResourcesList() + this.getResourcesList(), + // get worker group list + this.getWorkerGroupsAll() ]).then((data) => { let item = data[0] this.setIsDetails(item.releaseState === 'ONLINE') diff --git a/escheduler-ui/src/js/conf/home/pages/dag/index.vue b/escheduler-ui/src/js/conf/home/pages/dag/index.vue index 6e2c0a2b23..b9aee791dd 100644 --- a/escheduler-ui/src/js/conf/home/pages/dag/index.vue +++ b/escheduler-ui/src/js/conf/home/pages/dag/index.vue @@ -25,6 +25,7 @@ methods: { ...mapMutations('dag', ['resetParams']), ...mapActions('dag', ['getProcessList', 'getResourcesList']), + ...mapActions('security', ['getWorkerGroupsAll']), /** * init */ @@ -37,7 +38,9 @@ // get process definition this.getProcessList(), // get resource - this.getResourcesList() + this.getResourcesList(), + // get worker group list + this.getWorkerGroupsAll() ]).then((data) => { this.isLoading = false // Whether to pop up the box? diff --git a/escheduler-ui/src/js/conf/home/pages/dag/instanceDetails.vue b/escheduler-ui/src/js/conf/home/pages/dag/instanceDetails.vue index 49ca838237..3e6c49c1f6 100644 --- a/escheduler-ui/src/js/conf/home/pages/dag/instanceDetails.vue +++ b/escheduler-ui/src/js/conf/home/pages/dag/instanceDetails.vue @@ -26,6 +26,7 @@ methods: { ...mapMutations('dag', ['setIsDetails', 'resetParams']), ...mapActions('dag', ['getProcessList', 'getResourcesList', 'getInstancedetail']), + ...mapActions('security', ['getWorkerGroupsAll']), /** * init */ @@ -40,7 +41,9 @@ // get process definition this.getProcessList(), // get resources - this.getResourcesList() + this.getResourcesList(), + // get worker group list + this.getWorkerGroupsAll() ]).then((data) => { let item = data[0] let flag = false diff --git a/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/createWorker.vue b/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/createWorker.vue new file mode 100644 index 0000000000..ff3d20be24 --- /dev/null +++ b/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/createWorker.vue @@ -0,0 +1,118 @@ + + + \ No newline at end of file diff --git a/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/list.vue b/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/list.vue new file mode 100644 index 0000000000..9597e0fa9a --- /dev/null +++ b/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/list.vue @@ -0,0 +1,119 @@ + + \ No newline at end of file diff --git a/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/index.vue b/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/index.vue new file mode 100644 index 0000000000..d962b937c5 --- /dev/null +++ b/escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/index.vue @@ -0,0 +1,114 @@ + + diff --git a/escheduler-ui/src/js/conf/home/router/index.js b/escheduler-ui/src/js/conf/home/router/index.js index 7dda210065..37e9d43c0d 100644 --- a/escheduler-ui/src/js/conf/home/router/index.js +++ b/escheduler-ui/src/js/conf/home/router/index.js @@ -317,6 +317,14 @@ const router = new Router({ meta: { title: `${i18n.$t('Queue manage')}` } + }, + { + path: '/security/worker-groups', + name: 'worker-groups-manage', + component: resolve => require(['../pages/security/pages/workerGroups/index'], resolve), + meta: { + title: `workerGroups` + } } ] }, diff --git a/escheduler-ui/src/js/conf/home/store/security/actions.js b/escheduler-ui/src/js/conf/home/store/security/actions.js index ac8ac20358..be0b1a2226 100644 --- a/escheduler-ui/src/js/conf/home/store/security/actions.js +++ b/escheduler-ui/src/js/conf/home/store/security/actions.js @@ -413,5 +413,48 @@ export default { reject(e) }) }) + }, + /** + * get worker groups + */ + getWorkerGroups ({ state }, payload) { + return new Promise((resolve, reject) => { + io.get(`worker-group/list-paging`, payload, res => { + resolve(res.data) + }).catch(e => { + reject(e) + }) + }) + }, + /** + * get worker groups all + */ + getWorkerGroupsAll ({ state }, payload) { + return new Promise((resolve, reject) => { + io.get(`worker-group/all-groups`, payload, res => { + state.workerGroupsListAll = res.data + resolve(res.data) + }).catch(e => { + reject(e) + }) + }) + }, + saveWorkerGroups ({ state }, payload) { + return new Promise((resolve, reject) => { + io.post(`worker-group/save`, payload, res => { + resolve(res) + }).catch(e => { + reject(e) + }) + }) + }, + deleteWorkerGroups ({ state }, payload) { + return new Promise((resolve, reject) => { + io.get(`worker-group/delete-by-id`, payload, res => { + resolve(res) + }).catch(e => { + reject(e) + }) + }) } } diff --git a/escheduler-ui/src/js/conf/home/store/security/state.js b/escheduler-ui/src/js/conf/home/store/security/state.js index ddcb8e289d..be52d7838c 100644 --- a/escheduler-ui/src/js/conf/home/store/security/state.js +++ b/escheduler-ui/src/js/conf/home/store/security/state.js @@ -15,5 +15,5 @@ * limitations under the License. */ export default { - + workerGroupsListAll: [] } diff --git a/escheduler-ui/src/js/module/components/priority/priority.vue b/escheduler-ui/src/js/module/components/priority/priority.vue index 1fd0f98be1..50473ec02c 100644 --- a/escheduler-ui/src/js/module/components/priority/priority.vue +++ b/escheduler-ui/src/js/module/components/priority/priority.vue @@ -91,6 +91,7 @@