Bladeren bron

MachineController 添加对阿里云 OSS bucket 的管理接口, OSS bucket 机器的 machineId 以 oss. 为前缀, 再添加 bucketName 作为完整的 machineId

reghao 3 maanden geleden
bovenliggende
commit
d8447be96b

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

@@ -42,6 +42,7 @@ public class OssDeployTask implements Runnable {
         File destDir = new File(destDirPath);
         if (destDir.exists()) {
             log.error("start oss deploy task with appId {}", appId);
+            // oss 机器 ID 格式: oss.bucketName
             String bucketName = machineId.split("\\.")[1];
             // 匹配 bucket 下的所有文件
             String prefix = "";

+ 17 - 3
web/src/main/java/cn/reghao/bnt/web/devops/machine/controller/MachineController.java

@@ -69,14 +69,14 @@ public class MachineController {
     @Operation(summary = "设置机器为弃用状态", description = "N")
     @PostMapping(value = "/deprecate", produces = MediaType.APPLICATION_JSON_VALUE)
     public String setMachineDeprecate(String machineId) {
-        machineService.setMachineDeprecate(machineId);
-        return WebResult.success();
+        Result result = machineService.setMachineDeprecate(machineId);
+        return WebResult.result(result);
     }
 
     @Operation(summary = "删除机器", description = "N")
     @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deleteMachine(String machineId) {
-        if (machineQuery.isAgentOnline(machineId)) {
+        if (machineQuery.isAgentOnline(machineId) && !machineId.startsWith("oss.")) {
             return WebResult.failWithMsg("机器处于在线状态, 不能删除");
         }
 
@@ -115,4 +115,18 @@ public class MachineController {
         List<SelectOption> machineList = wsSender.getOnlineMachines(env);
         return WebResult.success(machineList);
     }
+
+    @Operation(summary = "阿里云 OSS 节点列表", description = "N")
+    @GetMapping(value = "/oss/list", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getAliyunOss() {
+        List<MachineDetail> page = machineQuery.getAliyunOss();
+        return WebResult.success(page);
+    }
+
+    @Operation(summary = "添加阿里云 OSS 节点", description = "N")
+    @PostMapping(value = "/oss/add", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String addAliyunOss(String machineId, String env) {
+        machineService.addAliyunOss(machineId, env);
+        return WebResult.success();
+    }
 }

+ 2 - 0
web/src/main/java/cn/reghao/bnt/web/devops/machine/model/vo/MachineDetail.java

@@ -18,6 +18,7 @@ public class MachineDetail {
     private String agentVersion;
     private String status;
     private int used;
+    private String env;
 
     public MachineDetail(MachineHost machineHost, String bootTime, String status, int used) {
         this.machineId = machineHost.getMachineId();
@@ -29,5 +30,6 @@ public class MachineDetail {
         this.agentVersion = machineHost.getMachineInfo().getAgentVersion();
         this.status = status;
         this.used = used;
+        this.env = machineHost.getEnv();
     }
 }

+ 1 - 0
web/src/main/java/cn/reghao/bnt/web/devops/machine/service/MachineQuery.java

@@ -16,6 +16,7 @@ import java.util.List;
  */
 public interface MachineQuery {
     Page<MachineDetail> getMachineHostByPage(String env, Pageable pageable);
+    List<MachineDetail> getAliyunOss();
     /**
      * 获取节点上部署的应用列表
      *

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

@@ -10,6 +10,7 @@ import cn.reghao.jutil.jdk.web.result.Result;
  * @date 2019-11-15 08:48:04
  */
 public interface MachineService {
+    void addAliyunOss(String machineId, String env);
     void addOrUpdateMachine(EvtAgentStart evtAgentStart);
     void updateMachine(EvtAgentHeartbeat evtAgentHeartbeat);
     void setMachineEnv(String machineId, String env);
@@ -20,7 +21,7 @@ public interface MachineService {
      * @return
      * @date 2025-09-19 15:17:30
      */
-    void setMachineDeprecate(String machineId);
+    Result setMachineDeprecate(String machineId);
     /**
      * 根据 websocket 的连接状态设置 devops-agent 的状态
      *

+ 31 - 7
web/src/main/java/cn/reghao/bnt/web/devops/machine/service/impl/MachineQueryImpl.java

@@ -42,7 +42,16 @@ public class MachineQueryImpl implements MachineQuery {
 
     @Override
     public Page<MachineDetail> getMachineHostByPage(String env, Pageable pageable) {
-        Page<MachineHost> page = machineHostRepository.findByEnv(env, pageable);
+        String ossPrefix = "oss";
+        Specification<MachineHost> specification = (root, query, cb) -> {
+            String likeQuery = String.format("%s%%", ossPrefix);
+            Predicate predicate = cb.notLike(root.get("machineId"), likeQuery);
+            Predicate predicate1 = cb.equal(root.get("env"), env);
+            return cb.and(predicate, predicate1);
+        };
+
+        Page<MachineHost> page = machineHostRepository.findAll(specification, pageable);
+        //Page<MachineHost> page = machineHostRepository.findByEnv(env, pageable);
         return page.map(machineHost -> {
             int used = deployConfigRepository.countByMachineHost(machineHost);
             MachineInfo machineInfo = machineHost.getMachineInfo();
@@ -53,6 +62,27 @@ public class MachineQueryImpl implements MachineQuery {
         });
     }
 
+    @Override
+    public List<MachineDetail> getAliyunOss() {
+        String ossPrefix = "oss.";
+        Specification<MachineHost> specification = (root, query, cb) -> {
+            String likeQuery = String.format("%s%%", ossPrefix);
+            Predicate predicate = cb.like(root.get("machineId"), likeQuery);
+            return cb.and(predicate);
+        };
+
+        PageRequest pageRequest = PageRequest.of(0, 100);
+        Page<MachineHost> page = machineHostRepository.findAll(specification, pageRequest);
+        return page.map(machineHost -> {
+            int used = deployConfigRepository.countByMachineHost(machineHost);
+            MachineInfo machineInfo = machineHost.getMachineInfo();
+            long bootTime = machineInfo.getBootTime();
+            String bootTimeStr = DateTimeConverter.format(bootTime*1000);
+            String status = getMachineStat(machineInfo);
+            return new MachineDetail(machineHost, bootTimeStr, status, used);
+        }).getContent();
+    }
+
     @Override
     public List<SelectOption> getMachineApps(String machineId) {
         MachineHost machineHost = machineHostRepository.findByMachineId(machineId);
@@ -125,12 +155,6 @@ public class MachineQueryImpl implements MachineQuery {
         return machineInfoRepository.findAll(specification);
     }
 
-    //@Override
-    public List<MachineInfo> getMachineInfos(int stat) {
-        List<MachineInfo> list = machineInfoRepository.findByStat(NodeStatus.Online.getCode());
-        return list;
-    }
-
     @Override
     public List<SelectOption> getOnlineMachines(String env) {
         PageRequest pageRequest = PageRequest.of(0, 100);

+ 38 - 2
web/src/main/java/cn/reghao/bnt/web/devops/machine/service/impl/MachineServiceImpl.java

@@ -1,8 +1,10 @@
 package cn.reghao.bnt.web.devops.machine.service.impl;
 
+import cn.reghao.bnt.common.machine.Machine;
 import cn.reghao.bnt.common.msg.constant.NodeStatus;
 import cn.reghao.bnt.common.msg.event.EvtAgentHeartbeat;
 import cn.reghao.bnt.common.msg.event.EvtAgentStart;
+import cn.reghao.bnt.web.devops.builder.model.constant.EnvType;
 import cn.reghao.bnt.web.devops.util.DefaultSetting;
 import cn.reghao.bnt.web.devops.machine.db.repository.MachineHostRepository;
 import cn.reghao.bnt.web.devops.machine.db.repository.MachineInfoRepository;
@@ -10,6 +12,8 @@ import cn.reghao.bnt.web.devops.machine.model.po.MachineHost;
 import cn.reghao.bnt.web.devops.machine.model.po.MachineInfo;
 import cn.reghao.bnt.web.devops.machine.service.MachineQuery;
 import cn.reghao.bnt.web.devops.machine.service.MachineService;
+import cn.reghao.bnt.web.util.SelectOption;
+import cn.reghao.jutil.jdk.machine.data.detail.NetworkDetail;
 import cn.reghao.jutil.jdk.web.result.Result;
 import cn.reghao.jutil.jdk.web.result.ResultStatus;
 import lombok.extern.slf4j.Slf4j;
@@ -31,6 +35,7 @@ public class MachineServiceImpl implements MachineService {
     private final MachineHostRepository machineHostRepository;
     private final MachineInfoRepository machineInfoRepository;
     private final MachineQuery machineQuery;
+    private final Machine machine = new Machine();
 
     public MachineServiceImpl(DefaultSetting defaultSetting, MachineHostRepository machineHostRepository,
                               MachineInfoRepository machineInfoRepository, MachineQuery machineQuery) {
@@ -40,6 +45,26 @@ public class MachineServiceImpl implements MachineService {
         this.machineQuery = machineQuery;
     }
 
+    @Override
+    public void addAliyunOss(String machineId, String env) {
+        String ipv4 = "";
+        EnvType envType = EnvType.valueOf(env);
+        EvtAgentStart evtAgentStart = machine.detail();
+        NetworkDetail networkDetail = evtAgentStart.getNetworkDetails().get(0);
+        networkDetail.setPubicIpv4(ipv4);
+        networkDetail.setIpv4(ipv4);
+
+        // oss 机器 ID 格式: oss.bucketName
+        String machineIdKey = String.format("oss.%s", machineId);
+        List<MachineInfo> machineInfoList = machineQuery.getMachineInfos(List.of(machineIdKey));
+        if (machineInfoList.isEmpty()) {
+            MachineInfo machineInfo = new MachineInfo(evtAgentStart);
+            machineInfo.setMachineId(machineIdKey);
+            machineInfo = machineInfoRepository.save(machineInfo);
+            machineHostRepository.save(new MachineHost(machineInfo, envType.name()));
+        }
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void addOrUpdateMachine(EvtAgentStart evtAgentStart) {
@@ -70,11 +95,17 @@ public class MachineServiceImpl implements MachineService {
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void setMachineDeprecate(String machineId) {
+    public Result setMachineDeprecate(String machineId) {
+        List<SelectOption> selectOptionList = machineQuery.getMachineApps(machineId);
+        if (!selectOptionList.isEmpty()) {
+            return Result.fail("尚有 app 在使用本 machine, 无法废弃");
+        }
+
         List<MachineInfo> list = machineQuery.getMachineInfos(List.of(machineId));
         if (!list.isEmpty() && Objects.equals(list.get(0).getStat(), NodeStatus.Offline.getCode())) {
             machineInfoRepository.updateMachineStat(machineId, NodeStatus.Deprecated.getCode());
         }
+        return Result.success();
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -104,10 +135,15 @@ public class MachineServiceImpl implements MachineService {
         }
 
         MachineInfo machineInfo = machineHost.getMachineInfo();
-        if (!machineInfo.getStat().equals(NodeStatus.Deprecated.getCode())) {
+        if (!machineInfo.getStat().equals(NodeStatus.Deprecated.getCode()) && !machineId.startsWith("oss.")) {
             return Result.result(ResultStatus.FAIL, "只能删除 Deprecated 状态的节点");
         }
 
+        List<SelectOption> selectOptionList = machineQuery.getMachineApps(machineId);
+        if (!selectOptionList.isEmpty()) {
+            return Result.fail("尚有 app 在使用本 machine, 无法删除");
+        }
+
         machineHostRepository.deleteByMachineId(machineId);
         machineInfoRepository.deleteByMachineId(machineId);
         return Result.result(ResultStatus.SUCCESS);