Parcourir la source

添加删除机器节点实现

reghao il y a 1 an
Parent
commit
71fd81c008

+ 14 - 1
common/src/main/java/cn/reghao/bnt/common/msg/constant/NodeStatus.java

@@ -5,5 +5,18 @@ package cn.reghao.bnt.common.msg.constant;
  * @date 2021-08-27 17:33:20
  */
 public enum NodeStatus {
-    Online, Offline, Timeout
+    Online(1),
+    Offline(2),
+    Timeout(3),
+    Deprecated(4);
+
+    private final Integer code;
+
+    NodeStatus(Integer code) {
+        this.code = code;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
 }

+ 7 - 33
web/src/main/java/cn/reghao/bnt/web/config/spring/AppLifecycle.java

@@ -1,15 +1,13 @@
 package cn.reghao.bnt.web.config.spring;
 
 import cn.reghao.bnt.web.account.service.AccountService;
-import cn.reghao.bnt.web.sys.service.FileService;
+import cn.reghao.bnt.web.devops.machine.service.MachineService;
 import cn.reghao.bnt.web.account.service.RoleService;
-import cn.reghao.bnt.web.config.AppProperties;
 import cn.reghao.bnt.web.devops.app.db.repository.config.build.CompilerConfigRepository;
 import cn.reghao.bnt.web.devops.app.model.po.config.build.CompilerConfig;
 import cn.reghao.bnt.web.devops.app.service.bd.BuildStat;
 import cn.reghao.bnt.web.ws.handler.LogHandler;
 import cn.reghao.bnt.web.devops.build.model.constant.CompileType;
-import cn.reghao.bnt.web.devops.app.service.config.BuildDirService;
 import cn.reghao.bnt.web.devops.log.Appenders;
 import cn.reghao.bnt.web.devops.log.LoggerConfig;
 import cn.reghao.bnt.web.sys.db.repository.SysMessageRepository;
@@ -31,29 +29,24 @@ import java.util.List;
 @Slf4j
 @Component
 public class AppLifecycle implements ApplicationRunner, DisposableBean {
-    private final BuildDirService buildDirService;
     private final LogHandler logHandler;
     private final CompilerConfigRepository compilerConfigRepository;
-    private final FileService fileService;
     private final RoleService roleService;
     private final AccountService accountService;
     private final SysMessageRepository sysMessageRepository;
-    private BuildStat buildStat;
-    private AppProperties appProperties;
+    private final BuildStat buildStat;
+    private final MachineService machineService;
 
-    public AppLifecycle(BuildDirService buildDirService, LogHandler logHandler,
-                        CompilerConfigRepository compilerConfigRepository, FileService fileService,
+    public AppLifecycle(LogHandler logHandler, CompilerConfigRepository compilerConfigRepository,
                         RoleService roleService, AccountService accountService, SysMessageRepository sysMessageRepository,
-                        BuildStat buildStat, AppProperties appProperties) {
-        this.buildDirService = buildDirService;
+                        BuildStat buildStat, MachineService machineService) {
         this.logHandler = logHandler;
         this.compilerConfigRepository = compilerConfigRepository;
-        this.fileService = fileService;
         this.roleService = roleService;
         this.accountService = accountService;
         this.sysMessageRepository = sysMessageRepository;
         this.buildStat = buildStat;
-        this.appProperties = appProperties;
+        this.machineService = machineService;
     }
 
     @Override
@@ -65,15 +58,14 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
 
     @Override
     public void destroy() {
+        machineService.shutdown();
         log.info("bnt-web shutdown...");
     }
 
     private void initSys() throws IOException {
-        fileService.initLocalStore();
         roleService.initRole();
         accountService.initAccount();
         initLogConfig();
-        initBuildDir();
         checkCompilerConfig();
     }
 
@@ -96,24 +88,6 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
         }*/
     }
 
-    @Deprecated
-    private void initBuildDir() {
-        String userDir = System.getProperty("user.dir");
-        String baseDir = appProperties.getBaseDir();
-        File dir = new File(baseDir);
-        if (!dir.exists() && !dir.mkdirs()) {
-            log.error("创建本地构建目录 {} 失败,bnt-web 结束运行", baseDir);
-            System.exit(1);
-        } else {
-            try {
-                buildDirService.init(baseDir);
-            } catch (Exception e) {
-                log.error("初始化本地构建目录失败: {},bnt-web 结束运行", e.getMessage());
-                System.exit(1);
-            }
-        }
-    }
-
     private void checkCompilerConfig() {
         List<CompilerConfig> list = compilerConfigRepository.findAll();
         for (CompilerConfig compilerConfig : list) {

+ 1 - 0
web/src/main/java/cn/reghao/bnt/web/devops/app/service/bd/DeployStat.java

@@ -31,4 +31,5 @@ public interface DeployStat {
     boolean isDeploying(String appId, String machineId);
     boolean isRunning(String appId);
     boolean isRunning(String appId, String machineId);
+    void delete(String appId, String machineId);
 }

+ 10 - 3
web/src/main/java/cn/reghao/bnt/web/devops/app/service/bd/impl/DeployStatImpl.java

@@ -75,8 +75,8 @@ public class DeployStatImpl implements DeployStat {
             return true;
         }
 
-        boolean running = isRunning(appId, machineId);
-        if (!running) {
+        int pid = appDeploying.getPid();
+        if (pid == -1) {
             deployingRepository.delete(appDeploying);
             return true;
         }
@@ -84,6 +84,13 @@ public class DeployStatImpl implements DeployStat {
         return false;
     }
 
+    public void delete(String appId, String machineId) {
+        AppDeploying appDeploying = deployingRepository.findAllByAppDeployConfig_AppConfig_AppIdAndAppDeployConfig_MachineHost_MachineId(appId, machineId);
+        if (appDeploying != null) {
+            deployingRepository.delete(appDeploying);
+        }
+    }
+
     @Override
     public void afterBuild(AppBuilding appBuilding) {
         String appId = appBuilding.getAppConfig().getAppId();
@@ -222,7 +229,7 @@ public class DeployStatImpl implements DeployStat {
     @Override
     public List<AppRunning> getAppRunning(String appId) {
         return deployingRepository.findAllByAppDeployConfig_AppConfig_AppId(appId).stream()
-                .filter(AppDeploying::isDeployed)
+                //.filter(AppDeploying::isDeployed)
                 //.sorted(Comparator.comparing(AppDeploying::getDeployTime).reversed())
                 .map(AppRunning::new)
                 .collect(Collectors.toList());

+ 2 - 0
web/src/main/java/cn/reghao/bnt/web/devops/app/service/config/AppDeployConfigService.java

@@ -3,6 +3,7 @@ package cn.reghao.bnt.web.devops.app.service.config;
 import cn.reghao.bnt.web.devops.app.model.dto.DeployConfigDto;
 import cn.reghao.bnt.web.devops.app.model.po.config.AppConfig;
 import cn.reghao.bnt.web.devops.app.model.po.config.AppDeployConfig;
+import cn.reghao.bnt.web.devops.machine.model.po.MachineHost;
 import cn.reghao.jutil.jdk.result.Result;
 
 /**
@@ -15,4 +16,5 @@ public interface AppDeployConfigService {
     Result delete(int appDeployConfigId);
     boolean delete(AppDeployConfig appDeployConfig);
     boolean delete(AppConfig appConfig);
+    void delete(MachineHost machineHost);
 }

+ 29 - 1
web/src/main/java/cn/reghao/bnt/web/devops/app/service/config/impl/AppDeployConfigServiceImpl.java

@@ -15,21 +15,23 @@ import cn.reghao.bnt.web.devops.app.service.config.AppDeployConfigService;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.ResultStatus;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import lombok.extern.slf4j.Slf4j;
 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
  */
+@Slf4j
 @Service
 public class AppDeployConfigServiceImpl implements AppDeployConfigService {
     private final AppConfigRepository appConfigRepository;
     private final AppDeployConfigRepository deployConfigRepository;
     private final MachineHostRepository machineHostRepository;
-
     private final AppDeployConfigQuery deployConfigQuery;
     private final DeployStat deployStat;
 
@@ -141,4 +143,30 @@ public class AppDeployConfigServiceImpl implements AppDeployConfigService {
         }
         return false;
     }
+
+    @Override
+    public void delete(MachineHost machineHost) {
+        List<AppDeployConfig> list = deployConfigRepository.findByMachineHost(machineHost);
+        List<String> apps = list.stream()
+                .map(appDeployConfig -> appDeployConfig.getAppConfig().getAppId())
+                .collect(Collectors.toList());
+
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < Math.min(3, list.size()); i++) {
+            sb.append(apps.get(i)).append(",");
+        }
+        String msg = sb.toString();
+        if (!msg.isBlank()) {
+            String errMsg = String.format("还有 %s 等应用部署在当前机器上", msg.substring(0, msg.length()-1));
+            log.error(errMsg);
+        }
+
+        for (AppDeployConfig appDeployConfig : list) {
+            String appId = appDeployConfig.getAppConfig().getAppId();
+            String machineId = appDeployConfig.getMachineHost().getMachineId();
+            deployStat.delete(appId, machineId);
+        }
+
+        deployConfigRepository.deleteByMachineHost(machineHost);
+    }
 }

+ 1 - 1
web/src/main/java/cn/reghao/bnt/web/devops/machine/controller/MachineHostController.java

@@ -58,7 +58,7 @@ public class MachineHostController {
         return WebResult.result(result);
     }
 
-    @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
+    @PostMapping(value = "/deprecate", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deleteAll(@RequestParam(value = "ids") List<String> machineIds) {
         Result result = hostService.batchDelete(machineIds);
         return WebResult.result(result);

+ 11 - 3
web/src/main/java/cn/reghao/bnt/web/devops/machine/db/repository/MachineInfoRepository.java

@@ -5,13 +5,21 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 /**
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface MachineInfoRepository
-        extends JpaRepository<MachineInfo, Integer>, JpaSpecificationExecutor<MachineInfo> {
+public interface MachineInfoRepository extends JpaRepository<MachineInfo, Integer>, JpaSpecificationExecutor<MachineInfo> {
+    @Query("update MachineInfo u set u.stat=:stat where u.machineId=:machineId")
+    @Modifying
+    void updateMachineInfoByMachineId(@Param("machineId") String machineId, @Param("stat") int stat);
+
     MachineInfo findByMachineId(String machineId);
-    Page<MachineInfo> findByDeletedFalse(Pageable pageable);
+    List<MachineInfo> findByStat(int stat);
 }

+ 2 - 1
web/src/main/java/cn/reghao/bnt/web/devops/machine/model/po/MachineInfo.java

@@ -1,5 +1,6 @@
 package cn.reghao.bnt.web.devops.machine.model.po;
 
+import cn.reghao.bnt.common.msg.constant.NodeStatus;
 import cn.reghao.bnt.web.util.db.BaseEntity;
 import cn.reghao.bnt.common.msg.event.EvtAgentStart;
 import cn.reghao.jutil.jdk.machine.data.detail.*;
@@ -64,7 +65,7 @@ public class MachineInfo extends BaseEntity {
         this.byteOrder = osDetail.getByteOrder();
         this.bootTime = osDetail.getBootTime();
         this.agentVersion = machineDetail.getAppVersion().getCommitId();
-        this.stat = 1;
+        this.stat = NodeStatus.Online.getCode();
 
         setNetworkInfos(machineDetail.getNetworkDetails());
         setDiskInfos(machineDetail.getDiskDetails());

+ 19 - 32
web/src/main/java/cn/reghao/bnt/web/devops/machine/service/MachineHostServiceImpl.java

@@ -1,7 +1,6 @@
 package cn.reghao.bnt.web.devops.machine.service;
 
-import cn.reghao.bnt.web.devops.app.db.repository.config.AppDeployConfigRepository;
-import cn.reghao.bnt.web.devops.app.model.po.config.AppDeployConfig;
+import cn.reghao.bnt.web.devops.app.service.config.AppDeployConfigService;
 import cn.reghao.bnt.web.devops.machine.db.repository.MachineHostRepository;
 import cn.reghao.bnt.web.devops.machine.db.repository.MachineInfoRepository;
 import cn.reghao.bnt.web.devops.machine.model.po.MachineHost;
@@ -11,9 +10,9 @@ import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.ResultStatus;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -24,17 +23,16 @@ import java.util.stream.Collectors;
 public class MachineHostServiceImpl implements MachineHostService {
     private final MachineHostRepository machineHostRepository;
     private final MachineInfoRepository machineInfoRepository;
-    private final AppDeployConfigRepository appDeployConfigRepository;
     private final MachineService machineService;
+    private final AppDeployConfigService deployConfigService;
 
     public MachineHostServiceImpl(MachineHostRepository machineHostRepository,
                                   MachineInfoRepository machineInfoRepository,
-                                  AppDeployConfigRepository appDeployConfigRepository,
-                                  MachineService machineService) {
+                                  MachineService machineService, AppDeployConfigService deployConfigService) {
         this.machineHostRepository = machineHostRepository;
         this.machineInfoRepository = machineInfoRepository;
-        this.appDeployConfigRepository = appDeployConfigRepository;
         this.machineService = machineService;
+        this.deployConfigService = deployConfigService;
     }
 
     @Override
@@ -55,52 +53,41 @@ public class MachineHostServiceImpl implements MachineHostService {
         machineHostRepository.save(machineHost);
     }
 
+    @Transactional
     public Result delete(String machineId) {
         if (machineService.isAgentOnline(machineId)) {
             return Result.result(ResultStatus.FAIL, "机器当前在线, 不能删除");
         }
 
         MachineHost machineHost = machineHostRepository.findByMachineId(machineId);
+        // AppDeploying -> AppDeployConfig -> MachineInfo
         if (machineHost != null) {
-            appDeployConfigRepository.deleteByMachineHost(machineHost);
+            deployConfigService.delete(machineHost);
+            deleteMachine(machineHost);
         }
 
-        List<AppDeployConfig> list = appDeployConfigRepository.findByMachineHost(machineHost);
-        if (!list.isEmpty()) {
-            List<String> apps = list.stream()
-                    .map(appDeployConfig -> appDeployConfig.getAppConfig().getAppId())
-                    .collect(Collectors.toList());
-
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < Math.min(3, list.size()); i++) {
-                sb.append(apps.get(i)).append(",");
-            }
-
-            String msg = sb.toString();
-            String errMsg = String.format("还有 %s 等应用部署在当前机器上", msg.substring(0, msg.length()-1));
-            return Result.result(ResultStatus.FAIL, errMsg);
-        }
-
-        if (machineHost != null) {
-            machineHostRepository.delete(machineHost);
-        }
+        return Result.result(ResultStatus.SUCCESS);
+    }
 
+    private void deleteMachine(MachineHost machineHost) {
+        machineHostRepository.delete(machineHost);
+        String machineId = machineHost.getMachineId();
         MachineInfo machineInfo = machineInfoRepository.findByMachineId(machineId);
         if (machineInfo != null) {
             machineInfoRepository.delete(machineInfo);
         }
-
-        return Result.result(ResultStatus.SUCCESS);
     }
 
+    @Transactional
     @Override
     public Result batchDelete(List<String> machineIds) {
         for (String machineId : machineIds) {
-            Result result = delete(machineId);
-            if (result.getCode() != 0) {
-                return result;
+            MachineInfo machineInfo = machineInfoRepository.findByMachineId(machineId);
+            if (machineInfo != null && machineInfo.getStat() != 1) {
+                machineInfoRepository.updateMachineInfoByMachineId(machineId, 4);
             }
         }
+
         return Result.result(ResultStatus.SUCCESS);
     }
 }

+ 12 - 2
web/src/main/java/cn/reghao/bnt/web/devops/machine/service/MachineService.java

@@ -34,6 +34,14 @@ public class MachineService {
         }
     }
 
+    public void shutdown() {
+        List<MachineInfo> list = machineInfoRepository.findByStat(1);
+        list.forEach(machineInfo -> {
+            machineInfo.setStat(2);
+            machineInfoRepository.save(machineInfo);
+        });
+    }
+
     public PageList<MachineHostVO> getByPage(String env, int pageNumber, int pageSize) {
         PageRequest pageRequest = PageRequest.of(pageNumber-1, pageSize);
         Page<MachineInfo> machineInfos = machineInfoRepository.findAll(pageRequest);
@@ -43,10 +51,12 @@ public class MachineService {
             String bootTimeStr = DateTimeConverter.format(bootTime*1000);
             String status = NodeStatus.Online.name();
             int stat = machineInfo.getStat();
-            if (stat == 2) {
+            if (stat == NodeStatus.Offline.getCode()) {
                 status = NodeStatus.Offline.name();
-            } else if (stat == 3) {
+            } else if (stat == NodeStatus.Timeout.getCode()) {
                 status = NodeStatus.Timeout.name();
+            } else if (stat == NodeStatus.Deprecated.getCode()) {
+                status = NodeStatus.Deprecated.name();
             }
 
             return new MachineHostVO(machineHost, bootTimeStr, status);

+ 2 - 2
web/src/main/resources/templates/devops/machine/host/index.html

@@ -36,9 +36,9 @@
                 <div class="pull-right">
                     <div class="btn-group-right">
                         <div class="btn-group">
-                            <button class="layui-btn">批量处理<span class="caret"></span></button>
+                            <button class="layui-btn">设置弃用<span class="caret"></span></button>
                             <dl class="layui-nav-child layui-anim layui-anim-upbit">
-                                <dd><a class="ajax-status" th:href="@{/api/machine/host/delete}">批量删除</a></dd>
+                                <dd><a class="ajax-status" th:href="@{/api/machine/host/deprecate}">选择机器</a></dd>
                             </dl>
                         </div>
                     </div>