소스 검색

测试环境版本

reghao 5 년 전
부모
커밋
391325bb82
29개의 변경된 파일351개의 추가작업 그리고 438개의 파일을 삭제
  1. 42 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppPageController.java
  2. 4 19
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployLogController.java
  3. 1 7
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/config/AppOrchestrationCrudService.java
  4. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppBuilding.java
  5. 32 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppDeploying.java
  6. 20 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppRunning.java
  7. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/AppBuildingRepository.java
  8. 14 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/AppDeployingRepository.java
  9. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/AppOrchestrationRepository.java
  10. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/ProjOrchestrationRepository.java
  11. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/BuildDirRepository.java
  12. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/CompilerConfigRepository.java
  13. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/PackerConfigRepository.java
  14. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/RepoAuthConfigRepository.java
  15. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/BuildLogRepository.java
  16. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/DeployLogRepository.java
  17. 0 18
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/status/AppStatusRepository.java
  18. 0 19
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/status/BuildDeployAppRepository.java
  19. 0 84
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployAppCrudService.java
  20. 0 93
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java
  21. 0 94
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/RefreshService.java
  22. 52 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachinePageController.java
  23. 29 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/vo/MachineInfoVO.java
  24. 20 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/dispatcher/AppOpsDispatcher.java
  25. 0 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/dispatcher/MachineOpsDispatcher.java
  26. 2 2
      dmaster/src/main/resources/templates/app/build.html
  27. 45 0
      dmaster/src/main/resources/templates/app/status.html
  28. 76 0
      dmaster/src/main/resources/templates/machine/host.html
  29. 0 81
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/RefreshServiceTest.java

+ 42 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppPageController.java

@@ -1,13 +1,18 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
+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.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
 import cn.reghao.autodop.dmaster.app.repository.AppBuildingRepository;
+import cn.reghao.autodop.dmaster.app.repository.AppDeployingRepository;
 import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
 import cn.reghao.autodop.dmaster.app.entity.AppBuilding;
 import cn.reghao.autodop.dmaster.app.entity.AppDeploying;
+import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import io.swagger.annotations.Api;
@@ -21,7 +26,10 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -34,13 +42,19 @@ import java.util.List;
 public class AppPageController {
     private AppOrchestrationRepository appRepository;
     private AppBuildingRepository appBuildingRepository;
+    private AppDeployingRepository appDeployingRepository;
+    private BuildLogRepository buildLogRepository;
     private DeployLogRepository deployLogRepository;
 
     public AppPageController(AppOrchestrationRepository appRepository,
                              AppBuildingRepository appBuildingRepository,
+                             AppDeployingRepository appDeployingRepository,
+                             BuildLogRepository buildLogRepository,
                              DeployLogRepository deployLogRepository) {
         this.appRepository = appRepository;
         this.appBuildingRepository = appBuildingRepository;
+        this.appDeployingRepository = appDeployingRepository;
+        this.buildLogRepository = buildLogRepository;
         this.deployLogRepository = deployLogRepository;
     }
 
@@ -66,6 +80,25 @@ public class AppPageController {
     @ApiOperation(value = "部署页面")
     @GetMapping("/deploy/{appId}")
     public String deployPage(@PathVariable("appId") String appId, Model model) {
+        int page = 1;
+        int size = 10;
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+
+        Page<BuildLog> buildLogPage = buildLogRepository.findByAppId(appId, pageRequest);
+        Map<String, List<DeployLog>> map = new HashMap<>();
+        for (BuildLog buildLog : buildLogPage.getContent()) {
+            if (buildLog.getResult().getCode() != ResultStatus.SUCCESS.getCode()) {
+                continue;
+            }
+
+            String buildLogId = buildLog.getId();
+            List<DeployLog> deployLogs = deployLogRepository.findByBuildLogId(buildLogId);
+            if (!deployLogs.isEmpty()) {
+                map.put(buildLogId, deployLogs);
+            }
+        }
+
         AppOrchestration app = appRepository.findByAppId(appId);
         List<AppDeploying> list = new ArrayList<>();
         /*PageList<AppBuilding> pageList = PageList.emptyPageList(appPage);
@@ -87,6 +120,15 @@ public class AppPageController {
     @ApiOperation(value = "运行状态页面")
     @GetMapping("/status")
     public String statusPage(Model model) {
+        int page = 1;
+        int size = 10;
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+        Page<AppDeploying> appDeployingPage = appDeployingRepository.findAll(pageRequest);
+        PageList<AppDeploying> pageList = PageList.pageList(appDeployingPage);
+
+        model.addAttribute("page", appDeployingPage);
+        model.addAttribute("list", pageList.getList());
         return "/app/status";
     }
 

+ 4 - 19
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployLogController.java

@@ -1,11 +1,6 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.dmaster.utils.WebBody;
-import cn.reghao.autodop.dmaster.app.constant.EnvType;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
-import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
-import cn.reghao.autodop.dmaster.app.service.BuildService;
-import cn.reghao.autodop.dmaster.common.db.PageList;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -21,12 +16,6 @@ import org.springframework.web.bind.annotation.*;
 @RestController
 @RequestMapping("/api/app/bd")
 public class BuildDeployLogController {
-    private BuildService buildService;
-
-    public BuildDeployLogController(BuildService buildService) {
-        this.buildService = buildService;
-    }
-
     @ApiOperation(value = "代码日志")
     @GetMapping("/log/commit")
     public ResponseEntity<String> commitLogs(@RequestParam("page") int page, @RequestParam("size") int size,
@@ -45,8 +34,7 @@ public class BuildDeployLogController {
     @GetMapping("/log/build")
     public ResponseEntity<String> buildLogs(@RequestParam("page") int page, @RequestParam("size") int size,
                                             @RequestParam("env") String env) {
-        PageList<BuildLog> pageList = buildService.buildLogs(page, size, EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebBody.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success("pageList"));
     }
 
     @ApiOperation(value = "某个应用的构建日志")
@@ -54,23 +42,20 @@ public class BuildDeployLogController {
     public ResponseEntity<String> buildLogsByApp(@PathVariable("appId") String appId,
                                                  @RequestParam("page") int page,
                                                  @RequestParam("size") int size) {
-        PageList<BuildLog> pageList = buildService.buildLogsByApp(page, size, appId);
-        return ResponseEntity.ok().body(WebBody.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success("pageList"));
     }
 
     @ApiOperation(value = "部署日志")
     @GetMapping("/log/deploy")
     public ResponseEntity<String> deployLogs(@RequestParam("page") int page, @RequestParam("size") int size,
                                              @RequestParam("env") String env) {
-        PageList<DeployLog> pageList = buildService.deployLogs(page, size, EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebBody.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success("pageList"));
     }
 
     @ApiOperation(value = "某个应用的部署日志")
     @GetMapping("/log/deploy/{appId}")
     public ResponseEntity<String> deployLogsByApp(@RequestParam("page") int page, @RequestParam("size") int size,
                                                   @PathVariable("appId") String appId) {
-        PageList<DeployLog> pageList = buildService.deployLogsByApp(page, size, appId);
-        return ResponseEntity.ok().body(WebBody.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success("pageList"));
     }
 }

+ 1 - 7
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/config/AppOrchestrationCrudService.java

@@ -3,10 +3,8 @@ package cn.reghao.autodop.dmaster.app.db.config;
 import cn.reghao.autodop.dmaster.app.constant.AppType;
 import cn.reghao.autodop.dmaster.common.db.CrudOps;
 import cn.reghao.autodop.dmaster.common.db.PageList;
-import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
-import cn.reghao.autodop.dmaster.app.service.BuildDeployAppCrudService;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
@@ -26,14 +24,11 @@ import java.util.List;
 public class AppOrchestrationCrudService implements CrudOps<AppOrchestration> {
     private AppOrchestrationRepository appRepository;
     private SharedEntityChecker sharedEntityChecker;
-    private BuildDeployAppCrudService buildDeployAppCrudService;
 
     public AppOrchestrationCrudService(AppOrchestrationRepository appRepository,
-                                       SharedEntityChecker sharedEntityChecker,
-                                       BuildDeployAppCrudService buildDeployAppCrudService) {
+                                       SharedEntityChecker sharedEntityChecker) {
         this.appRepository = appRepository;
         this.sharedEntityChecker = sharedEntityChecker;
-        this.buildDeployAppCrudService = buildDeployAppCrudService;
     }
 
     @Override
@@ -124,7 +119,6 @@ public class AppOrchestrationCrudService implements CrudOps<AppOrchestration> {
         } else {
             appEntity.setIsDelete(true);
             appRepository.save(appEntity);
-            //buildDeployAppCrudService.delete(appEntity.getAppId());
         }
     }
 

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppBuilding.java

@@ -21,6 +21,7 @@ import java.time.LocalDateTime;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class AppBuilding extends BaseEntity<Integer> {
+    private String buildLogId;
     private String appId;
     private String env;
     private String appType;
@@ -30,7 +31,6 @@ public class AppBuilding extends BaseEntity<Integer> {
     private String buildResult;
     private LocalDateTime buildTime;
     private String buildBy;
-    private String buildLogId;
 
     public AppBuilding(String appId, String env, String appType, String branch) {
         this.appId = appId;
@@ -41,6 +41,7 @@ public class AppBuilding extends BaseEntity<Integer> {
 
     public static AppBuilding from(BuildLog buildLog) {
         AppBuilding appBuilding = new AppBuilding();
+        appBuilding.setBuildLogId(buildLog.getId());
         appBuilding.setAppId(buildLog.getAppId());
         appBuilding.setEnv(buildLog.getEnv());
         appBuilding.setAppType(buildLog.getAppType());
@@ -59,7 +60,6 @@ public class AppBuilding extends BaseEntity<Integer> {
             appBuilding.setBuildResult(ResultStatus.FAIL.getMsg());
         }
         appBuilding.setBuildTime(buildLog.getBuildTime().getBuildTime());
-        appBuilding.setBuildLogId(buildLog.getId());
         return appBuilding;
     }
 }

+ 32 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppDeploying.java

@@ -1,10 +1,15 @@
 package cn.reghao.autodop.dmaster.app.entity;
 
+import cn.reghao.autodop.common.dagent.app.api.data.AppStatus;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
+import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @author reghao
@@ -14,5 +19,31 @@ import javax.persistence.Entity;
 @EqualsAndHashCode(callSuper = false)
 @Entity
 public class AppDeploying extends BaseEntity<Integer> {
-    private String appBuildingId;
+    private String buildLogId;
+    private String appId;
+    private String env;
+    private String branch;
+    private String commitId;
+    /*@ElementCollection(targetClass = AppRunning.class)
+    private List<AppRunning> appRunnings;*/
+    private String machineIpv4;
+    private LocalDateTime startTime;
+    private Integer pid;
+    private Boolean isRunning;
+    private LocalDateTime lastCheck;
+
+    public static AppDeploying from(BuildLog buildLog, AppStatus appStatus) {
+        AppDeploying appDeploying = new AppDeploying();
+        appDeploying.setBuildLogId(buildLog.getId());
+        appDeploying.setAppId(appStatus.getAppId());
+        appDeploying.setEnv(buildLog.getEnv());
+        appDeploying.setBranch(buildLog.getBranch());
+        appDeploying.setCommitId(buildLog.getCommitInfo().getCommitId());
+        appDeploying.setMachineIpv4(appStatus.getMachineIpv4());
+        appDeploying.setStartTime(appStatus.getStartTime());
+        appDeploying.setPid(appStatus.getPid());
+        appDeploying.setIsRunning(appStatus.getIsRunning());
+        appDeploying.setLastCheck(LocalDateTime.now());
+        return appDeploying;
+    }
 }

+ 20 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/AppRunning.java

@@ -0,0 +1,20 @@
+package cn.reghao.autodop.dmaster.app.entity;
+
+import lombok.Data;
+
+import javax.persistence.Embeddable;
+import java.time.LocalDateTime;
+
+/**
+ * @author reghao
+ * @date 2021-05-31 13:36:46
+ */
+@Embeddable
+@Data
+public class AppRunning {
+    private String machineId;
+    private String machineIpv4;
+    private Boolean isRunning;
+    private LocalDateTime startTime;
+    private Integer pid;
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/AppBuildingRepository.java

@@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
  * @author reghao
  * @date 2021-05-24 15:20:24
  */
-public interface AppBuildingRepository extends JpaRepository<AppBuilding, Long> {
+public interface AppBuildingRepository extends JpaRepository<AppBuilding, Integer> {
     AppBuilding findByAppId(String appId);
     Page<AppBuilding> findAllByEnv(String env, Pageable pageable);
     Page<AppBuilding> findAllByEnvAndAppType(String env, String appType, Pageable pageable);

+ 14 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/AppDeployingRepository.java

@@ -0,0 +1,14 @@
+package cn.reghao.autodop.dmaster.app.repository;
+
+import cn.reghao.autodop.dmaster.app.entity.AppDeploying;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * @author reghao
+ * @date 2021-05-24 15:20:24
+ */
+public interface AppDeployingRepository extends JpaRepository<AppDeploying, Integer> {
+    AppDeploying findByAppId(String appId);
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/AppOrchestrationRepository.java

@@ -15,7 +15,7 @@ import java.util.List;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface AppOrchestrationRepository extends JpaRepository<AppOrchestration, Long>, JpaSpecificationExecutor<AppOrchestration> {
+public interface AppOrchestrationRepository extends JpaRepository<AppOrchestration, Integer>, JpaSpecificationExecutor<AppOrchestration> {
     List<AppOrchestration> findByEnableTrueAndEnv(String env);
     Page<AppOrchestration> findByEnableTrueAndEnv(String env, Pageable pageable);
     List<AppOrchestration> findByEnableTrueAndEnvAndAppType(String env, String appType);

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/ProjOrchestrationRepository.java

@@ -11,7 +11,7 @@ import javax.transaction.Transactional;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface ProjOrchestrationRepository extends JpaRepository<ProjOrchestration, Long> {
+public interface ProjOrchestrationRepository extends JpaRepository<ProjOrchestration, Integer> {
     ProjOrchestration findByIsDeleteFalseAndProjId(String projId);
     //Page<ProjOrchestration> findByIsDeleteFalseAndEnv(String env, Pageable pageable);
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/BuildDirRepository.java

@@ -8,6 +8,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface BuildDirRepository extends JpaRepository<BuildDir, Long> {
+public interface BuildDirRepository extends JpaRepository<BuildDir, Integer> {
     BuildDir findByMachineId(String machineId);
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/CompilerConfigRepository.java

@@ -11,7 +11,7 @@ import java.util.List;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface CompilerConfigRepository extends JpaRepository<CompilerConfig, Long> {
+public interface CompilerConfigRepository extends JpaRepository<CompilerConfig, Integer> {
     CompilerConfig findByIsDeleteFalseAndName(String compilerName);
     List<CompilerConfig> findAllByIsDeleteFalse();
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/PackerConfigRepository.java

@@ -11,7 +11,7 @@ import java.util.List;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface PackerConfigRepository extends JpaRepository<PackerConfig, Long> {
+public interface PackerConfigRepository extends JpaRepository<PackerConfig, Integer> {
     PackerConfig findByIsDeleteFalseAndName(String packerName);
     List<PackerConfig> findAllByIsDeleteFalse();
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/config/build/RepoAuthConfigRepository.java

@@ -9,7 +9,7 @@ import java.util.List;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface RepoAuthConfigRepository extends JpaRepository<RepoAuthConfig, Long> {
+public interface RepoAuthConfigRepository extends JpaRepository<RepoAuthConfig, Integer> {
     RepoAuthConfig findByIsDeleteFalseAndName(String name);
     List<RepoAuthConfig> findAllByIsDeleteFalse();
 }

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/BuildLogRepository.java

@@ -10,4 +10,5 @@ import org.springframework.data.mongodb.repository.MongoRepository;
  * @date 2020-01-21 14:53:03
  */
 public interface BuildLogRepository extends MongoRepository<BuildLog, String> {
+    Page<BuildLog> findByAppId(String appId, Pageable pageable);
 }

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/DeployLogRepository.java

@@ -1,13 +1,14 @@
 package cn.reghao.autodop.dmaster.app.repository.log;
 
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.mongodb.repository.MongoRepository;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface DeployLogRepository extends MongoRepository<DeployLog, Long> {
+public interface DeployLogRepository extends MongoRepository<DeployLog, String> {
+    List<DeployLog> findByBuildLogId(String buildLogId);
 }

+ 0 - 18
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/status/AppStatusRepository.java

@@ -1,18 +0,0 @@
-package cn.reghao.autodop.dmaster.app.repository.status;
-
-/**
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-/*public interface AppStatusRepository extends JpaRepository<DeployedAppStatus, Long> {
-    Page<DeployedAppStatus> findAllByEnv(String env, Pageable pageable);
-
-    *//**
-     * 找到唯一的 AppStatus 对象
-     *
-     * @param
-     * @return
-     * @date 2021-02-25 上午11:50
-     *//*
-    DeployedAppStatus findByAppIdAndCommitIdAndMachineId(String appId, String commitId, String machineId);
-}*/

+ 0 - 19
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/status/BuildDeployAppRepository.java

@@ -1,19 +0,0 @@
-package cn.reghao.autodop.dmaster.app.repository.status;
-
-import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-public interface BuildDeployAppRepository extends JpaRepository<BuildDeployApp, Long> {
-    BuildDeployApp findByAppId(String appId);
-    BuildDeployApp findByIsDeleteFalseAndAppId(String appId);
-    Page<BuildDeployApp> findByIsDeleteFalseAndEnableIsTrueAndEnv(String env, Pageable pageable);
-    List<BuildDeployApp> findByEnv(String env);
-}

+ 0 - 84
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployAppCrudService.java

@@ -1,84 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service;
-
-import cn.reghao.autodop.dmaster.common.db.CrudOps;
-import cn.reghao.autodop.dmaster.common.db.PageList;
-import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
-import cn.reghao.autodop.dmaster.app.repository.status.BuildDeployAppRepository;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2021-02-19 16:39:29
- */
-//@CacheConfig(cacheNames = {"buildDeployAppCache"})
-@Service
-public class BuildDeployAppCrudService implements CrudOps<BuildDeployApp> {
-    private BuildDeployAppRepository buildDeployAppRepository;
-
-    public BuildDeployAppCrudService(BuildDeployAppRepository buildDeployAppRepository) {
-        this.buildDeployAppRepository = buildDeployAppRepository;
-    }
-
-    //@CachePut(cacheNames = { "app" }, key = "#buildDeployApp.appId")
-    @Override
-    public void insert(BuildDeployApp buildDeployApp) {
-        BuildDeployApp entity = buildDeployAppRepository.findByAppId(buildDeployApp.getAppId());
-        if (entity == null) {
-            buildDeployApp.setIsDelete(false);
-            buildDeployAppRepository.save(buildDeployApp);
-        }
-    }
-
-    @Override
-    public void batchInsert(List<BuildDeployApp> buildDeployApps) {
-        buildDeployAppRepository.saveAll(buildDeployApps.stream()
-                .peek(buildDeployApp -> buildDeployApp.setIsDelete(false))
-                .collect(Collectors.toList()));
-    }
-
-    //@CacheEvict(cacheNames = { "app" }, key = "#buildDeployApp.appId")
-    @Override
-    public void update(BuildDeployApp buildDeployApp) throws Exception {
-        BuildDeployApp entity = buildDeployAppRepository.findByAppId(buildDeployApp.getAppId());
-        if (entity != null) {
-            buildDeployApp.setId(entity.getId());
-            buildDeployApp.setCreateTime(entity.getCreateTime());
-            buildDeployApp.setUpdateTime(LocalDateTime.now());
-        }
-        buildDeployApp.setIsDelete(false);
-        buildDeployAppRepository.save(buildDeployApp);
-    }
-
-    @Override
-    public PageList<BuildDeployApp> getByPage(int page, int size, String env) {
-        // 按最近更新时间降序
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Page<BuildDeployApp> page1 =
-                buildDeployAppRepository.findByIsDeleteFalseAndEnableIsTrueAndEnv(env, pageRequest);
-        PageList<BuildDeployApp> pageList = new PageList<>();
-        pageList.setTotalSize(page1.getTotalElements());
-        pageList.setTotalPages(page1.getTotalPages());
-        pageList.setList(page1.getContent());
-        return pageList;
-    }
-
-    @Override
-    public void delete(String uniqueKey) throws Exception {
-        BuildDeployApp entity = buildDeployAppRepository.findByIsDeleteFalseAndAppId(uniqueKey);
-        if (entity == null) {
-            throw new Exception(uniqueKey + " 不存在");
-        } else {
-            entity.setIsDelete(true);
-            buildDeployAppRepository.save(entity);
-        }
-    }
-}

+ 0 - 93
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java

@@ -1,93 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service;
-
-import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
-import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
-import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
-import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
-import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
-import cn.reghao.autodop.dmaster.app.repository.status.BuildDeployAppRepository;
-import cn.reghao.autodop.dmaster.common.db.PageList;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2020-02-28 17:10:37
- */
-@Service
-public class BuildService {
-    private AppOrchestrationRepository appOrchestrationRepository;
-    private BuildDeployCache cache;
-    private BuildDeployAppCrudService buildDeployAppCrudService;
-    private BuildLogRepository buildLogRepository;
-    private DeployLogRepository deployLogRepository;
-    private BuildDeployAppRepository buildDeployAppRepository;
-
-    public BuildService(AppOrchestrationRepository appOrchestrationRepository,
-                        BuildDeployCache cache,
-                        BuildDeployAppCrudService buildDeployAppCrudService,
-                        BuildLogRepository buildLogRepository,
-                        DeployLogRepository deployLogRepository,
-                        BuildDeployAppRepository buildDeployAppRepository) {
-        this.cache = cache;
-        this.buildDeployAppCrudService = buildDeployAppCrudService;
-        this.buildLogRepository = buildLogRepository;
-        this.deployLogRepository = deployLogRepository;
-        this.buildDeployAppRepository = buildDeployAppRepository;
-    }
-
-    public PageList<BuildLog> buildLogs(int page, int size, String env) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-
-        Page<BuildLog> buildLogs = buildLogRepository.findAll(pageRequest);
-        PageList<BuildLog> pageList = new PageList<>();
-        pageList.setTotalPages(buildLogs.getTotalPages());
-        pageList.setTotalSize(buildLogs.getTotalElements());
-        pageList.setHasNext(buildLogs.hasNext());
-        pageList.setList(buildLogs.getContent());
-        return pageList;
-    }
-
-    public PageList<BuildLog> buildLogsByApp(int page, int size, String appId) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-
-        Page<BuildLog> buildLogs = buildLogRepository.findAll(pageRequest);
-        PageList<BuildLog> pageList = new PageList<>();
-        pageList.setTotalPages(buildLogs.getTotalPages());
-        pageList.setTotalSize(buildLogs.getTotalElements());
-        pageList.setHasNext(buildLogs.hasNext());
-        pageList.setList(buildLogs.getContent());
-        return pageList;
-    }
-
-    public PageList<DeployLog> deployLogs(int page, int size, String env) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-        Page<DeployLog> deployLogs = deployLogRepository.findAll(pageRequest);
-
-        PageList<DeployLog> pageList = new PageList<>();
-        pageList.setTotalPages(deployLogs.getTotalPages());
-        pageList.setTotalSize(deployLogs.getTotalElements());
-        pageList.setHasNext(deployLogs.hasNext());
-        pageList.setList(deployLogs.getContent());
-        return pageList;
-    }
-
-    public PageList<DeployLog> deployLogsByApp(int page, int size, String appId) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-        Page<DeployLog> deployLogs = deployLogRepository.findAll(pageRequest);
-
-        PageList<DeployLog> pageList = new PageList<>();
-        pageList.setTotalPages(deployLogs.getTotalPages());
-        pageList.setTotalSize(deployLogs.getTotalElements());
-        pageList.setHasNext(deployLogs.hasNext());
-        pageList.setList(deployLogs.getContent());
-        return pageList;
-    }
-}

+ 0 - 94
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/RefreshService.java

@@ -1,94 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service;
-
-import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
-import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
-import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
-import cn.reghao.autodop.dmaster.app.repository.status.BuildDeployAppRepository;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * 刷新服务
- *
- * @author reghao
- * @date 2021-03-04 14:09:45
- */
-@Service
-public class RefreshService {
-    private AppOrchestrationRepository appOrchestrationRepository;
-    private BuildDeployAppRepository buildDeployAppRepository;
-    private BuildDeployAppCrudService buildDeployAppCrudService;
-    private DeployLogRepository deployLogRepository;
-
-    public RefreshService(AppOrchestrationRepository appOrchestrationRepository,
-                          BuildDeployAppRepository buildDeployAppRepository,
-                          BuildDeployAppCrudService buildDeployAppCrudService,
-                          DeployLogRepository deployLogRepository) {
-        this.appOrchestrationRepository = appOrchestrationRepository;
-        this.buildDeployAppRepository = buildDeployAppRepository;
-        this.buildDeployAppCrudService = buildDeployAppCrudService;
-        this.deployLogRepository = deployLogRepository;
-    }
-
-    /**
-     * TODO 刷新构建部署应用列表
-     * 比较 AppConfig 和 BuildDeployApp 表,这个两个表的记录应始终一一对应
-     *
-     * @param
-     * @return
-     * @date 2021-03-04 下午2:08
-     */
-    public void refreshBuildList(String env) {
-        List<BuildDeployApp> buildDeployApps = buildDeployAppRepository.findByEnv(env);
-        Set<String> buildDeployAppIds = buildDeployApps.stream()
-                .map(BuildDeployApp::getAppId).collect(Collectors.toSet());
-
-        int page = 1;
-        int size = 50;
-        Page<AppOrchestration> appConfigPage = appOrchestrationRepository.findByIsDeleteFalseAndEnv(env, pageRequest(page, size));
-        List<AppOrchestration> apps = appConfigPage.stream()
-                .filter(appConfig -> !buildDeployAppIds.contains(appConfig.getAppId()))
-                .collect(Collectors.toList());
-
-        refresh(apps);
-        while (appConfigPage.hasNext()) {
-            page++;
-            appConfigPage = appOrchestrationRepository.findByIsDeleteFalseAndEnv(env, pageRequest(page, size));
-            apps = appConfigPage.stream()
-                    .filter(appConfig -> !buildDeployAppIds.contains(appConfig.getAppId()))
-                    .collect(Collectors.toList());
-            refresh(apps);
-        }
-    }
-
-    private PageRequest pageRequest(int page, int size) {
-        return PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
-    }
-
-    /**
-     * 刷新构建部署应用列表
-     *
-     * @param
-     * @return
-     * @date 2021-03-04 下午2:08
-     */
-    private void refresh(List<AppOrchestration> appOrchestrations) {
-    }
-
-    /**
-     * 刷新应用状态列表
-     *
-     * @param
-     * @return
-     * @date 2021-03-04 下午4:46
-     */
-    private void refreshAppStatus() {
-    }
-}

+ 52 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachinePageController.java

@@ -0,0 +1,52 @@
+package cn.reghao.autodop.dmaster.machine.controller;
+
+import cn.reghao.autodop.dmaster.common.db.PageList;
+import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
+import cn.reghao.autodop.dmaster.machine.repository.MachineInfoRepository;
+import cn.reghao.autodop.dmaster.machine.vo.MachineInfoVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.function.Function;
+
+/**
+ * @author reghao
+ * @date 2019-08-30 18:49:15
+ */
+@Slf4j
+@Api(tags = "机器页面接口")
+@Controller
+@RequestMapping("/machine")
+public class MachinePageController {
+    private MachineInfoRepository machineInfoRepository;
+
+    public MachinePageController(MachineInfoRepository machineInfoRepository) {
+        this.machineInfoRepository = machineInfoRepository;
+    }
+
+    @ApiOperation(value = "机器列表页面")
+    @GetMapping("/host")
+    public String hostPage(Model model) {
+        int page = 1;
+        int size = 10;
+        PageRequest pageRequest =
+                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
+
+        Page<MachineInfo> machineInfoPage = machineInfoRepository.findAll(pageRequest);
+        Page<MachineInfoVO> machineInfoVOPage = machineInfoPage.map(machineInfo -> MachineInfoVO.from(machineInfo));
+
+        PageList<MachineInfoVO> pageList = PageList.pageList(machineInfoVOPage);
+
+        model.addAttribute("page", machineInfoVOPage);
+        model.addAttribute("list", pageList.getList());
+        return "/machine/host";
+    }
+}

+ 29 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/vo/MachineInfoVO.java

@@ -1,9 +1,11 @@
 package cn.reghao.autodop.dmaster.machine.vo;
 
+import cn.reghao.autodop.common.utils.DateTimeConverter;
 import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.entity.NetworkInfo;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -13,17 +15,41 @@ import java.util.List;
 @Data
 public class MachineInfoVO {
     private String machineId;
-    private String ipv4;
+    private String machineIpv4;
+    private String bootTime;
+    private String osArch;
+    private String osName;
+    private String osVersion;
+    private int cpus;
+    private String totalMem;
     private String lastCheckedTime;
 
+    public static MachineInfoVO from(MachineInfo machineInfo) {
+        MachineInfoVO vo = new MachineInfoVO();
+        vo.machineId = machineInfo.getMachineId();
+        List<NetworkInfo> list = machineInfo.getNetworkInfo();
+        if (!list.isEmpty()) {
+            vo.machineIpv4 = list.get(0).getIpv4();
+        }
+        vo.bootTime = machineInfo.getOsInfo().getBootTime();
+        vo.osArch = machineInfo.getOsInfo().getArch();
+        vo.osName = machineInfo.getOsInfo().getName();
+        vo.osVersion = machineInfo.getOsInfo().getVersion();
+        vo.cpus = machineInfo.getCpuInfo().getCpus();
+        vo.totalMem = machineInfo.getMemoryInfo().getTotal();
+        vo.lastCheckedTime = DateTimeConverter.format(LocalDateTime.now());
+        return vo;
+    }
+
     public static MachineInfoVO of(MachineInfo machineInfo, String lastCheckedTime) {
         MachineInfoVO vo = new MachineInfoVO();
         vo.machineId = machineInfo.getMachineId();
-        vo.lastCheckedTime = lastCheckedTime;
         List<NetworkInfo> list = machineInfo.getNetworkInfo();
         if (!list.isEmpty()) {
-            vo.ipv4 = list.get(0).getIpv4();
+            vo.machineIpv4 = list.get(0).getIpv4();
         }
+
+        vo.lastCheckedTime = lastCheckedTime;
         return vo;
     }
 }

+ 20 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/dispatcher/AppOpsDispatcher.java

@@ -6,10 +6,12 @@ import cn.reghao.autodop.common.message.AppOps;
 import cn.reghao.autodop.common.result.ResultStatus;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
+import cn.reghao.autodop.dmaster.app.entity.AppDeploying;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.config.NotifyReceiver;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
+import cn.reghao.autodop.dmaster.app.repository.AppDeployingRepository;
 import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
 import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
 import cn.reghao.autodop.dmaster.app.service.bd.DeployNotifyMsg;
@@ -18,6 +20,7 @@ import cn.reghao.autodop.dmaster.utils.notifier.NotifyService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Optional;
 
@@ -31,15 +34,18 @@ import java.util.Optional;
 @Component
 public class AppOpsDispatcher {
     private BuildLogRepository buildLogRepository;
+    private AppDeployingRepository appDeployingRepository;
     private DeployLogRepository deployLogRepository;
     private BuildDeployCache cache;
     private NotifyService notifyService;
 
     public AppOpsDispatcher(BuildLogRepository buildLogRepository,
+                            AppDeployingRepository appDeployingRepository,
                             DeployLogRepository deployLogRepository,
                             BuildDeployCache cache,
                             NotifyService notifyService) {
         this.buildLogRepository = buildLogRepository;
+        this.appDeployingRepository = appDeployingRepository;
         this.deployLogRepository = deployLogRepository;
         this.cache = cache;
         this.notifyService = notifyService;
@@ -62,10 +68,21 @@ public class AppOpsDispatcher {
                     List<NotifyReceiver> notifyReceivers = app.getNotifyReceivers();
                     notifyReceivers.forEach(notifyReceiver -> notifyService.notify(notifyReceiver, dingMsg));
                     log.info("应用 {} 部署成功...", buildLog.getAppId());
-                }
 
-                if (deployResult.getResult().getCode() == ResultStatus.SUCCESS.getCode()) {
-                    AppStatus appStatus = deployResult.getAppStatus();
+                    if (deployResult.getResult().getCode() == ResultStatus.SUCCESS.getCode()) {
+                        AppStatus appStatus = deployResult.getAppStatus();
+                        AppDeploying appDeploying = AppDeploying.from(buildLog, appStatus);
+                        appDeploying.setLastCheck(LocalDateTime.now());
+
+                        String appId = appDeploying.getAppId();
+                        AppDeploying entity = appDeployingRepository.findByAppId(appId);
+                        if (entity != null) {
+                            appDeploying.setId(entity.getId());
+                            appDeploying.setIsDelete(entity.getIsDelete());
+                            appDeploying.setCreateTime(entity.getCreateTime());
+                        }
+                        appDeployingRepository.save(appDeploying);
+                    }
                 }
                 break;
             case appStatusResult:

+ 0 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/dispatcher/MachineOpsDispatcher.java

@@ -6,7 +6,6 @@ import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.machine.entity.MachineHeartbeat;
 import cn.reghao.autodop.dmaster.machine.entity.MachineLog;
 import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
-import cn.reghao.autodop.dmaster.machine.repository.MachineInfoRepository;
 import cn.reghao.autodop.dmaster.machine.service.crud.MachineCrudService;
 import cn.reghao.autodop.dmaster.machine.service.crud.MachineLogCrudService;
 import lombok.extern.slf4j.Slf4j;
@@ -24,7 +23,6 @@ import java.util.concurrent.ConcurrentHashMap;
 @Slf4j
 @Component
 public class MachineOpsDispatcher {
-    private MachineInfoRepository machineRepository;
     private MachineCrudService machineCrudService;
     private MachineLogCrudService machineLogCrudService;
     private Map<String, String> machineStatus;

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

@@ -55,7 +55,7 @@
                     <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.appId}">
                         <i class="layui-icon layui-icon-ok"></i></label></td>
                     <td>
-                        <a class="open-popup" data-title="应用配置详情" data-size="1200,600" href="#"
+                        <a class="open-popup" data-title="应用配置详情" data-size="1000,600" href="#"
                            th:text="${item.appId}" th:attr="data-url=@{'/app/config/app/detail/'+${item.appId}}"></a>
                     </td>
                     <td th:text="${item.branch}">分支</td>
@@ -71,7 +71,7 @@
                         <a class="ajax-post" th:href="@{'/api/app/bd/update?appId='+${item.appId}}">更新</a>
                         <a class="ajax-post" th:href="@{'/api/app/bd/build?appId='+${item.appId}}">构建</a>
                         <a class="open-popup" data-title="应用部署" th:attr="data-url=@{'/app/deploy/' + ${item.appId}}"
-                           data-size="800,600" href="#">部署</a>
+                           data-size="1000,600" href="#">部署</a>
                     </td>
                 </tr>
                 </tbody>

+ 45 - 0
dmaster/src/main/resources/templates/app/status.html

@@ -10,6 +10,51 @@
         <span><i class="fa fa-bars"></i> 应用状态</span>
         <i class="layui-icon layui-icon-refresh refresh-btn"></i>
     </div>
+    <div class="timo-table-wrap">
+        <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="appId">应用</th>
+                <th class="sortable" data-field="branch">分支</th>
+                <th class="sortable" data-field="commitId">版本</th>
+                <th class="sortable" data-field="machineIpv4">节点地址</th>
+                <th class="sortable" data-field="startTime">启动时间</th>
+                <th class="sortable" data-field="pid">PID</th>
+                <th class="sortable" data-field="isRunning">运行状态</th>
+                <th class="sortable" data-field="lastCheck">上次检查时间</th>
+                <th>操作</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr th:each="item:${list}">
+                <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.appId}">
+                    <i class="layui-icon layui-icon-ok"></i></label></td>
+                <td>
+                    <a class="open-popup" data-title="应用配置详情" data-size="1000,600" href="#"
+                       th:text="${item.appId}" th:attr="data-url=@{'/app/config/app/detail/'+${item.appId}}"></a>
+                </td>
+                <td th:text="${item.branch}">分支</td>
+                <td th:text="${item.commitId}">版本</td>
+                <td th:text="${item.machineIpv4}">节点地址</td>
+                <td th:text="${item.startTime}">启动时间</td>
+                <td th:text="${item.pid}">PID</td>
+                <td th:text="${item.isRunning}">运行状态</td>
+                <td th:text="${item.lastCheck}">上次检查时间</td>
+                <td>
+                    <a class="ajax-post" th:href="@{'/api/app/bd/update?appId='+${item.appId}}">重启</a>
+                    <a class="ajax-post" th:href="@{'/api/app/bd/build?appId='+${item.appId}}">停止</a>
+                    <a class="ajax-post" th:href="@{'/api/app/bd/build?appId='+${item.appId}}">启动</a>
+                    <!--<a class="open-popup" data-title="应用部署" th:attr="data-url=@{'/app/deploy/' + ${item.appId}}"
+                       data-size="1000,600" href="#">部署</a>-->
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
 </div>
 <script th:replace="/common/template :: script"></script>
 </body>

+ 76 - 0
dmaster/src/main/resources/templates/machine/host.html

@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header timo-card-header">
+        <span><i class="fa fa-bars"></i> 主机列表</span>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-row timo-card-screen put-row">
+            <div class="pull-left layui-form-pane timo-search-box">
+                <div class="layui-inline">
+                    <label class="layui-form-label">环境</label>
+                    <div class="layui-input-block timo-search-status">
+                        <select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS"
+                                mo-selected="${param.env}"></select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">机器地址</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="machineIpv4" th:value="${param.machineIpv4}" placeholder="机器地址"
+                               autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn timo-search-btn">
+                        <i class="fa fa-search"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="timo-table-wrap">
+            <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="bootTime">启动时间</th>
+                    <th class="sortable" data-field="osArch">系统架构</th>
+                    <th class="sortable" data-field="osName">系统名</th>
+                    <th class="sortable" data-field="osVersion">内核版本</th>
+                    <th class="sortable" data-field="cpus">CPU 数量</th>
+                    <th class="sortable" data-field="totalMem">内存容量</th>
+                    <th class="sortable" data-field="lastCheckedTime">最近检查时间</th>
+                </tr>
+                </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.bootTime}">启动时间</td>
+                    <td th:text="${item.osArch}">系统架构</td>
+                    <td th:text="${item.osName}">系统名</td>
+                    <td th:text="${item.osVersion}">内核版本</td>
+                    <td th:text="${item.cpus}">CPU 数量</td>
+                    <td th:text="${item.totalMem}">内存容量</td>
+                    <td th:text="${item.lastCheckedTime}">最近检查时间</td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div th:replace="/common/fragment :: page"></div>
+    </div>
+</div>
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript">
+</script>
+</body>
+</html>

+ 0 - 81
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/RefreshServiceTest.java

@@ -1,81 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service;
-
-import cn.reghao.autodop.dmaster.DmasterApplication;
-import cn.reghao.autodop.dmaster.app.constant.AppType;
-import cn.reghao.autodop.dmaster.app.constant.EnvType;
-import cn.reghao.autodop.dmaster.app.db.config.AppOrchestrationCrudService;
-import cn.reghao.autodop.dmaster.app.repository.AppBuildingRepository;
-import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
-import cn.reghao.autodop.dmaster.app.entity.AppBuilding;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.jupiter.api.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.concurrent.CompletableFuture;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-@Slf4j
-@ActiveProfiles("dev")
-@SpringBootTest(classes = DmasterApplication.class)
-@RunWith(SpringRunner.class)
-class RefreshServiceTest {
-    @Autowired
-    private RefreshService refreshService;
-    @Autowired
-    private AppOrchestrationCrudService appOrchestrationCrudService;
-    @Autowired
-    private AppOrchestrationRepository appRepository;
-    @Autowired
-    private AppBuildingRepository appBuildingRepository;
-
-    @Test
-    void buildList() {
-        String env = EnvType.test.name();
-        String appType = AppType.dotnetCore.name();
-
-        List<AppBuilding> apps = appRepository.findByEnableTrueAndEnv(env).stream()
-                .map(app -> new AppBuilding(app.getAppId(), app.getEnv(), app.getAppType(), app.getBranch()))
-                .collect(Collectors.toList());
-
-        List<AppBuilding> apps1 = appRepository.findByEnableTrueAndEnvAndAppType(env, appType).stream()
-                .map(app -> new AppBuilding(app.getAppId(), app.getEnv(), app.getAppType(), app.getBranch()))
-                .collect(Collectors.toList());
-        appBuildingRepository.saveAll(apps);
-        log.info("");
-    }
-
-    @Test
-    void refreshBuildList() {
-        /*WebRequest webRequest = new DefaultWebRequest();
-        refreshService.refreshBuildList("test");
-        List<AppOrchestration> list = appOrchestrationCrudService.find(EnvType.prod.name());
-        List<HealthCheck> healthChecks = new ArrayList<>();
-        list.forEach(appConfig -> {
-            RunningConfig runningConfig = appConfig.getRunningConfig();
-            healthChecks.add(new HealthCheck(appConfig.getAppId(), appConfig.getEnv(), runningConfig.getHealthCheck()));
-        });
-
-        healthChecks.forEach(healthCheck -> {
-            WebResponse webResponse = webRequest.get(healthCheck.getUrl());
-            if (webResponse == null || webResponse.getStatusCode() != 200) {
-                log.error("{} 服务不可用,发出通知且尝试重新启动...", healthCheck.getApp());
-            }
-        });*/
-    }
-
-    @AllArgsConstructor
-    @Data
-    class HealthCheck {
-        private String app;
-        private String env;
-        private String url;
-    }
-}