Переглянути джерело

调整应用配置相关的前端页面,调整监控报警接口

reghao 4 роки тому
батько
коміт
e8c5df3884
16 змінених файлів з 254 додано та 186 видалено
  1. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/EnvType.java
  2. 6 22
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/NewApp.java
  3. 19 26
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java
  4. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorPageController.java
  5. 51 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/AppMonitorService.java
  6. 50 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MachineMonitorService.java
  7. 74 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorListService.java
  8. 27 21
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorScheduler.java
  9. 8 63
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorService.java
  10. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectDictAttrProcessor.java
  11. 1 1
      dmaster/src/main/resources/templates/app/bd/build.html
  12. 2 33
      dmaster/src/main/resources/templates/app/config/app/copy.html
  13. 8 6
      dmaster/src/main/resources/templates/app/config/app/detail.html
  14. 3 3
      dmaster/src/main/resources/templates/app/config/app/index.html
  15. 0 6
      dmaster/src/main/resources/templates/monitor/machinemonitor.html
  16. 1 1
      dmaster/src/test/java/cn/reghao/autodop/dmaster/monitor/service/MonitorServiceTest.java

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/EnvType.java

@@ -7,7 +7,7 @@ package cn.reghao.autodop.dmaster.app.constant;
  * @date 2019-10-18 14:31:29
  */
 public enum EnvType {
-    dev,test,preprod,prod;
+    dev,test,uat,prod;
 
     public String getName() {
         return this.name();

+ 6 - 22
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/NewApp.java

@@ -13,32 +13,19 @@ import java.util.Collections;
  */
 @Data
 public class NewApp {
-    @NotBlank(message = "ID 不能为空白字符串")
+    @NotBlank(message = "应用 ID 不能为空白字符串")
     private String newId;
-    @NotBlank(message = "名字不能为空白字符串")
-    private String newName;
-    private String newDescription;
-    @NotBlank(message = "仓库不能为空白字符串")
-    private String newRepo;
     @NotBlank(message = "仓库分支不能为空白字符串")
     private String newRepoBranch;
-    @NotBlank(message = "代码目录不能为空白字符串")
-    private String newCodeDirname;
-    private String newCompileHome;
-    private String newPackScript;
+    @NotBlank(message = "应用环境不能为空白字符串")
+    private String env;
 
     public AppOrchestration app(AppOrchestration from) {
         from.setAppId(newId);
-        from.setAppName(newName);
-        from.setDescription(newDescription);
-        from.setAppRepo(newRepo);
         from.setRepoBranch(newRepoBranch);
-        from.setCodeDirname(newCodeDirname);
-        from.setCompileHome(newCompileHome);
-        from.setPackScript(newPackScript);
-        //from.setNotifyReceivers(Collections.emptyList());
+        from.setEnv(env);
+        from.setNotifyGroups(Collections.emptyList());
         from.setDeployConfigs(Collections.emptyList());
-        from.setRunningConfig(null);
 
         from.setId(null);
         from.setCreateTime(null);
@@ -48,11 +35,8 @@ public class NewApp {
 
     public ProjOrchestration proj(ProjOrchestration from) {
         from.setProjId(newId);
-        from.setProjName(newName);
-        from.setDescription(newDescription);
-        from.setProjRepo(newRepo);
         from.setRepoBranch(newRepoBranch);
-        from.setCodeDirname(newCodeDirname);
+        from.setEnv(env);
 
         from.setId(null);
         from.setCreateTime(null);

+ 19 - 26
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java

@@ -9,6 +9,7 @@ import cn.reghao.autodop.dmaster.monitor.entity.MonitorType;
 import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.service.MonitorScheduler;
+import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
@@ -20,8 +21,8 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.io.IOException;
 import java.util.List;
-import java.util.Map;
 
 /**
  * @author reghao
@@ -32,13 +33,20 @@ import java.util.Map;
 @RestController
 @RequestMapping("/api/monitor")
 public class MonitorController {
+    private MonitorService<MachineMonitor> machineMonitorService;
+    private MonitorService<AppMonitor> appMonitorService;
+
     private MonitorScheduler monitorScheduler;
     private MachineMonitorRepository machineMonitorRepository;
     private AppMonitorRepository appMonitorRepository;
 
-    public MonitorController(MonitorScheduler monitorScheduler,
+    public MonitorController(MonitorService<MachineMonitor> machineMonitorService,
+                             MonitorService<AppMonitor> appMonitorService,
+                             MonitorScheduler monitorScheduler,
                              MachineMonitorRepository machineMonitorRepository,
                              AppMonitorRepository appMonitorRepository) {
+        this.machineMonitorService = machineMonitorService;
+        this.appMonitorService = appMonitorService;
         this.monitorScheduler = monitorScheduler;
         this.machineMonitorRepository = machineMonitorRepository;
         this.appMonitorRepository = appMonitorRepository;
@@ -55,13 +63,12 @@ public class MonitorController {
         switch (MonitorType.valueOf(monitorType)) {
             case machine:
                 MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
-                machineMonitor.setNotifyGroups(notifyGroups);
-                machineMonitorRepository.save(machineMonitor);
+                notifyGroups.forEach(notifyGroup ->
+                        machineMonitorService.setMonitorNotify(machineMonitor, notifyGroup));
                 break;
             case app:
                 AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
-                appMonitor.setNotifyGroups(notifyGroups);
-                appMonitorRepository.save(appMonitor);
+                notifyGroups.forEach(notifyGroup -> appMonitorService.setMonitorNotify(appMonitor, notifyGroup));
                 break;
             default:
         }
@@ -72,32 +79,15 @@ public class MonitorController {
     @PostMapping(value = "/{monitorType}/job/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<String> machineMonitorJob(@PathVariable("monitorType") String monitorType,
                                                     @PathVariable("id") Integer id,
-                                                    @Valid MonitorJob monitorJob) throws SchedulerException {
+                                                    @Valid MonitorJob monitorJob) throws SchedulerException, IOException {
         switch (MonitorType.valueOf(monitorType)) {
             case machine:
                 MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
-                String jobId = String.format("%s-%s", machineMonitor.getMachineId(), monitorJob.getJobClassName());
-                monitorJob.setJobId(jobId);
-                monitorJob.setEnable(true);
-
-                Map<String, MonitorJob> monitorJobs = machineMonitor.getJobMap();
-                monitorJobs.put(monitorJob.getJobId(), monitorJob);
-                // TODO 这两个操作应该在一个事务中
-                monitorScheduler.addMachineHeartbeatCheckJob(machineMonitor);
-                machineMonitorRepository.save(machineMonitor);
+                machineMonitorService.addMonitorJob(machineMonitor, monitorJob);
                 break;
             case app:
                 AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
-                String jobId1 = String.format("%s-%s-%s",
-                        appMonitor.getAppId(), appMonitor.getMachineId(), monitorJob.getJobClassName());
-                monitorJob.setJobId(jobId1);
-                monitorJob.setEnable(true);
-
-                Map<String, MonitorJob> monitorJobs1 = appMonitor.getJobMap();
-                monitorJobs1.put(monitorJob.getJobId(), monitorJob);
-                // TODO 这两个操作应该在一个事务中
-                monitorScheduler.addAppHealthCheckJob(appMonitor);
-                appMonitorRepository.save(appMonitor);
+                appMonitorService.addMonitorJob(appMonitor, monitorJob);
                 break;
             default:
         }
@@ -116,6 +106,9 @@ public class MonitorController {
             case machine:
                 MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
                 MonitorJob monitorJob = machineMonitor.getJobMap().get(jobId);
+                boolean enable = "enable".equals(status);
+                machineMonitorService.changeMonitorStatus(machineMonitor, monitorJob, enable);
+
                 result = changeJobStatus(monitorJob, status);
                 if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
                     return ResponseEntity.ok().body(WebBody.failWithMsg("操作失败"));

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorPageController.java

@@ -60,8 +60,8 @@ public class MonitorPageController {
                 model.addAttribute("list", pageList.getList());
                 return "/monitor/machinemonitor";
             case app:
-                Page<MachineMonitor> page1 = machineMonitorRepository.findAll(pageRequest);
-                PageList<MachineMonitor> pageList1 = PageList.pageList(page1);
+                Page<AppMonitor> page1 = appMonitorRepository.findAll(pageRequest);
+                PageList<AppMonitor> pageList1 = PageList.pageList(page1);
 
                 model.addAttribute("page", page1);
                 model.addAttribute("list", pageList1.getList());

+ 51 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/AppMonitorService.java

@@ -0,0 +1,51 @@
+package cn.reghao.autodop.dmaster.monitor.service;
+
+import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
+import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
+import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
+import org.quartz.SchedulerException;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2020-10-22 17:51:56
+ */
+@Service
+public class AppMonitorService implements MonitorService<AppMonitor> {
+    private MonitorScheduler monitorScheduler;
+    private AppMonitorRepository appMonitorRepository;
+
+    public AppMonitorService(MonitorScheduler monitorScheduler,
+                             AppMonitorRepository appMonitorRepository) {
+        this.monitorScheduler = monitorScheduler;
+        this.appMonitorRepository = appMonitorRepository;
+    }
+
+    @Override
+    public void setMonitorNotify(AppMonitor monitor, NotifyGroup notifyGroup) {
+        monitor.getNotifyGroups().add(notifyGroup);
+        appMonitorRepository.save(monitor);
+    }
+
+    @Override
+    public void addMonitorJob(AppMonitor monitor, MonitorJob monitorJob) throws IOException, SchedulerException {
+        String jobId1 = String.format("%s-%s-%s",
+                monitor.getAppId(), monitor.getMachineId(), monitorJob.getJobClassName());
+        monitorJob.setJobId(jobId1);
+        monitorJob.setEnable(true);
+
+        Map<String, MonitorJob> monitorJobs1 = monitor.getJobMap();
+        monitorJobs1.put(monitorJob.getJobId(), monitorJob);
+        // TODO 这两个操作应该在一个事务中
+        monitorScheduler.addAppMonitorJob(monitor, jobId1);
+        appMonitorRepository.save(monitor);
+    }
+
+    @Override
+    public void changeMonitorStatus(AppMonitor monitor, MonitorJob monitorJob, Boolean enable) {
+    }
+}

+ 50 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MachineMonitorService.java

@@ -0,0 +1,50 @@
+package cn.reghao.autodop.dmaster.monitor.service;
+
+import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
+import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
+import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
+import org.quartz.SchedulerException;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2020-10-22 17:51:56
+ */
+@Service
+public class MachineMonitorService implements MonitorService<MachineMonitor> {
+    private MonitorScheduler monitorScheduler;
+    private MachineMonitorRepository machineMonitorRepository;
+
+    public MachineMonitorService(MonitorScheduler monitorScheduler,
+                                 MachineMonitorRepository machineMonitorRepository) {
+        this.monitorScheduler = monitorScheduler;
+        this.machineMonitorRepository = machineMonitorRepository;
+    }
+
+    @Override
+    public void setMonitorNotify(MachineMonitor monitor, NotifyGroup notifyGroup) {
+        monitor.getNotifyGroups().add(notifyGroup);
+        machineMonitorRepository.save(monitor);
+    }
+
+    @Override
+    public void addMonitorJob(MachineMonitor monitor, MonitorJob monitorJob) throws IOException, SchedulerException {
+        String jobId = String.format("%s-%s", monitor.getMachineId(), monitorJob.getJobClassName());
+        monitorJob.setJobId(jobId);
+        monitorJob.setEnable(true);
+
+        Map<String, MonitorJob> monitorJobs = monitor.getJobMap();
+        monitorJobs.put(monitorJob.getJobId(), monitorJob);
+        // TODO 这两个操作应该在一个事务中
+        monitorScheduler.addMachineMonitorJob(monitor, jobId);
+        machineMonitorRepository.save(monitor);
+    }
+
+    @Override
+    public void changeMonitorStatus(MachineMonitor monitor, MonitorJob monitorJob, Boolean enable) {
+    }
+}

+ 74 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorListService.java

@@ -0,0 +1,74 @@
+package cn.reghao.autodop.dmaster.monitor.service;
+
+import cn.reghao.autodop.dmaster.app.entity.AppRunning;
+import cn.reghao.autodop.dmaster.app.repository.AppRunningRepository;
+import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
+import cn.reghao.autodop.dmaster.machine.repository.MachineInfoRepository;
+import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
+import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
+import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
+import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2020-10-22 17:51:56
+ */
+@Service
+public class MonitorListService {
+    private MachineInfoRepository infoRepository;
+    private AppRunningRepository runningRepository;
+    private MachineMonitorRepository machineMonitorRepository;
+    private AppMonitorRepository appMonitorRepository;
+
+    public MonitorListService(MachineInfoRepository infoRepository,
+                              AppRunningRepository runningRepository,
+                              MachineMonitorRepository machineMonitorRepository,
+                              AppMonitorRepository appMonitorRepository) {
+        this.infoRepository = infoRepository;
+        this.runningRepository = runningRepository;
+        this.machineMonitorRepository = machineMonitorRepository;
+        this.appMonitorRepository = appMonitorRepository;
+    }
+
+    public void refresh() {
+        refreshMachines();
+        refreshApps();
+    }
+
+    private void refreshMachines() {
+        List<MachineInfo> machineInfos = infoRepository.findAll();
+        List<MachineMonitor> machineMonitors = machineInfos.stream()
+                .map(machineInfo -> {
+                    String machineId = machineInfo.getMachineId();
+                    MachineMonitor machineMonitor = machineMonitorRepository.findByMachineId(machineId);
+                    if (machineMonitor == null) {
+                        machineMonitor = new MachineMonitor(machineInfo);
+                    }
+                    return machineMonitor;
+                })
+                .collect(Collectors.toList());
+        machineMonitorRepository.saveAll(machineMonitors);
+    }
+
+    private void refreshApps() {
+        List<AppRunning> appRunnings = runningRepository.findAll();
+        List<AppMonitor> appMonitors = appRunnings.stream()
+                .map(appRunning -> {
+                    String appId = appRunning.getAppId();
+                    String machineId = appRunning.getMachineId();
+                    AppMonitor appMonitor = appMonitorRepository.findByAppIdAndMachineId(appId, machineId);
+                    if (appMonitor == null) {
+                        appMonitor = new AppMonitor(appRunning);
+                    } else {
+                        appMonitor.update(appRunning);
+                    }
+                    return appMonitor;
+                })
+                .collect(Collectors.toList());
+        appMonitorRepository.saveAll(appMonitors);
+    }
+}

+ 27 - 21
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorScheduler.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.monitor.service;
 
 import cn.reghao.autodop.common.http.DefaultWebRequest;
 import cn.reghao.autodop.common.http.WebRequest;
+import cn.reghao.autodop.dmaster.DmasterApplication;
 import cn.reghao.autodop.dmaster.machine.db.crud.MachineStatusCrudService;
 import cn.reghao.autodop.dmaster.app.repository.AppRunningRepository;
 import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
@@ -9,15 +10,16 @@ import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
-import cn.reghao.autodop.dmaster.monitor.service.job.machine.MachineHeartbeatCheckJob;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
 import cn.reghao.autodop.dmaster.notification.service.NotifyService;
+import cn.reghao.autodop.dmaster.utils.clazz.PackageScanner;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
 import org.quartz.impl.StdSchedulerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -36,6 +38,7 @@ public class MonitorScheduler {
     private WebRequest webRequest;
     private MachineMonitorRepository machineMonitorRepository;
     private AppMonitorRepository appMonitorRepository;
+    private PackageScanner packageScanner = new PackageScanner();
 
     public MonitorScheduler(NotifyService notifyService,
                             AppRunningRepository runningRepository,
@@ -78,35 +81,26 @@ public class MonitorScheduler {
         }
     }
 
-    public void addMonitorJob(MonitorJob monitorJob, List<NotifyGroup> notifyGroups) {
-        /*String jobId = monitorJob.getJobId();
-        String cronExp = monitorJob.getCronExp();
-
-        JobDataMap jobDataMap = new JobDataMap();
-        jobDataMap.put("notifyService", notifyService);
-        jobDataMap.put("notifyGroups", notifyGroups);
-        jobDataMap.put("machineId", machineMonitor.getMachineId());
-        jobDataMap.put("statusCrudService", statusCrudService);
-        addAndStart(MachineHeartbeatCheckJob.class, jobId, cronExp, jobDataMap);*/
-    }
-
-    public void addMachineHeartbeatCheckJob(MachineMonitor machineMonitor) throws SchedulerException {
-        /*String jobId = machineMonitor.getJobId();
-        String cronExp = machineMonitor.getCronExp();
+    public void addMachineMonitorJob(MachineMonitor machineMonitor, String jobId)
+            throws SchedulerException, IOException {
+        MonitorJob monitorJob = machineMonitor.getJobMap().get(jobId);
         List<NotifyGroup> notifyGroups = machineMonitor.getNotifyGroups();
+        String cronExp = monitorJob.getCronExp();
+        Class jobClass = findClassBySimpleName(monitorJob.getJobClassName());
 
         JobDataMap jobDataMap = new JobDataMap();
         jobDataMap.put("notifyService", notifyService);
         jobDataMap.put("notifyGroups", notifyGroups);
         jobDataMap.put("machineId", machineMonitor.getMachineId());
         jobDataMap.put("statusCrudService", statusCrudService);
-        addAndStart(MachineHeartbeatCheckJob.class, jobId, cronExp, jobDataMap);*/
+        addAndStart(jobClass, jobId, cronExp, jobDataMap);
     }
 
-    public void addAppHealthCheckJob(AppMonitor appMonitor) throws SchedulerException {
-        /*String jobId = appMonitor.getJobId();
-        String cronExp = appMonitor.getCronExp();
+    public void addAppMonitorJob(AppMonitor appMonitor, String jobId) throws SchedulerException, IOException {
+        MonitorJob monitorJob = appMonitor.getJobMap().get(jobId);
         List<NotifyGroup> notifyGroups = appMonitor.getNotifyGroups();
+        String cronExp = monitorJob.getCronExp();
+        Class jobClass = findClassBySimpleName(monitorJob.getJobClassName());
 
         JobDataMap jobDataMap = new JobDataMap();
         jobDataMap.put("notifyService", notifyService);
@@ -115,7 +109,7 @@ public class MonitorScheduler {
         jobDataMap.put("appId", appMonitor.getAppId());
         jobDataMap.put("machineId", appMonitor.getMachineId());
         jobDataMap.put("runningRepository", runningRepository);
-        addAndStart(AppHealthCheckJob.class, jobId, cronExp, jobDataMap);*/
+        addAndStart(jobClass, jobId, cronExp, jobDataMap);
     }
 
     private void addAndStart(Class<? extends Job> clazz, String jobId, String cronExp, JobDataMap jobDataMap)
@@ -147,4 +141,16 @@ public class MonitorScheduler {
 
     public void remove(String jobId) {
     }
+
+    private Class findClassBySimpleName(String simpleName) throws IOException {
+        String jobPkg = "cn.reghao.autodop.dmaster.monitor.service.job";
+        List<Class<?>> classList = packageScanner.doScan(DmasterApplication.class, jobPkg);
+
+        for (Class<?> clazz : classList) {
+            if (clazz.getSimpleName().equals(simpleName)) {
+                return clazz;
+            }
+        }
+        return null;
+    }
 }

+ 8 - 63
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorService.java

@@ -1,72 +1,17 @@
 package cn.reghao.autodop.dmaster.monitor.service;
 
-import cn.reghao.autodop.dmaster.app.entity.AppRunning;
-import cn.reghao.autodop.dmaster.app.repository.AppRunningRepository;
-import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
-import cn.reghao.autodop.dmaster.machine.repository.MachineInfoRepository;
-import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
-import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
-import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
-import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
-import org.springframework.stereotype.Service;
+import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
+import org.quartz.SchedulerException;
 
-import java.util.List;
-import java.util.stream.Collectors;
+import java.io.IOException;
 
 /**
  * @author reghao
  * @date 2020-10-22 17:51:56
  */
-@Service
-public class MonitorService {
-    private MachineInfoRepository infoRepository;
-    private MachineMonitorRepository machineMonitorRepository;
-    private AppRunningRepository runningRepository;
-    private AppMonitorRepository appMonitorRepository;
-
-    public MonitorService(MachineInfoRepository infoRepository, MachineMonitorRepository machineMonitorRepository,
-                          AppRunningRepository runningRepository, AppMonitorRepository appMonitorRepository) {
-        this.infoRepository = infoRepository;
-        this.machineMonitorRepository = machineMonitorRepository;
-        this.runningRepository = runningRepository;
-        this.appMonitorRepository = appMonitorRepository;
-    }
-
-    public void refresh() {
-        refreshMachines();
-        refreshApps();
-    }
-
-    private void refreshMachines() {
-        List<MachineInfo> machineInfos = infoRepository.findAll();
-        List<MachineMonitor> machineMonitors = machineInfos.stream()
-                .map(machineInfo -> {
-                    String machineId = machineInfo.getMachineId();
-                    MachineMonitor machineMonitor = machineMonitorRepository.findByMachineId(machineId);
-                    if (machineMonitor == null) {
-                        machineMonitor = new MachineMonitor(machineInfo);
-                    }
-                    return machineMonitor;
-                })
-                .collect(Collectors.toList());
-        machineMonitorRepository.saveAll(machineMonitors);
-    }
-
-    private void refreshApps() {
-        List<AppRunning> appRunnings = runningRepository.findAll();
-        List<AppMonitor> appMonitors = appRunnings.stream()
-                .map(appRunning -> {
-                    String appId = appRunning.getAppId();
-                    String machineId = appRunning.getMachineId();
-                    AppMonitor appMonitor = appMonitorRepository.findByAppIdAndMachineId(appId, machineId);
-                    if (appMonitor == null) {
-                        appMonitor = new AppMonitor(appRunning);
-                    } else {
-                        appMonitor.update(appRunning);
-                    }
-                    return appMonitor;
-                })
-                .collect(Collectors.toList());
-        appMonitorRepository.saveAll(appMonitors);
-    }
+public interface MonitorService<T> {
+    void setMonitorNotify(T monitor, NotifyGroup notifyGroup);
+    void addMonitorJob(T monitor, MonitorJob monitorJob) throws IOException, SchedulerException;
+    void changeMonitorStatus(T monitor, MonitorJob monitorJob, Boolean enable);
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectDictAttrProcessor.java

@@ -32,7 +32,7 @@ public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
         localCache.put("ENVIRONMENT", new HashMap<>());
         localCache.get("ENVIRONMENT").put("dev", "dev");
         localCache.get("ENVIRONMENT").put("test", "test");
-        localCache.get("ENVIRONMENT").put("preprod", "preprod");
+        localCache.get("ENVIRONMENT").put("uat", "uat");
         localCache.get("ENVIRONMENT").put("prod", "prod");
     }
     

+ 1 - 1
dmaster/src/main/resources/templates/app/bd/build.html

@@ -73,7 +73,7 @@
                     <td th:text="${item.commitId}">当前构建版本</td>
                     <td th:text="${item.commitTime}">提交时间</td>
                     <td>
-                        <a class="open-popup" data-title="构建结果" data-size="640,480" href="#"
+                        <a class="open-popup" data-title="构建结果" data-size="1000,600" href="#"
                            th:text="${item.buildResult}" th:attr="data-url=@{'/app/log/build/'+${item.buildLogId} + '/result'}"></a>
                     </td>
                     <td th:text="${item.buildTime}">构建时间</td>

+ 2 - 33
dmaster/src/main/resources/templates/app/config/app/copy.html

@@ -6,31 +6,12 @@
 <body>
 <div class="layui-form timo-compile">
     <form th:action="@{'/api/app/config/app/copy/' + ${app.id}}">
-        <!--<input type="hidden" name="id" th:value="${app.id}"/>-->
         <div class="layui-form-item">
             <label class="layui-form-label required">新应用 ID</label>
             <div class="layui-input-inline">
                 <input class="layui-input" type="text" name="newId" placeholder="请输入新应用 ID">
             </div>
         </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">新应用名字</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="newName" placeholder="请输入新应用名字">
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">新应用描述</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="newDescription" placeholder="请输入新应用描述">
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">新应用仓库</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="newRepo" placeholder="请输入新应用仓库">
-            </div>
-        </div>
         <div class="layui-form-item">
             <label class="layui-form-label required">新应用仓库分支</label>
             <div class="layui-input-inline">
@@ -38,21 +19,9 @@
             </div>
         </div>
         <div class="layui-form-item">
-            <label class="layui-form-label required">新应用代码目录</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="newCodeDirname" placeholder="请输入新应用代码目录">
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">新应用编译主目录</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="newCompileHome" placeholder="请输入新应用编译主目录">
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label">新应用 Dockerfile</label>
+            <label class="layui-form-label required">新应用环境</label>
             <div class="layui-input-inline">
-                <textarea class="layui-textarea" name="newDockerfile" placeholder="打包类型是 docker 时才需要"></textarea>
+                <input class="layui-input" type="text" name="env" placeholder="请输入新应用环境">
             </div>
         </div>
         <div class="layui-form-item timo-finally">

+ 8 - 6
dmaster/src/main/resources/templates/app/config/app/detail.html

@@ -17,14 +17,14 @@
                 <td th:text="${app.appId}"></td>
                 <th>应用名称</th>
                 <td th:text="${app.appName}"></td>
+                <th>应用描述</th>
+                <td th:text="${app.description}"></td>
             </tr>
             <tr>
                 <th>所属环境</th>
                 <td th:text="${app.env}"></td>
                 <th>应用类型</th>
                 <td th:text="${app.appType}"></td>
-                <th>应用描述</th>
-                <td th:text="${app.description}"></td>
             </tr>
             <tr>
                 <th>应用仓库</th>
@@ -35,16 +35,18 @@
             </tbody>
         </table>
         <div class="timo-detail-title">通知配置</div>
-        <!--<table class="layui-table timo-detail-table">
+        <table class="layui-table timo-detail-table">
             <tbody>
             <tr th:each="item:${app.notifyGroups}">
+                <th>通知账户</th>
+                <td th:text="${item.notifyAccountId}"></td>
                 <th>通知类型</th>
                 <td th:text="${item.notifyType}"></td>
-                <th>通知接收地址</th>
-                <td th:text="${item.receiver}"></td>
+                <th>通知</th>
+                <td th:text="${item.groupId}"></td>
             </tr>
             </tbody>
-        </table>-->
+        </table>
         <div class="timo-detail-title">构建配置</div>
         <table class="layui-table timo-detail-table">
             <tbody>

+ 3 - 3
dmaster/src/main/resources/templates/app/config/app/index.html

@@ -65,10 +65,10 @@
                         <label class="timo-checkbox"><input type="checkbox">
                             <i class="layui-icon layui-icon-ok"></i></label>
                     </th>
-                    <th class="sortable" data-field="appName">应用</th>
+                    <th class="sortable" data-field="appName">应用名</th>
+                    <th class="sortable" data-field="appId">应用 ID</th>
                     <th class="sortable" data-field="env">环境</th>
                     <th class="sortable" data-field="repoBranch">分支</th>
-                    <th class="sortable" data-field="codeDirname">代码目录</th>
                     <th class="sortable" data-field="appType">应用类型</th>
                     <th class="sortable" data-field="repoAuth">仓库认证</th>
                     <th class="sortable" data-field="compiler">编译器</th>
@@ -82,9 +82,9 @@
                     <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
                         <i class="layui-icon layui-icon-ok"></i></label></td>
                     <td th:text="${item.appName}">应用名</td>
+                    <td th:text="${item.appId}">应用 ID</td>
                     <td th:text="${item.env}">环境</td>
                     <td th:text="${item.repoBranch}">分支</td>
-                    <td th:text="${item.codeDirname}">代码目录</td>
                     <td th:text="${item.appType}">应用类型</td>
                     <span th:if="${item.proj} != null">
                         <td th:text="${item.proj.repoAuthConfig.name}">仓库认证</td>

+ 0 - 6
dmaster/src/main/resources/templates/monitor/machinemonitor.html

@@ -39,10 +39,6 @@
             <table class="layui-table timo-table">
                 <thead>
                 <tr>
-                    <th class="timo-table-checkbox">
-                        <label class="timo-checkbox"><input type="checkbox">
-                            <i class="layui-icon layui-icon-ok"></i></label>
-                    </th>
                     <th class="sortable" data-field="machineIpv4">机器地址</th>
                     <th class="sortable" data-field="totalJobs">任务总数</th>
                     <th class="sortable" data-field="runningJobs">正在运行的任务</th>
@@ -52,8 +48,6 @@
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.machineId}">
-                        <i class="layui-icon layui-icon-ok"></i></label></td>
                     <td th:text="${item.machineIpv4}">机器地址</td>
                     <td th:text="${item.totalJobs}">任务总数</td>
                     <td th:text="${item.runningJobs}">正在运行的任务</td>

+ 1 - 1
dmaster/src/test/java/cn/reghao/autodop/dmaster/monitor/service/MonitorServiceTest.java

@@ -15,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.*;
 @RunWith(SpringRunner.class)
 class MonitorServiceTest {
     @Autowired
-    private MonitorService monitorService;
+    private MonitorListService monitorService;
 
     @Test
     void refresh() {