Browse Source

调整监控报警接口

dmaster 和 dagent 已部署到测试环境, 后续数据模型的变更应注意
reghao 4 years ago
parent
commit
72bdb0d879

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/config/AppConfigController.java

@@ -42,6 +42,7 @@ public class AppConfigController {
     public ResponseEntity<String> addAppOrchestration(@Validated AppOrchestration app) {
         Result result;
         try {
+            // TODO app 属于 proj 时,提交的数据中 proj 是 null
             result = appCrudService.insertOrUpdate(app);
         } catch (Exception e) {
             String msg = e.getMessage();

+ 17 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/crud/config/AppCrudService.java

@@ -4,6 +4,7 @@ import cn.reghao.autodop.common.result.Result;
 import cn.reghao.autodop.common.result.ResultStatus;
 import cn.reghao.autodop.dmaster.app.constant.AppType;
 import cn.reghao.autodop.dmaster.app.constant.EnvType;
+import cn.reghao.autodop.dmaster.app.entity.config.ProjOrchestration;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyType;
 import cn.reghao.autodop.dmaster.app.entity.AppRunning;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.DeployConfig;
@@ -55,13 +56,19 @@ public class AppCrudService {
         // TODO 处理所有与 app 关联的数据
         // TODO 不能有应用处于构建中
         Integer id = app.getId();
+        /*if (id != null) {
+            app = appRepository.findById(id).orElse(null);
+        }*/
+
         Result result = checkEnum(app);
         if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
             return result;
         }
+
+        // 首先处理共享实体,将 app 的所有属性填充完整
+        checkSharedEntity(app);
         checkNotifyGroups(app);
         checkDeployConfigs(app);
-        checkSharedEntity(app);
         appRepository.save(app);
         appBuildService.refreshApp(app);
 
@@ -111,7 +118,15 @@ public class AppCrudService {
     }
 
     private void checkDeployConfigs(AppOrchestration app) {
-        String packType = app.getPackerConfig().getType();
+        // TODO null 异常不会被 ControllerExceptionHandler 捕获
+        ProjOrchestration proj = app.getProj();
+        String packType;
+        if (proj != null) {
+            packType = proj.getPackerConfig().getType();
+        } else {
+            packType = app.getPackerConfig().getType();
+        }
+
         List<DeployConfig> deployConfigs = app.getDeployConfigs().stream()
                 .map(deployConfig -> {
                     String machineId = deployConfig.getMachineId();

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/AppOrchestration.java

@@ -44,6 +44,7 @@ public class AppOrchestration extends BaseEntity<Integer> implements Cloneable {
     //@Valid
     @ManyToMany(cascade = CascadeType.REFRESH)
     @JoinColumn(name = "notify_group_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
+    @LazyCollection(LazyCollectionOption.FALSE)
     private List<NotifyGroup> notifyGroups;
     // TODO 添加定时构建部署选项
 

+ 13 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppIntegrate.java

@@ -85,6 +85,8 @@ public class AppIntegrate {
      * @date 2021-02-05 下午11:01
      */
     private void initBuildConfig() {
+        checkProj(app);
+
         // 初始化更新配置
         RepoAuthConfig repoAuthConfig = app.getRepoAuthConfig();
         switch (RepoType.valueOf(repoAuthConfig.getType())) {
@@ -130,6 +132,17 @@ public class AppIntegrate {
         }
     }
 
+    private void checkProj(AppOrchestration app) {
+        ProjOrchestration proj = app.getProj();
+        if (proj == null) {
+            return;
+        }
+
+        app.setRepoAuthConfig(proj.getRepoAuthConfig());
+        app.setCompilerConfig(proj.getCompilerConfig());
+        app.setPackerConfig(proj.getPackerConfig());
+    }
+
     public CommitInfo update() throws Exception {
         String remote;
         String branch;

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/tools/compiler/MavenCompiler.java

@@ -18,6 +18,7 @@ import java.util.List;
 @Slf4j
 public class MavenCompiler implements CodeCompiler {
     private String dirname;
+    // TODO 和 EnvType 关联
     private String env;
     private InvocationRequest request;
     private Invoker invoker;

+ 5 - 40
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java

@@ -96,61 +96,26 @@ public class MonitorController {
     }
 
     @ApiOperation(value = "开始/停止任务")
-    @PostMapping(value = "/{monitorType}/job/{id}/{jobId}/{status}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @PostMapping(value = "/{monitorType}/job/{id}/{jobId}/{enable}", produces = MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<String> machineJobStatus(@PathVariable("monitorType") String monitorType,
                                                    @PathVariable("id") Integer id,
                                                    @PathVariable("jobId") String jobId,
-                                                   @PathVariable("status") String status) throws SchedulerException {
+                                                   @PathVariable("enable") Boolean enable) throws SchedulerException {
         Result result;
         switch (MonitorType.valueOf(monitorType)) {
             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("操作失败"));
-                }
-                machineMonitorRepository.save(machineMonitor);
+                machineMonitorService.startOrPause(machineMonitor, jobId, enable);
                 break;
             case app:
                 AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
-                MonitorJob monitorJob1 = appMonitor.getJobMap().get(jobId);
-                result = changeJobStatus(monitorJob1, status);
-                if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
-                    return ResponseEntity.ok().body(WebBody.failWithMsg("操作失败"));
-                }
+                appMonitorService.startOrPause(appMonitor, jobId, enable);
                 appMonitorRepository.save(appMonitor);
                 break;
             default:
-                result = Result.result(ResultStatus.FAIL);
-        }
-
-        return ResponseEntity.ok().body(WebBody.result(result));
-    }
 
-    private Result changeJobStatus(MonitorJob monitorJob, String status) throws SchedulerException {
-        boolean enable = "enable".equals(status);
-        boolean isEnable = monitorJob.getEnable();
-        Result result = null;
-        if (enable && !isEnable) {
-            // 开启任务
-            monitorScheduler.resume(monitorJob.getJobId());
-            result = Result.result(ResultStatus.SUCCESS, "监控已开始");
         }
 
-        if (!enable && isEnable) {
-            // 停止任务
-            monitorScheduler.pause(monitorJob.getJobId());
-            result = Result.result(ResultStatus.SUCCESS, "监控已停止");
-        }
-
-        if (result != null) {
-            monitorJob.setEnable(enable);
-            return result;
-        }
-        return Result.result(ResultStatus.SUCCESS);
+        return ResponseEntity.ok().body(WebBody.success());
     }
 }

+ 8 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/AppMonitorService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/AppMonitorServiceImpl.java

@@ -15,12 +15,12 @@ import java.util.Map;
  * @date 2020-10-22 17:51:56
  */
 @Service
-public class AppMonitorService implements MonitorService<AppMonitor> {
+public class AppMonitorServiceImpl implements MonitorService<AppMonitor> {
     private MonitorScheduler monitorScheduler;
     private AppMonitorRepository appMonitorRepository;
 
-    public AppMonitorService(MonitorScheduler monitorScheduler,
-                             AppMonitorRepository appMonitorRepository) {
+    public AppMonitorServiceImpl(MonitorScheduler monitorScheduler,
+                                 AppMonitorRepository appMonitorRepository) {
         this.monitorScheduler = monitorScheduler;
         this.appMonitorRepository = appMonitorRepository;
     }
@@ -46,6 +46,10 @@ public class AppMonitorService implements MonitorService<AppMonitor> {
     }
 
     @Override
-    public void changeMonitorStatus(AppMonitor monitor, MonitorJob monitorJob, Boolean enable) {
+    public void deleteMonitorJob(AppMonitor monitor, String jobId) {
+    }
+
+    @Override
+    public void startOrPause(AppMonitor monitor, String jobId, Boolean enable) {
     }
 }

+ 30 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MachineMonitorService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MachineMonitorServiceImpl.java

@@ -15,12 +15,12 @@ import java.util.Map;
  * @date 2020-10-22 17:51:56
  */
 @Service
-public class MachineMonitorService implements MonitorService<MachineMonitor> {
+public class MachineMonitorServiceImpl implements MonitorService<MachineMonitor> {
     private MonitorScheduler monitorScheduler;
     private MachineMonitorRepository machineMonitorRepository;
 
-    public MachineMonitorService(MonitorScheduler monitorScheduler,
-                                 MachineMonitorRepository machineMonitorRepository) {
+    public MachineMonitorServiceImpl(MonitorScheduler monitorScheduler,
+                                     MachineMonitorRepository machineMonitorRepository) {
         this.monitorScheduler = monitorScheduler;
         this.machineMonitorRepository = machineMonitorRepository;
     }
@@ -45,6 +45,32 @@ public class MachineMonitorService implements MonitorService<MachineMonitor> {
     }
 
     @Override
-    public void changeMonitorStatus(MachineMonitor monitor, MonitorJob monitorJob, Boolean enable) {
+    public void deleteMonitorJob(MachineMonitor monitor, String jobId) {
+    }
+
+    @Override
+    public void startOrPause(MachineMonitor monitor, String jobId, Boolean enable) throws SchedulerException {
+        MonitorJob monitorJob = monitor.getJobMap().get(jobId);
+        boolean isEnable = monitorJob.getEnable();
+        if (enable && !isEnable) {
+            // 开启任务
+            monitorScheduler.resume(monitorJob.getJobId());
+            monitorJob.setEnable(true);
+            // TODO 应该是一个原子操作
+            int runningJobs = monitor.getRunningJobs();
+            runningJobs++;
+            monitor.setRunningJobs(runningJobs);
+        }
+
+        if (!enable && isEnable) {
+            // 停止任务
+            monitorScheduler.pause(monitorJob.getJobId());
+            monitorJob.setEnable(false);
+            // TODO 应该是一个原子操作
+            int runningJobs = monitor.getRunningJobs();
+            runningJobs--;
+            monitor.setRunningJobs(runningJobs);
+        }
+        machineMonitorRepository.save(monitor);
     }
 }

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorService.java

@@ -13,5 +13,6 @@ import java.io.IOException;
 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);
+    void deleteMonitorJob(T monitor, String jobId);
+    void startOrPause(T monitor, String jobId, Boolean enable) throws SchedulerException;
 }

+ 1 - 1
dmaster/src/main/resources/templates/app/config/app/add.html

@@ -28,7 +28,7 @@
                         <div class="layui-form-item">
                             <div class="layui-input-inline">
                                 <select name="app.proj.projId">
-                                    <option th:each="item:${projs}" th:value="${item.key}" th:selected="${app?.proj?.projId} eq ${item.key}">[[${item.value}]]</option>
+                                    <option th:each="item:${projs}" th:value="${item.key}" th:selected="${app.proj.projId} eq ${item.key}">[[${item.value}]]</option>
                                 </select>
                             </div>
                         </div>

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

@@ -148,9 +148,9 @@
             <tbody>
             <tr>
                 <th>HTTP 端口</th>
-                <td th:text="${app.runningConfig.httpPort}"></td>
+                <td th:text="${app.runningConfig?.httpPort}"></td>
                 <th>健康检查</th>
-                <td th:text="${app.runningConfig.healthCheck}"></td>
+                <td th:text="${app.runningConfig?.healthCheck}"></td>
             </tr>
             </tbody>
         </table>

+ 2 - 2
dmaster/src/main/resources/templates/monitor/monitorjobs.html

@@ -37,9 +37,9 @@
                            th:attr="data-url=@{${editJobUrl}+'/'+${item.jobId}}"
                            data-size="640,480" href="#">编辑</a>
                         <a class="ajax-post"
-                           th:href="@{${jobStatusApi}+'/'+${item.jobId}+'/enable'}">启用</a>
+                           th:href="@{${jobStatusApi}+'/'+${item.jobId}+'/1'}">启用</a>
                         <a class="ajax-post"
-                           th:href="@{${jobStatusApi}+'/'+${item.jobId}+'/disable'}">禁用</a>
+                           th:href="@{${jobStatusApi}+'/'+${item.jobId}+'/0'}">禁用</a>
                     </td>
                 </tr>
                 </tbody>