Просмотр исходного кода

继续实现应用部署后的操作,包括更新 DeployLog, 更新 AppDeploying, 更新 AppRunning 以及发送部署通知

reghao 4 лет назад
Родитель
Сommit
b144b1730a
33 измененных файлов с 190 добавлено и 323 удалено
  1. 1 1
      common/src/main/java/cn/reghao/autodop/common/beans/BeansConfig.java
  2. 0 54
      common/src/main/java/cn/reghao/autodop/common/util/ByteConverter.java
  3. 0 9
      common/src/main/java/cn/reghao/autodop/common/util/ByteType.java
  4. 2 2
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/BufferPoolStat.java
  5. 2 2
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/MemoryStat.java
  6. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppDeployConfigPageController.java
  7. 1 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppBuildingQueryImpl.java
  8. 28 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppDeployingQueryImpl.java
  9. 22 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppRunningQueryImpl.java
  10. 21 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/AppDeploying.java
  11. 4 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppDeployingVO.java
  12. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppRunningVo.java
  13. 5 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppBuildingServiceImpl.java
  14. 15 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployer.java
  15. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployingService.java
  16. 10 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployingServiceImpl.java
  17. 5 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppRunningServiceImpl.java
  18. 25 20
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppConfigServiceImpl.java
  19. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/BuildDirServiceImpl.java
  20. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPage.java
  21. 3 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPageImpl.java
  22. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineHostQuery.java
  23. 5 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineHostQueryImpl.java
  24. 0 77
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineQuery.java
  25. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/repository/MachineHostRepository.java
  26. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/DiskInfoVO.java
  27. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/DiskUsage.java
  28. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/MachineInfoVO.java
  29. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/AppRpcClazzResultImpl.java
  30. 2 2
      dmaster/src/main/resources/application-test.yml
  31. 4 2
      dmaster/src/main/resources/templates/app/bd/deploy.html
  32. 19 6
      dmaster/src/main/resources/templates/app/stat/index.html
  33. 0 84
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImplTest.java

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/beans/BeansConfig.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.common.beans;
 
-import cn.reghao.autodop.common.util.ByteConverter;
+import cn.reghao.jdkutil.converter.ByteConverter;
 import cn.reghao.jdkutil.http.WebClient;
 import cn.reghao.jdkutil.http.WebRequest;
 import org.springframework.context.annotation.Bean;

+ 0 - 54
common/src/main/java/cn/reghao/autodop/common/util/ByteConverter.java

@@ -1,54 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 字节单位转换器
- *
- * @author reghao
- * @date 2019-10-26 22:39:23
- */
-public class ByteConverter {
-    private final Map<Integer, String> map = new HashMap<>();
-
-    public ByteConverter() {
-        for (ByteType byteType : ByteType.values()) {
-            map.put(byteType.ordinal(), byteType.name());
-        }
-    }
-
-    /**
-     * @date 2020-10-20 上午11:26
-     */
-    public String convert(ByteType byteType, long value) {
-        int base = 1024;
-        for (int i = byteType.ordinal(); i < ByteType.TiB.ordinal(); i++) {
-            if (value < base) {
-                return value + map.get(i);
-            }
-            value = value >> 10;
-        }
-
-        if (value < base) {
-            return value + "PiB";
-        } else {
-            return "data too large";
-        }
-    }
-
-    public long convert(ByteType src, ByteType dest, long value) {
-        for (int i = src.ordinal(); i < dest.ordinal(); i++) {
-            value = value >> 10;
-        }
-
-        return value;
-    }
-
-    public String convertStr(ByteType src, ByteType dest, long value) {
-        for (int i = src.ordinal(); i < dest.ordinal(); i++) {
-            value = value >> 10;
-        }
-        return value + dest.name();
-    }
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/util/ByteType.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-/**
- * @author reghao
- * @date 2019-10-29 16:23:15
- */
-public enum ByteType {
-    Bytes, KiB, MiB, GiB, TiB
-}

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/BufferPoolStat.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.common.util.jvm.po;
 
-import cn.reghao.autodop.common.util.ByteConverter;
-import cn.reghao.autodop.common.util.ByteType;
+import cn.reghao.jdkutil.converter.ByteConverter;
+import cn.reghao.jdkutil.converter.ByteType;
 import lombok.Data;
 
 import java.lang.management.BufferPoolMXBean;

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/MemoryStat.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.common.util.jvm.po;
 
-import cn.reghao.autodop.common.util.ByteConverter;
-import cn.reghao.autodop.common.util.ByteType;
+import cn.reghao.jdkutil.converter.ByteConverter;
+import cn.reghao.jdkutil.converter.ByteType;
 import lombok.Data;
 
 import java.lang.management.MemoryUsage;

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppDeployConfigPageController.java

@@ -52,7 +52,7 @@ public class AppDeployConfigPageController {
     @GetMapping("/add/{appId}")
     public String addAppConfigPage(@PathVariable("appId") String appId, Model model) {
         AppConfig appConfig = deployConfigPage.appConfig(appId);
-        List<KeyValue> machines = deployConfigPage.machines(appConfig.getEnv());
+        List<KeyValue> machines = deployConfigPage.onlineMachines(appConfig.getEnv());
 
         model.addAttribute("appId", appId);
         model.addAttribute("packType", appConfig.getPackerConfig().getType());
@@ -65,7 +65,7 @@ public class AppDeployConfigPageController {
                                     Model model) {
         AppDeployConfig appDeployConfig = deployConfigPage.findByAppIdAndMachineId(appId, machineId);
         AppConfig appConfig = appDeployConfig.getAppConfig();
-        List<KeyValue> machines = deployConfigPage.machines(appConfig.getEnv());
+        List<KeyValue> machines = deployConfigPage.onlineMachines(appConfig.getEnv());
 
         model.addAttribute("appId", appId);
         model.addAttribute("packType", appDeployConfig.getAppConfig().getPackerConfig().getType());

+ 1 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppBuildingQueryImpl.java

@@ -51,11 +51,7 @@ public class AppBuildingQueryImpl implements AppBuildingQuery {
         };
 
         List<AppBuilding> list = buildingRepository.findAll(specification);
-        if (!list.isEmpty()) {
-            return list.get(0);
-        } else {
-            return null;
-        }
+        return list.size() == 1 ? list.get(0) : null;
     }
 
     private Specification<AppBuilding> specification(Map<String, String> kv) {

+ 28 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppDeployingQueryImpl.java

@@ -2,17 +2,18 @@ package cn.reghao.autodop.dmaster.app.db.query;
 
 import cn.reghao.autodop.dmaster.app.db.repository.AppDeployingRepository;
 import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
 import javax.persistence.criteria.Predicate;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author reghao
@@ -38,7 +39,8 @@ public class AppDeployingQueryImpl implements AppDeployingQuery {
 
     @Override
     public AppDeploying findByAppIdAndMachineId(String appId, String machineId) {
-        return null;
+        List<AppDeploying> list = deployingRepository.findAll(innerJoinEqual(appId, machineId));
+        return list.size() == 1 ? list.get(0) : null;
     }
 
     @Override
@@ -48,26 +50,38 @@ public class AppDeployingQueryImpl implements AppDeployingQuery {
 
     @Override
     public AppDeploying query(Map<String, String> kv) {
-        Specification<AppDeploying> specification = specification(kv);
+        Specification<AppDeploying> specification = innerJoinLike(kv);
         List<AppDeploying> list = deployingRepository.findAll(specification);
-        if (!list.isEmpty()) {
-            return list.get(0);
-        } else {
-            return null;
-        }
+        return list.size() == 1 ? list.get(0) : null;
     }
 
     public List<AppDeploying> queryAll(Map<String, String> kv) {
-        Specification<AppDeploying> specification = specification(kv);
+        Specification<AppDeploying> specification = innerJoinLike(kv);
         return deployingRepository.findAll(specification);
     }
 
     public Page<AppDeploying> queryByPage(Map<String, String> kv, Pageable pageable) {
-        Specification<AppDeploying> specification = specification(kv);
+        Specification<AppDeploying> specification = innerJoinLike(kv);
         return deployingRepository.findAll(specification, pageable);
     }
 
-    private Specification<AppDeploying> specification(Map<String, String> kv) {
+    private Specification<AppDeploying> innerJoinEqual(String appId, String machineId) {
+        return (root, query, cb) -> {
+            Join<AppDeploying, AppDeployConfig> innerJoin = root.join("appDeployConfig", JoinType.INNER);
+            Join<AppDeployConfig, AppConfig> innerJoin1 = innerJoin.join("appConfig", JoinType.INNER);
+            Predicate predicate = cb.equal(innerJoin1.get("appId"), appId);
+
+            Join<AppDeployConfig, MachineHost> innerJoin2 = innerJoin.join("machineHost", JoinType.INNER);
+            Predicate predicate1 = cb.equal(innerJoin2.get("machineId"), machineId);
+
+            Predicate[] arr = new Predicate[2];
+            arr[0] = predicate;
+            arr[1] = predicate1;
+            return cb.and(arr);
+        };
+    }
+
+    private Specification<AppDeploying> innerJoinLike(Map<String, String> kv) {
         return (root, query, cb) -> {
             List<Predicate> predicates = new ArrayList<>();
             kv.forEach((name, value) -> {

+ 22 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppRunningQueryImpl.java

@@ -5,6 +5,7 @@ import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
 import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
@@ -14,6 +15,7 @@ import javax.persistence.criteria.Join;
 import javax.persistence.criteria.JoinType;
 import javax.persistence.criteria.Predicate;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -31,7 +33,8 @@ public class AppRunningQueryImpl implements AppRunningQuery {
 
     @Override
     public AppRunning findByAppIdAndMachineId(String appId, String machineId) {
-        return null;
+        List<AppRunning> list = runningRepository.findAll(innerJoinEqual(appId, machineId));
+        return list.size() == 1 ? list.get(0) : null;
     }
 
     @Override
@@ -78,4 +81,22 @@ public class AppRunningQueryImpl implements AppRunningQuery {
             return cb.and(predicates.toArray(new Predicate[0]));
         };
     }
+
+    private Specification<AppRunning> innerJoinEqual(String appId, String machineId) {
+        return (root, query, cb) -> {
+            Join<AppRunning, AppDeploying> innerJoin = root.join("appDeploying", JoinType.INNER);
+            Join<AppDeploying, AppDeployConfig> innerJoin1 = innerJoin.join("appDeployConfig", JoinType.INNER);
+
+            Join<AppDeployConfig, AppConfig> innerJoin2 = innerJoin1.join("appConfig", JoinType.INNER);
+            Predicate predicate = cb.equal(innerJoin2.get("appId"), appId);
+
+            Join<AppDeployConfig, MachineHost> innerJoin3 = innerJoin1.join("machineHost", JoinType.INNER);
+            Predicate predicate1 = cb.equal(innerJoin3.get("machineId"), machineId);
+
+            Predicate[] arr = new Predicate[2];
+            arr[0] = predicate;
+            arr[1] = predicate1;
+            return cb.and(arr);
+        };
+    }
 }

+ 21 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/AppDeploying.java

@@ -1,9 +1,10 @@
 package cn.reghao.autodop.dmaster.app.model.po;
 
-import cn.reghao.autodop.common.msg.rpc.dto.app.DeployResult;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
-import cn.reghao.autodop.dmaster.app.model.po.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.model.po.log.DeployLog;
 import cn.reghao.autodop.dmaster.util.db.BaseEntity;
+import cn.reghao.jdkutil.result.Result;
+import cn.reghao.jdkutil.result.ResultStatus;
 import lombok.*;
 
 import javax.persistence.Entity;
@@ -28,21 +29,30 @@ public class AppDeploying extends BaseEntity<Integer> {
     private String buildLogId;
     private String commitId;
     private String packagePath;
+    private String deployBy;
     private LocalDateTime deployTime;
     private String deployResult;
-    private String deployBy;
 
     public AppDeploying(AppDeployConfig appDeployConfig) {
         this.appDeployConfig = appDeployConfig;
     }
 
-    public AppDeploying update(BuildLog buildLog, DeployResult deployResult) {
-        this.setBuildLogId(buildLog.getId());
-        this.setCommitId(buildLog.getCommitInfo().getCommitId());
-        this.setPackagePath(buildLog.getPackagePath());
-        this.setDeployTime(deployResult.getDeployTime());
-        this.setDeployResult(deployResult.getResult().getMsg());
-        this.setDeployBy("某人");
-        return this;
+    public void updateBefore(String buildLogId, String commitId, String packagePath, String deployBy) {
+        this.buildLogId = buildLogId;
+        this.commitId = commitId;
+        this.packagePath = packagePath;
+        this.deployBy = deployBy;
+        this.deployTime = null;
+        this.deployResult = "N/A";
+    }
+
+    public void updateAfter(DeployLog deployLog) {
+        this.deployTime = deployLog.getDeployTime();
+        Result result = deployLog.getResult();
+        if (result.getCode() == ResultStatus.SUCCESS.getCode()) {
+            this.deployResult = ResultStatus.SUCCESS.getMsg();
+        } else {
+            this.deployResult = deployLog.getResult().getMsg();
+        }
     }
 }

+ 4 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppDeployingVO.java

@@ -12,15 +12,17 @@ import lombok.Data;
 public class AppDeployingVO {
     private String machineIpv4;
     private String commitId;
+    private String packagePath;
+    private String deployBy;
     private String deployTime;
     private String deployResult;
-    private String deployBy;
 
     public AppDeployingVO(AppDeploying appDeploying) {
         this.machineIpv4 = appDeploying.getAppDeployConfig().getMachineHost().getMachineIpv4();
         this.commitId = appDeploying.getCommitId();
+        this.packagePath = appDeploying.getPackagePath();
+        this.deployBy = appDeploying.getDeployBy();
         this.deployTime = DateTimeConverter.format(appDeploying.getDeployTime());
         this.deployResult = appDeploying.getDeployResult();
-        this.deployBy = appDeploying.getDeployBy();
     }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppRunningVo.java

@@ -33,7 +33,7 @@ public class AppRunningVo {
         this.machineIpv4 = machineHost.getMachineIpv4();
         this.httpPort = appConfig.getHttpPort();
         this.healthCheck = appConfig.getHealthCheck();
-        this.packagePath = "N/A";
+        this.packagePath = appRunning.getAppDeploying().getPackagePath();
         this.status = appRunning.getStatus();
         this.startTime = appRunning.getStartTime() != null ? DateTimeConverter.format(appRunning.getStartTime()) : "N/A";
         this.pid = appRunning.getPid() != null ? appRunning.getPid() : -1;

+ 5 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppBuildingServiceImpl.java

@@ -24,8 +24,11 @@ public class AppBuildingServiceImpl implements AppBuildingService {
 
     @Override
     public void add(AppConfig appConfig) {
-        AppBuilding appBuilding = new AppBuilding(appConfig);
-        buildingCrud.save(appBuilding);
+        AppBuilding appBuilding = buildingQuery.findByAppConfig(appConfig);
+        if (appBuilding == null) {
+            appBuilding = new AppBuilding(appConfig);
+            buildingCrud.save(appBuilding);
+        }
     }
 
     @Override

+ 15 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployer.java

@@ -6,8 +6,11 @@ import cn.reghao.autodop.common.msg.rpc.RpcMsg;
 import cn.reghao.autodop.common.msg.rpc.constant.AppRpcClazz;
 import cn.reghao.autodop.common.msg.rpc.dto.app.DeployParam;
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
+import cn.reghao.autodop.dmaster.app.db.crud.AppDeployingCrud;
 import cn.reghao.autodop.dmaster.app.db.crud.log.DeployLogCrud;
+import cn.reghao.autodop.dmaster.app.db.query.AppDeployingQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
+import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 import cn.reghao.autodop.dmaster.app.model.po.log.DeployLog;
 import cn.reghao.jdkutil.serializer.JsonConverter;
@@ -29,11 +32,17 @@ import java.util.*;
 public class AppDeployer {
     private final DefaultMqttClient mqttClient;
     private final AppDeployConfigQuery deployConfigQuery;
+    private AppDeployingQuery deployingQuery;
+    private AppDeployingCrud deployingCrud;
     private final DeployLogCrud logCrud;
 
-    public AppDeployer(DefaultMqttClient mqttClient, AppDeployConfigQuery deployConfigQuery, DeployLogCrud logCrud) {
+    public AppDeployer(DefaultMqttClient mqttClient, AppDeployConfigQuery deployConfigQuery,
+                       AppDeployingQuery deployingQuery, AppDeployingCrud deployingCrud,
+                       DeployLogCrud logCrud) {
         this.mqttClient = mqttClient;
         this.deployConfigQuery = deployConfigQuery;
+        this.deployingQuery = deployingQuery;
+        this.deployingCrud = deployingCrud;
         this.logCrud = logCrud;
     }
 
@@ -43,8 +52,10 @@ public class AppDeployer {
         String appId = buildLog.getAppId();
         String packagePath = buildLog.getPackagePath();
         String deployBy = buildLog.getBuildBy();
+        String commitId = buildLog.getCommitInfo().getCommitId();
 
         List<AppDeployConfig> deployConfigs = deployConfigQuery.findByAppId(appId);
+        // TODO 使用线程池并发执行
         for (AppDeployConfig deployConfig : deployConfigs) {
             String machineId = deployConfig.getMachineHost().getMachineId();
             String machineIpv4 = deployConfig.getMachineHost().getMachineIpv4();
@@ -68,6 +79,9 @@ public class AppDeployer {
             String topic = MsgQueue.dagentTopic(machineId);
             mqttClient.pubWithResult(topic, 1, message);
 
+            AppDeploying appDeploying = deployingQuery.findByAppDeployConfig(deployConfig);
+            appDeploying.updateBefore(buildLogId, commitId, packagePath, deployBy);
+            deployingCrud.update(appDeploying);
             deployLogs.add(new DeployLog(buildLogId, machineId, machineIpv4, deployBy));
         }
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployingService.java

@@ -10,7 +10,7 @@ import cn.reghao.autodop.dmaster.app.model.po.log.DeployLog;
  */
 public interface AppDeployingService {
     void add(AppDeployConfig appDeployConfig);
-    void refresh(DeployResult deployResult);
+    void refresh(DeployLog deployLog);
     void delete(AppDeployConfig appDeployConfig);
     DeployLog updateDeployLog(DeployResult deployResult);
     void sendDeployNotify(DeployLog deployLog);

+ 10 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployingServiceImpl.java

@@ -10,8 +10,6 @@ import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 import cn.reghao.autodop.dmaster.app.model.po.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.model.po.log.DeployLog;
-import cn.reghao.autodop.dmaster.app.service.bd.AppDeployingService;
-import cn.reghao.autodop.dmaster.app.service.bd.AppRunningService;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
 import cn.reghao.autodop.dmaster.monitor.db.query.AppMonitorQuery;
 import cn.reghao.autodop.dmaster.monitor.model.po.AppMonitor;
@@ -56,20 +54,23 @@ public class AppDeployingServiceImpl implements AppDeployingService {
 
     @Override
     public void add(AppDeployConfig appDeployConfig) {
-        AppDeploying appDeploying = new AppDeploying(appDeployConfig);
-        deployingCrud.save(appDeploying);
-        runningService.add(appDeploying);
+        AppDeploying appDeploying = deployingQuery.findByAppDeployConfig(appDeployConfig);
+        if (appDeploying == null) {
+            appDeploying = new AppDeploying(appDeployConfig);
+            deployingCrud.save(appDeploying);
+            runningService.add(appDeploying);
+        }
     }
 
     @Override
-    public void refresh(DeployResult deployResult) {
-        String buildLogId = deployResult.getBuildLogId();
-        String machineId = deployResult.getMachineId();
+    public void refresh(DeployLog deployLog) {
+        String buildLogId = deployLog.getBuildLogId();
+        String machineId = deployLog.getMachineId();
         BuildLog buildLog = buildLogQuery.findById(buildLogId);
         String appId = buildLog.getAppId();
         AppDeploying appDeploying = deployingQuery.findByAppIdAndMachineId(appId, machineId);
         if (appDeploying != null) {
-            appDeploying.update(buildLog, deployResult);
+            appDeploying.updateAfter(deployLog);
             deployingCrud.update(appDeploying);
         }
     }

+ 5 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppRunningServiceImpl.java

@@ -5,7 +5,6 @@ import cn.reghao.autodop.dmaster.app.db.crud.AppRunningCrud;
 import cn.reghao.autodop.dmaster.app.db.query.AppRunningQuery;
 import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
 import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
-import cn.reghao.autodop.dmaster.app.service.bd.AppRunningService;
 import org.springframework.stereotype.Service;
 
 /**
@@ -24,8 +23,11 @@ public class AppRunningServiceImpl implements AppRunningService {
 
     @Override
     public void add(AppDeploying appDeploying) {
-        AppRunning appRunning = new AppRunning(appDeploying);
-        runningCrud.save(appRunning);
+        AppRunning appRunning = runningQuery.findByAppDeploying(appDeploying);
+        if (appRunning == null) {
+            appRunning = new AppRunning(appDeploying);
+            runningCrud.save(appRunning);
+        }
     }
 
     @Override

+ 25 - 20
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppConfigServiceImpl.java

@@ -1,20 +1,27 @@
 package cn.reghao.autodop.dmaster.app.service.config.impl;
 
-import cn.reghao.autodop.dmaster.app.db.crud.AppDeployingCrud;
 import cn.reghao.autodop.dmaster.app.db.crud.config.AppConfigCrud;
 import cn.reghao.autodop.dmaster.app.db.query.AppDeployingQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
-import cn.reghao.autodop.dmaster.app.db.repository.AppRunningRepository;
+import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
+import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.dto.NewApp;
-import cn.reghao.autodop.dmaster.app.service.impl.BuildDeployConfigServiceImpl;
+import cn.reghao.autodop.dmaster.app.service.bd.AppBuildingService;
+import cn.reghao.autodop.dmaster.app.service.bd.AppDeployingService;
+import cn.reghao.autodop.dmaster.app.service.bd.AppRunningService;
 import cn.reghao.autodop.dmaster.app.service.config.AppConfigService;
-import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
+import cn.reghao.autodop.dmaster.monitor.db.crud.AppMonitorCrud;
+import cn.reghao.autodop.dmaster.monitor.model.po.AppMonitor;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * @author reghao
  * @date 2021-09-16 18:28:51
@@ -23,25 +30,26 @@ import org.springframework.transaction.annotation.Transactional;
 public class AppConfigServiceImpl implements AppConfigService {
     private final AppConfigQuery appConfigQuery;
     private final AppConfigCrud appConfigCrud;
-    private final MachineHostQuery machineHostQuery;
     private final BuildConfigChecker buildConfigChecker;
-    private final BuildDeployConfigServiceImpl appBuildService;
-    private final AppRunningRepository runningRepository;
-    private AppDeployingQuery appDeployingQuery;
-    private AppDeployingCrud appDeployingCrud;
+
+    @Autowired
+    private AppBuildingService buildingService;
+    @Autowired
+    private AppDeployingService deployingService;
+    @Autowired
+    private AppDeployingQuery deployingQuery;
+    @Autowired
+    private AppRunningService runningService;
+    @Autowired
+    private AppDeployConfigQuery deployConfigQuery;
+    @Autowired
+    private AppMonitorCrud appMonitorCrud;
 
     public AppConfigServiceImpl(AppConfigQuery appConfigQuery, AppConfigCrud appConfigCrud,
-                                MachineHostQuery machineHostQuery, BuildConfigChecker buildConfigChecker,
-                                BuildDeployConfigServiceImpl appBuildService, AppRunningRepository runningRepository,
-                                AppDeployingQuery appDeployingQuery, AppDeployingCrud appDeployingCrud) {
+                                BuildConfigChecker buildConfigChecker) {
         this.appConfigQuery = appConfigQuery;
         this.appConfigCrud = appConfigCrud;
-        this.machineHostQuery = machineHostQuery;
         this.buildConfigChecker = buildConfigChecker;
-        this.appBuildService = appBuildService;
-        this.runningRepository = runningRepository;
-        this.appDeployingQuery = appDeployingQuery;
-        this.appDeployingCrud = appDeployingCrud;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -57,7 +65,6 @@ public class AppConfigServiceImpl implements AppConfigService {
         }
 
         appConfigCrud.save(app);
-        appBuildService.refreshAppBuilding(app);
         String msg = String.format("添加 %s 成功", app.getAppId());
         return Result.result(ResultStatus.SUCCESS, msg);
     }
@@ -98,7 +105,6 @@ public class AppConfigServiceImpl implements AppConfigService {
         }
 
         appConfigCrud.save(app);
-        appBuildService.refreshAppBuilding(app);
 
         String msg = String.format("更新 %s 成功", app.getAppId());
         return Result.result(ResultStatus.SUCCESS, msg);
@@ -115,7 +121,6 @@ public class AppConfigServiceImpl implements AppConfigService {
         }
 
         // TODO 处理所有与 app 关联的数据
-        appBuildService.delete(app.getAppId());
         appConfigCrud.delete(app);*/
         return Result.result(ResultStatus.SUCCESS);
     }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/BuildDirServiceImpl.java

@@ -2,8 +2,8 @@ package cn.reghao.autodop.dmaster.app.service.config.impl;
 
 import cn.reghao.autodop.common.machine.Disk;
 import cn.reghao.autodop.common.machine.Machine;
-import cn.reghao.autodop.common.util.ByteConverter;
-import cn.reghao.autodop.common.util.ByteType;
+import cn.reghao.jdkutil.converter.ByteConverter;
+import cn.reghao.jdkutil.converter.ByteType;
 import cn.reghao.autodop.common.util.FileOps;
 import cn.reghao.autodop.dmaster.app.db.crud.config.BuildDirCrud;
 import cn.reghao.autodop.dmaster.app.db.query.config.BuildDirQuery;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPage.java

@@ -17,5 +17,5 @@ public interface AppDeployConfigPage {
     Page<AppDeployConfigVo> indexPage(String appId, PageRequest pageRequest);
     AppDeployConfig findByAppIdAndMachineId(String appId, String machineId);
     AppConfig appConfig(String appId);
-    List<KeyValue> machines(String env);
+    List<KeyValue> onlineMachines(String env);
 }

+ 3 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPageImpl.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.app.service.page;
 
+import cn.reghao.autodop.common.msg.pub.dto.node.constant.NodeStatus;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
@@ -47,8 +48,8 @@ public class AppDeployConfigPageImpl implements AppDeployConfigPage {
     }
 
     @Override
-    public List<KeyValue> machines(String env) {
-        return hostQuery.findByEnv(env).stream()
+    public List<KeyValue> onlineMachines(String env) {
+        return hostQuery.findByEnvAndStatus(env, NodeStatus.Online.name()).stream()
                 .map(machineHost -> {
                     String machineId = machineHost.getMachineId();
                     String machineIpv4 = machineHost.getMachineIpv4();

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineHostQuery.java

@@ -16,4 +16,5 @@ public interface MachineHostQuery extends BaseQuery<MachineHost> {
     MachineHost findByMachineIpv4(String machineIpv4);
     Page<MachineHost> findByEnv(String env, Pageable pageable);
     List<MachineHost> findByEnv(String env);
+    List<MachineHost> findByEnvAndStatus(String env, String status);
 }

+ 5 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineHostQueryImpl.java

@@ -40,6 +40,11 @@ public class MachineHostQueryImpl implements MachineHostQuery {
         return hostRepository.findByEnv(env, pageable);
     }
 
+    @Override
+    public List<MachineHost> findByEnvAndStatus(String env, String status) {
+        return hostRepository.findByEnvAndStatus(env, status);
+    }
+
     @Override
     public List<MachineHost> findByEnv(String env) {
         return hostRepository.findByEnv(env);

+ 0 - 77
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineQuery.java

@@ -1,77 +0,0 @@
-package cn.reghao.autodop.dmaster.machine.db.query;
-
-import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
-import cn.reghao.autodop.dmaster.machine.model.po.MachineInfo;
-import cn.reghao.autodop.dmaster.machine.db.repository.MachineHostRepository;
-import cn.reghao.autodop.dmaster.machine.db.repository.MachineInfoRepository;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-
-import javax.persistence.criteria.*;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2021-06-17 22:52:32
- */
-@Deprecated
-@Service
-public class MachineQuery {
-    private MachineInfoRepository infoRepository;
-    private MachineHostRepository hostRepository;
-
-    public MachineQuery(MachineInfoRepository infoRepository, MachineHostRepository hostRepository) {
-        this.infoRepository = infoRepository;
-        this.hostRepository = hostRepository;
-    }
-
-    public MachineHost query(String machineId) {
-        Specification<MachineHost> specification = (root, query, cb) -> {
-            Join<MachineHost, MachineInfo> innerJoin = root.join("machineInfo", JoinType.INNER);
-            Predicate predicate = cb.equal(innerJoin.get("machineId"), machineId);
-            //
-            return cb.and(predicate);
-        };
-        List<MachineHost> list = hostRepository.findAll(specification);
-        return list.isEmpty() ? null : list.get(0);
-    }
-
-    public List<MachineHost> queryByMatchAll(Map<String, String> kv) {
-        Specification<MachineHost> specification = matchSpec(kv);
-        return hostRepository.findAll(specification);
-    }
-
-    public Page<MachineHost> queryByMatchAll(Map<String, String> kv, PageRequest pageRequest) {
-        Specification<MachineHost> specification = matchSpec(kv);
-        return hostRepository.findAll(specification, pageRequest);
-    }
-
-    public List<MachineHost> queryByMachineIpv4(String machineIpv4) {
-        Specification<MachineHost> specification = innerJoinMatchSpec(machineIpv4);
-        return hostRepository.findAll(specification);
-    }
-
-    private Specification<MachineHost> matchSpec(Map<String, String> kv) {
-        return (root, query, cb) -> {
-            List<Predicate> predicates = new ArrayList<>();
-            kv.forEach((name, value) -> {
-                predicates.add(cb.equal(root.get(name), value));
-            });
-            return cb.and(predicates.toArray(new Predicate[0]));
-        };
-    }
-
-    private Specification<MachineHost> innerJoinMatchSpec(String machineIpv4) {
-        return (root, query, cb) -> {
-            Join<MachineHost, MachineInfo> innerJoin = root.join("machineInfo", JoinType.INNER);
-            // MachineInfo 中的 NetworkInfo 集合
-            //ListJoin<MachineInfo, NetworkInfo> listJoin = innerJoin.joinList("networkInfos");
-            return cb.and();
-        };
-    }
-}

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/repository/MachineHostRepository.java

@@ -20,4 +20,5 @@ public interface MachineHostRepository
     Page<MachineHost> findByEnv(String env, Pageable pageable);
     Page<MachineHost> findByIsDeleteFalse(Pageable pageable);
     List<MachineHost> findByEnv(String env);
+    List<MachineHost> findByEnvAndStatus(String env, String status);
 }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/DiskInfoVO.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.machine.model.vo;
 
-import cn.reghao.autodop.common.util.ByteConverter;
-import cn.reghao.autodop.common.util.ByteType;
+import cn.reghao.jdkutil.converter.ByteConverter;
+import cn.reghao.jdkutil.converter.ByteType;
 import cn.reghao.autodop.dmaster.machine.model.po.DiskInfo;
 import lombok.Data;
 

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/DiskUsage.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.machine.model.vo;
 
-import cn.reghao.autodop.common.util.ByteConverter;
-import cn.reghao.autodop.common.util.ByteType;
+import cn.reghao.jdkutil.converter.ByteConverter;
+import cn.reghao.jdkutil.converter.ByteType;
 import cn.reghao.jdkutil.machine.data.detail.DiskDetail;
 import lombok.Data;
 

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/MachineInfoVO.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.machine.model.vo;
 
-import cn.reghao.autodop.common.util.ByteConverter;
-import cn.reghao.autodop.common.util.ByteType;
+import cn.reghao.jdkutil.converter.ByteConverter;
+import cn.reghao.jdkutil.converter.ByteType;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.model.po.NetworkInfo;
 import cn.reghao.jdkutil.converter.DateTimeConverter;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/AppRpcClazzResultImpl.java

@@ -30,7 +30,7 @@ public class AppRpcClazzResultImpl {
         // 1.更新 DeployLog
         DeployLog deployLog = deployingService.updateDeployLog(deployResult);
         // 2.更新 AppDeploying
-        deployingService.refresh(deployResult);
+        deployingService.refresh(deployLog);
         // 3.更新 AppRunning
         Result result = deployResult.getResult();
         int code = result.getCode();

+ 2 - 2
dmaster/src/main/resources/application-test.yml

@@ -1,11 +1,11 @@
 spring:
   datasource:
-    url: jdbc:mysql://mysql.alpha.iquizoo.com:3306/devops_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
+    url: jdbc:mysql://192.168.0.77:3306/iquizoo_devops_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
     username: azy_test
     password: Azy@123456
   data:
     mongodb:
-      uri: mongodb://mongodb.alpha.iquizoo.com/devops_tdb
+      uri: mongodb://192.168.0.220/devops_tdb
 mosquitto:
   broker: tcp://s75.iquizoo.com:1883
   username: test

+ 4 - 2
dmaster/src/main/resources/templates/app/bd/deploy.html

@@ -10,9 +10,10 @@
                 <tr>
                     <th class="sortable" data-field="machineIpv4">机器地址</th>
                     <th class="sortable" data-field="commitId">当前部署版本</th>
+                    <th class="sortable" data-field="packagePath">包路径</th>
+                    <th class="sortable" data-field="deployBy">部署用户</th>
                     <th class="sortable" data-field="deployTime">部署时间</th>
                     <th class="sortable" data-field="deployResult">部署结果</th>
-                    <th class="sortable" data-field="deployBy">部署用户</th>
                     <th>操作</th>
                 </tr>
                 </thead>
@@ -20,9 +21,10 @@
                 <tr th:each="item:${list}">
                     <td th:text="${item.machineIpv4}">机器地址</td>
                     <td th:text="${item?.commitId}">当前部署版本</td>
+                    <td th:text="${item?.packagePath}">包路径</td>
+                    <td th:text="${item?.deployBy}">部署用户</td>
                     <td th:text="${item?.deployTime}">部署时间</td>
                     <td th:text="${item?.deployResult}">部署结果</td>
-                    <td th:text="${item?.deployBy}">部署用户</td>
                     <td>
                         <a class="ajax-post"
                            th:href="@{'/api/app/bd/deploy?appId='+${appId}+'&buildLogId='+${buildLogId}}">部署</a>

+ 19 - 6
dmaster/src/main/resources/templates/app/stat/index.html

@@ -33,11 +33,6 @@
                     </button>
                 </div>
             </div>
-            <div class="pull-right screen-btn-group">
-                <div class="btn-group-right">
-                    <a class="ajax-post" th:href="@{'/api/app/status/refresh'}">刷新状态列表</a>
-                </div>
-            </div>
         </div>
         <div class="timo-table-wrap">
             <table class="layui-table timo-table">
@@ -71,7 +66,7 @@
                     <td th:text="${item.httpPort}">HTTP 端口</td>
                     <td th:text="${item.healthCheck}">健康检查地址</td>
                     <td th:text="${item.packagePath}">包路径</td>
-                    <td th:text="${item.status}">运行状态</td>
+                    <td class="app-status" th:text="${item.status}">运行状态</td>
                     <td th:text="${item.startTime}">启动时间</td>
                     <td th:text="${item.pid}">PID</td>
                     <td th:text="${item.lastCheck}">上次健康检查</td>
@@ -91,5 +86,23 @@
     </div>
 </div>
 <script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
+<script type="text/javascript">
+    function getPageByEnv() {
+        var selectedOption = $("#getPageByEnv option:selected")
+        var param = selectedOption.text()
+        url = '?env=' + param
+        window.location.href = window.location.pathname + url;
+    }
+
+    $(".app-status").each(function () {
+        var text = $(this).text().trim()
+        if (text === 'Online') {
+            $(this).css("color", "#009688")
+        } else {
+            $(this).css("color", "#ff0000")
+        }
+    })
+</script>
 </body>
 </html>

+ 0 - 84
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImplTest.java

@@ -1,84 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service.impl;
-
-import cn.reghao.autodop.dmaster.DmasterApplication;
-import cn.reghao.autodop.dmaster.app.db.query.AppDeployingQuery;
-import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
-import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
-import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
-import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
-import cn.reghao.autodop.dmaster.app.service.bd.AppBuildingService;
-import cn.reghao.autodop.dmaster.app.service.bd.AppDeployingService;
-import cn.reghao.autodop.dmaster.app.service.bd.AppRunningService;
-import cn.reghao.autodop.dmaster.monitor.db.crud.AppMonitorCrud;
-import cn.reghao.autodop.dmaster.monitor.model.po.AppMonitor;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-@ActiveProfiles("dev")
-@SpringBootTest(classes = DmasterApplication.class)
-@RunWith(SpringRunner.class)
-public class BuildDeployConfigServiceImplTest {
-    @Autowired
-    private AppConfigQuery appConfigQuery;
-    @Autowired
-    private AppBuildingService buildingService;
-    @Autowired
-    private AppDeployingService deployingService;
-    @Autowired
-    private AppDeployingQuery deployingQuery;
-    @Autowired
-    private AppRunningService runningService;
-    @Autowired
-    private AppDeployConfigQuery deployConfigQuery;
-    @Autowired
-    private AppMonitorCrud appMonitorCrud;
-
-    @Test
-    public void generateAppBuilding() {
-        List<AppConfig> list = appConfigQuery.findAll().stream()
-                .filter(appConfig -> appConfig.getEnv().equals(EnvList.prod.getName()))
-                .collect(Collectors.toList());
-
-        list.forEach(appBuilding -> {
-            buildingService.add(appBuilding);
-        });
-
-        System.out.println();
-    }
-
-    @Test
-    public void generateAppDeploying() {
-        List<AppConfig> list = appConfigQuery.findAll().stream()
-                .filter(appConfig -> appConfig.getEnv().equals(EnvList.dev.getName()))
-                .collect(Collectors.toList());
-        list.forEach(appConfig -> {
-            deployConfigQuery.findByAppId(appConfig.getAppId()).forEach(appDeployConfig -> {
-                deployingService.add(appDeployConfig);
-            });
-        });
-    }
-
-    @Test
-    public void generateAppRunning() {
-        deployingQuery.findAll().forEach(appDeploying -> {
-            runningService.add(appDeploying);
-        });
-    }
-
-    @Test
-    public void generateAppMonitor() {
-        List<AppMonitor> list = appConfigQuery.findAll().stream()
-                .filter(appConfig -> appConfig.getEnv().equals(EnvList.dev.getName()))
-                .map(AppMonitor::new)
-                .collect(Collectors.toList());
-
-        appMonitorCrud.saveAll(list);
-    }
-}