Ver código fonte

开发完成, 通过 websocket 来管理 agent 节点上的 docker 容器和镜像

reghao 3 meses atrás
pai
commit
fbbb92eb98

+ 10 - 26
agent/src/main/java/cn/reghao/bnt/agent/ws/event/handler/EvtDockerHandler.java

@@ -2,9 +2,7 @@ package cn.reghao.bnt.agent.ws.event.handler;
 
 import cn.reghao.bnt.common.docker.Docker;
 import cn.reghao.bnt.common.docker.DockerService;
-import cn.reghao.bnt.common.docker.model.ContainerOps;
-import cn.reghao.bnt.common.docker.model.ImageDelete;
-import cn.reghao.bnt.common.docker.model.ImageQuery;
+import cn.reghao.bnt.common.docker.model.DockerQuery;
 import cn.reghao.bnt.common.machine.Machine;
 import cn.reghao.bnt.common.msg.MessageSender;
 import cn.reghao.bnt.common.msg.constant.DockerOps;
@@ -13,16 +11,19 @@ import cn.reghao.bnt.common.msg.event.EvtDockerOpsResult;
 import cn.reghao.jutil.jdk.event.handler.Handler;
 import cn.reghao.jutil.jdk.event.message.Event;
 import cn.reghao.jutil.jdk.event.message.EventMessage;
+import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
+
+import static cn.reghao.bnt.common.msg.constant.DockerOps.containerRm;
 
 /**
  * @author reghao
  * @date 2025-12-16 20:03:03
  */
+@Slf4j
 public class EvtDockerHandler extends Handler {
     private final MessageSender messageSender;
     private final DockerService dockerService;
@@ -37,44 +38,27 @@ public class EvtDockerHandler extends Handler {
         EvtDockerOps evtDockerOps = (EvtDockerOps) evt;
 
         String ops = evtDockerOps.getOps();
+        DockerQuery dockerQuery = evtDockerOps.getDockerQuery();
         List<String> payload = evtDockerOps.getPayload();
         EvtDockerOpsResult evtDockerOpsResult = new EvtDockerOpsResult(ops, Machine.ID);
         List<Object> list = new ArrayList<>();
         try {
             switch (DockerOps.valueOf(ops)) {
                 case imageList -> {
-                    ImageQuery imageQuery = new ImageQuery();
-                    list.addAll(dockerService.getDockerImages(imageQuery));
+                    list.addAll(dockerService.getDockerImages(dockerQuery));
                 }
                 case imageRm -> {
-                    List<String> imageIds =  payload.stream().map(obj -> (String) obj).collect(Collectors.toList());
-                    ImageDelete imageDelete = new ImageDelete();
-                    imageDelete.setImageIds(imageIds);
-                    dockerService.rmDockerImages(imageDelete);
+                    dockerService.rmDockerImages(evtDockerOps);
                 }
                 case containerList -> list.addAll(dockerService.getDockerContainers());
                 case containerRm -> {
                     payload.forEach(obj -> {
                         String containerId = (String) obj;
-                        ContainerOps containerOps = new ContainerOps(3, containerId);
-                        dockerService.handleDockerContainer(containerOps);
-                    });
-                }
-                case containerStart -> {
-                    payload.forEach(obj -> {
-                        String containerId = (String) obj;
-                        ContainerOps containerOps = new ContainerOps(1, containerId);
-                        dockerService.handleDockerContainer(containerOps);
-                    });
-                }
-                case containerStop -> {
-                    payload.forEach(obj -> {
-                        String containerId = (String) obj;
-                        ContainerOps containerOps = new ContainerOps(2, containerId);
-                        dockerService.handleDockerContainer(containerOps);
+                        dockerService.handleDockerContainer(containerRm.name(), containerId);
                     });
                 }
                 default -> {
+                    log.error("Unsupported Docker operation: {}", ops);
                 }
             }
         } catch (Exception e) {

+ 15 - 21
common/src/main/java/cn/reghao/bnt/common/docker/DockerService.java

@@ -1,11 +1,9 @@
 package cn.reghao.bnt.common.docker;
 
-import cn.reghao.bnt.common.docker.Docker;
 import cn.reghao.bnt.common.docker.model.DockerContainer;
 import cn.reghao.bnt.common.docker.model.DockerImage;
-import cn.reghao.bnt.common.docker.model.ContainerOps;
-import cn.reghao.bnt.common.docker.model.ImageDelete;
-import cn.reghao.bnt.common.docker.model.ImageQuery;
+import cn.reghao.bnt.common.docker.model.DockerQuery;
+import cn.reghao.bnt.common.msg.event.EvtDockerOps;
 import com.github.dockerjava.api.command.InspectContainerResponse;
 import com.github.dockerjava.api.model.Image;
 import lombok.extern.slf4j.Slf4j;
@@ -15,6 +13,8 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+import static cn.reghao.bnt.common.msg.constant.DockerOps.containerRm;
+
 /**
  * @author reghao
  * @date 2025-12-09 11:01:17
@@ -27,9 +27,9 @@ public class DockerService {
         this.docker = docker;
     }
 
-    public List<DockerImage> getDockerImages(ImageQuery imageQuery) {
-        String keyword = imageQuery.getKeyword();
-        int type = imageQuery.getType();
+    public List<DockerImage> getDockerImages(DockerQuery dockerQuery) {
+        String keyword = dockerQuery.getKeyword();
+        int type = dockerQuery.getType();
         // imageId -> container
         Map<String, List<InspectContainerResponse>> containerMap = docker.psAll().stream()
                 .collect(Collectors.groupingBy(InspectContainerResponse::getImageId));
@@ -63,8 +63,8 @@ public class DockerService {
                 .collect(Collectors.toList());
     }
 
-    public void rmDockerImages(ImageDelete imageDelete) {
-        List<String> imageIds = imageDelete.getImageIds();
+    public void rmDockerImages(EvtDockerOps evtDockerOps) {
+        List<String> imageIds = evtDockerOps.getPayload();
         imageIds.forEach(docker::imageRm);
     }
 
@@ -79,9 +79,11 @@ public class DockerService {
         }).collect(Collectors.toList());
     }
 
-    public void handleDockerContainer(ContainerOps containerOps) {
-        int type = containerOps.getOpsType();
-        String containerId = containerOps.getContainerId();
+    public void handleDockerContainer(String ops, String containerId) {
+        if (!containerRm.name().equals(ops)) {
+            return;
+        }
+
         // containerId -> InspectContainerResponse
         Map<String, InspectContainerResponse> containerMap = docker.psAll().stream()
                 .collect(Collectors.groupingBy(
@@ -94,14 +96,6 @@ public class DockerService {
             log.error("containerId {} not exist", containerId);
             return;
         }
-
-        String containerName = response.getName().replace("/", "");
-        if (type == 1) {
-            docker.start(containerName);
-        } else if (type == 2) {
-            docker.stop(containerName);
-        } else if (type == 3) {
-            docker.rm(containerId);
-        }
+        docker.rm(containerId);
     }
 }

+ 0 - 28
common/src/main/java/cn/reghao/bnt/common/docker/model/ContainerOps.java

@@ -1,28 +0,0 @@
-package cn.reghao.bnt.common.docker.model;
-
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2025-12-16 16:03:13
- */
-@AllArgsConstructor
-@NoArgsConstructor
-@Setter
-@Getter
-public class ContainerOps implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @NotNull(message = "操作类型不能为空")
-    private Integer opsType;
-    @NotBlank(message = "容器ID不能为空")
-    @NotNull(message = "容器ID不能为空")
-    private String containerId;
-}

+ 1 - 1
common/src/main/java/cn/reghao/bnt/common/docker/model/DockerPayload.java

@@ -18,6 +18,6 @@ public class DockerPayload implements Serializable {
 
     private String ops;
     private String machineId;
-    private ImageQuery queryInfo;
+    private DockerQuery dockerQuery;
     private List<String> payload = new ArrayList<>();
 }

+ 2 - 2
common/src/main/java/cn/reghao/bnt/common/docker/model/ImageQuery.java → common/src/main/java/cn/reghao/bnt/common/docker/model/DockerQuery.java

@@ -11,13 +11,13 @@ import java.io.Serializable;
  */
 @Setter
 @Getter
-public class ImageQuery implements Serializable {
+public class DockerQuery implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private int type;
     private String keyword;
 
-    public ImageQuery() {
+    public DockerQuery() {
         this.type = 1;
         this.keyword = "";
     }

+ 0 - 22
common/src/main/java/cn/reghao/bnt/common/docker/model/ImageDelete.java

@@ -1,22 +0,0 @@
-package cn.reghao.bnt.common.docker.model;
-
-import jakarta.validation.constraints.Size;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-12-16 15:20:24
- */
-@Setter
-@Getter
-public class ImageDelete implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String machineId;
-    @Size(min = 1, max = 10, message = "删除镜像数量范围在 1~10 之间")
-    private List<String> imageIds;
-}

+ 3 - 1
common/src/main/java/cn/reghao/bnt/common/msg/constant/DockerOps.java

@@ -5,5 +5,7 @@ package cn.reghao.bnt.common.msg.constant;
  * @date 2025-12-16 20:18:53
  */
 public enum DockerOps {
-    imageList, imageRm, containerList, containerRm, containerStart, containerStop
+    imageList, imageRm, containerList, containerRm
+
+
 }

+ 8 - 3
common/src/main/java/cn/reghao/bnt/common/msg/event/EvtDockerOps.java

@@ -1,5 +1,7 @@
 package cn.reghao.bnt.common.msg.event;
 
+import cn.reghao.bnt.common.docker.model.DockerPayload;
+import cn.reghao.bnt.common.docker.model.DockerQuery;
 import cn.reghao.jutil.jdk.event.message.Event;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -17,10 +19,13 @@ import java.util.List;
 public class EvtDockerOps extends Event {
     private String ops;
     private String machineId;
+    private DockerQuery dockerQuery;
     private List<String> payload;
 
-    public EvtDockerOps(String ops, String machineId) {
-        this.ops = ops;
-        this.machineId = machineId;
+    public EvtDockerOps(DockerPayload dockerPayload) {
+        this.ops = dockerPayload.getOps();
+        this.machineId = dockerPayload.getMachineId();
+        this.dockerQuery = dockerPayload.getDockerQuery();
+        this.payload = dockerPayload.getPayload();
     }
 }

+ 0 - 60
web/src/main/java/cn/reghao/bnt/web/devops/machine/controller/DockerController.java

@@ -1,60 +0,0 @@
-package cn.reghao.bnt.web.devops.machine.controller;
-
-import cn.reghao.bnt.common.docker.DockerImpl;
-import cn.reghao.bnt.common.docker.model.DockerContainer;
-import cn.reghao.bnt.common.docker.model.DockerImage;
-import cn.reghao.bnt.common.docker.DockerService;
-import cn.reghao.bnt.common.docker.model.ContainerOps;
-import cn.reghao.bnt.common.docker.model.ImageDelete;
-import cn.reghao.bnt.common.docker.model.ImageQuery;
-import cn.reghao.jutil.web.WebResult;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.MediaType;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-12-09 10:46:48
- */
-@Tag(name = "Docker 仓库接口")
-@RestController
-@RequestMapping("/api/devops/machine/docker")
-public class DockerController {
-    private final DockerService dockerService;
-
-    public DockerController() {
-        this.dockerService = new DockerService(new DockerImpl());
-    }
-
-    @Operation(summary = "获取 docker 镜像列表", description = "N")
-    @GetMapping(value = "/image/list", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getDockerImage(ImageQuery imageQuery) {
-        List<DockerImage> list = dockerService.getDockerImages(imageQuery);
-        return WebResult.success(list);
-    }
-
-    @Operation(summary = "删除 docker 镜像", description = "N")
-    @PostMapping(value = "/image/delete", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String deleteDockerImage(@Validated ImageDelete imageDelete) {
-        dockerService.rmDockerImages(imageDelete);
-        return WebResult.success();
-    }
-
-    @Operation(summary = "获取 docker 容器列表", description = "N")
-    @GetMapping(value = "/container/list", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getDockerContainer() {
-        List<DockerContainer> list = dockerService.getDockerContainers();
-        return WebResult.success(list);
-    }
-
-    @Operation(summary = "删除 docker 容器", description = "N")
-    @PostMapping(value = "/container/ops", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String opsDockerConatiner(ContainerOps containerOps) {
-        dockerService.handleDockerContainer(containerOps);
-        return WebResult.success();
-    }
-}

+ 4 - 5
web/src/main/java/cn/reghao/bnt/web/ws/event/DockerOpsService.java

@@ -1,8 +1,7 @@
 package cn.reghao.bnt.web.ws.event;
 
-import cn.reghao.bnt.common.msg.constant.DockerOps;
+import cn.reghao.bnt.common.docker.model.DockerPayload;
 import cn.reghao.bnt.common.msg.event.EvtDockerOps;
-import cn.reghao.bnt.web.devops.machine.service.MachineQuery;
 import cn.reghao.bnt.web.ws.WsSender;
 import cn.reghao.jutil.jdk.event.message.EventMessage;
 import lombok.extern.slf4j.Slf4j;
@@ -23,9 +22,9 @@ public class DockerOpsService {
         this.wsSender = wsSender;
     }
 
-    public void sendDockerOps(String ops, String machineId) {
-        String ops1 = DockerOps.containerList.name();
-        EvtDockerOps evtDockerOps = new EvtDockerOps(ops, machineId);
+    public void sendDockerOps(DockerPayload dockerPayload) {
+        String machineId = dockerPayload.getMachineId();
+        EvtDockerOps evtDockerOps = new EvtDockerOps(dockerPayload);
         EventMessage evtMsg = EventMessage.evt(evtDockerOps);
         publish(machineId, evtMsg);
     }

+ 1 - 6
web/src/main/java/cn/reghao/bnt/web/ws/handler/FrontendHandler.java

@@ -2,7 +2,6 @@ package cn.reghao.bnt.web.ws.handler;
 
 import cn.reghao.bnt.common.docker.model.DockerPayload;
 import cn.reghao.bnt.web.ws.SessionManagerFront;
-import cn.reghao.bnt.web.ws.WsSender;
 import cn.reghao.bnt.web.ws.event.DockerOpsService;
 import cn.reghao.jutil.jdk.serializer.JdkSerializer;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
@@ -12,7 +11,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.socket.*;
 
 import java.io.IOException;
-import java.util.*;
 
 /**
  * @author reghao
@@ -50,10 +48,7 @@ public class FrontendHandler implements WebSocketHandler {
                 log.info("接收到 WebSocket 文本消息");
                 String jsonPayload = (String) webSocketMessage.getPayload();
                 DockerPayload dockerPayload = JsonConverter.jsonToObject(jsonPayload, DockerPayload.class);
-                JsonObject jsonObject = JsonConverter.jsonToJsonElement(jsonPayload).getAsJsonObject();
-                String ops = jsonObject.get("ops").getAsString();
-                String machineId = jsonObject.get("machineId").getAsString();
-                dockerOpsService.sendDockerOps(ops, machineId);
+                dockerOpsService.sendDockerOps(dockerPayload);
             } else if (webSocketMessage instanceof BinaryMessage) {
                 log.info("接收到 WebSocket 二进制消息");
             } else if (webSocketMessage instanceof PingMessage) {