From 234a03f2f12f9c64a3804add933d23e54f10f89d Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Sun, 24 Aug 2025 20:28:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96=E7=A3=81?= =?UTF-8?q?=E7=9B=98=E4=B8=BB=E6=9C=BA=E7=9A=84=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../capi/sys/controller/sysController.java | 193 ++++++++++++------ 1 file changed, 136 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/mini/capi/sys/controller/sysController.java b/src/main/java/com/mini/capi/sys/controller/sysController.java index d1dd3ed..e164b58 100644 --- a/src/main/java/com/mini/capi/sys/controller/sysController.java +++ b/src/main/java/com/mini/capi/sys/controller/sysController.java @@ -22,9 +22,7 @@ import org.springframework.web.bind.annotation.RestController; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @RestController @@ -126,6 +124,75 @@ public class sysController { private static final int MAX_SIZE = 100; + private String buildKey(String dockerHostId, String image, String containerName) { + return dockerHostId + "|" + image + "|" + containerName; + } + + private void addOrEdit(String dockerHostId, Map oldMap, SshInfo sshInfo, List remoteList) { + for (docker.DockerInfo d : remoteList) { + String key = buildKey(dockerHostId, d.getImageName(), d.getNames()); + DockerContainerInfo entity = oldMap.get(key); + if (entity == null) { + entity = new DockerContainerInfo(); + entity.setDokerHostId(dockerHostId); + entity.setContainerId(d.getContainerId()); + entity.setImageName(d.getImageName()); + entity.setUnames(d.getNames()); + entity.setUstatus(d.getStatus()); + entity.setHostIp(sshInfo.getHostIp()); + entity.setPorts(d.getPorts()); + entity.setGetTime(vDate.getNow()); + dockerInfoService.save(entity); + } else { + entity.setContainerId(d.getContainerId()); + entity.setImageName(d.getImageName()); + entity.setUnames(d.getNames()); + entity.setUstatus(d.getStatus()); + entity.setHostIp(sshInfo.getHostIp()); + entity.setPorts(d.getPorts()); + entity.setGetTime(vDate.getNow()); + dockerInfoService.updateById(entity); + oldMap.remove(key); + } + } + } + + private void refreshContainerTable(String dockerHostId, + List remoteList, + SshInfo sshInfo) { + + /* 1. 旧数据 */ + List oldList = dockerInfoService.lambdaQuery() + .eq(DockerContainerInfo::getDokerHostId, dockerHostId) + .list(); + Map oldMap = oldList.stream() + .collect(Collectors.toMap( + c -> buildKey(dockerHostId, c.getImageName(), c.getUnames()), + c -> c)); + + /* 2. 遍历远端 */ + addOrEdit(dockerHostId, oldMap, sshInfo, remoteList); + + /* 3. 无效删除 */ + if (!oldMap.isEmpty()) { + List ids = new ArrayList<>(); + for (DockerContainerInfo e : oldMap.values()) { + ids.add(e.getId()); + } + dockerInfoService.removeByIds(ids); + } + } + + private void updateRunNum(DockerHost host, List list) { + long runningCnt = list.stream() + .filter(r -> "1".equals(r.getStatus())) + .count(); + host.setRunNum(runningCnt); + host.setUpdateTime(vDate.getNow()); + dockerHostService.updateById(host); + } + + @GetMapping("/getApiInfo") public ApiResult> getApiInfo(String token) { if (vToken.isValidToken(token)) { @@ -145,31 +212,49 @@ public class sysController { } + /** + * 获取容器列表 + */ @GetMapping("/getApiDockerInfo") public ApiResult getDockerInfo(String dockerHostId, String token) { if (vToken.isValidToken(token)) { DockerHost host = dockerHostService.getById(dockerHostId); - try { - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("doker_host_id", dockerHostId); - dockerInfoService.remove(wrapper); - SshUser sshUser = sshUserService.getById(host.getUserId()); - SshInfo sshInfo = sshInfoService.getById(host.getHostId()); - List list = docker.getDockerInfo(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword()); - for (docker.DockerInfo dockerInfo : list) { - DockerContainerInfo info = docker.getDockerContainerInfo(dockerHostId, dockerInfo, sshInfo); - dockerInfoService.save(info); - } - long count = list.stream() - .filter(d -> "1".equals(d.getStatus())) - .count(); - host.setRunNum(count); - host.setUpdateTime(vDate.getNow()); - dockerHostService.updateById(host); - return ApiResult.success(); - } catch (Exception e) { - return ApiResult.error(500, e.getMessage()); + /* 1. 现有数据一次性加载到内存 */ + List oldList = + dockerInfoService.lambdaQuery() + .eq(DockerContainerInfo::getDokerHostId, dockerHostId) + .list(); + + Map oldMap = oldList.stream() + .collect(Collectors.toMap( + c -> buildKey(c.getDokerHostId(), c.getImageName(), c.getUnames()), + c -> c)); + /* 2. 远程最新数据 */ + SshUser sshUser = sshUserService.getById(host.getUserId()); + SshInfo sshInfo = sshInfoService.getById(host.getHostId()); + List remoteList = + docker.getDockerInfo(sshInfo.getHostIp(), + Long.valueOf(sshInfo.getHostPort()), + sshUser.getCUsername(), + sshUser.getCPassword()); + /* 3. 新增 or 更新 */ + addOrEdit(dockerHostId, oldMap, sshInfo, remoteList); + /* 4. 本轮未命中的即为“已失效”,批量删除 */ + if (!oldMap.isEmpty()) { + List idsToDel = oldMap.values() + .stream() + .map(DockerContainerInfo::getId) + .collect(Collectors.toList()); + dockerInfoService.removeByIds(idsToDel); } + + /* 5. 更新运行数 */ + long runningCnt = remoteList.stream() + .filter(r -> "1".equals(r.getStatus())) + .count(); + host.setRunNum(runningCnt); + host.setUpdateTime(vDate.getNow()); + dockerHostService.updateById(host); } return ApiResult.error(); } @@ -181,28 +266,25 @@ public class sysController { @GetMapping("/getApiStartDockerInfo") public ApiResult startDockerInfo(String id, String token) { if (vToken.isValidToken(token)) { - DockerContainerInfo dockerContainerInfo = dockerInfoService.getById(id); - DockerHost host = dockerHostService.getById(dockerContainerInfo.getDokerHostId()); + DockerContainerInfo cur = dockerInfoService.getById(id); + DockerHost host = dockerHostService.getById(cur.getDokerHostId()); try { - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("doker_host_id", dockerContainerInfo.getDokerHostId()); - dockerInfoService.remove(wrapper); SshUser sshUser = sshUserService.getById(host.getUserId()); SshInfo sshInfo = sshInfoService.getById(host.getHostId()); - docker.startDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), dockerContainerInfo.getContainerId()); - List list = docker.getDockerInfo(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword()); - for (docker.DockerInfo dockerInfo : list) { - DockerContainerInfo info = docker.getDockerContainerInfo(dockerContainerInfo.getDokerHostId(), dockerInfo, sshInfo); - dockerInfoService.save(info); - } - long count = list.stream() - .filter(d -> "1".equals(d.getStatus())) - .count(); - host.setRunNum(count); - dockerHostService.updateById(host); + docker.startDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), cur.getContainerId()); + /* 2. 取回最新列表 */ + List remoteList = docker.getDockerInfo( + sshInfo.getHostIp(), + Long.valueOf(sshInfo.getHostPort()), + sshUser.getCUsername(), + sshUser.getCPassword()); + /* 3. 有则更新、无则插入、失效删除 */ + refreshContainerTable(cur.getDokerHostId(), remoteList, sshInfo); + /* 4. 更新主机运行数 */ + updateRunNum(host, remoteList); return ApiResult.success(); } catch (Exception e) { - return ApiResult.error(500, e.getMessage()); + System.out.println(e.getMessage()); } } return ApiResult.error(); @@ -215,28 +297,25 @@ public class sysController { @GetMapping("/getApiStopDockerInfo") public ApiResult stopDockerInfo(String id, String token) { if (vToken.isValidToken(token)) { - DockerContainerInfo dockerContainerInfo = dockerInfoService.getById(id); - DockerHost host = dockerHostService.getById(dockerContainerInfo.getDokerHostId()); + DockerContainerInfo cur = dockerInfoService.getById(id); + DockerHost host = dockerHostService.getById(cur.getDokerHostId()); try { - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("doker_host_id", dockerContainerInfo.getDokerHostId()); - dockerInfoService.remove(wrapper); SshUser sshUser = sshUserService.getById(host.getUserId()); SshInfo sshInfo = sshInfoService.getById(host.getHostId()); - docker.stopDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), dockerContainerInfo.getContainerId()); - List list = docker.getDockerInfo(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword()); - for (docker.DockerInfo dockerInfo : list) { - DockerContainerInfo info = docker.getDockerContainerInfo(dockerContainerInfo.getDokerHostId(), dockerInfo, sshInfo); - dockerInfoService.save(info); - } - long count = list.stream() - .filter(d -> "1".equals(d.getStatus())) - .count(); - host.setRunNum(count); - dockerHostService.updateById(host); + docker.stopDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), cur.getContainerId()); + /* 2. 取回最新列表 */ + List remoteList = docker.getDockerInfo( + sshInfo.getHostIp(), + Long.valueOf(sshInfo.getHostPort()), + sshUser.getCUsername(), + sshUser.getCPassword()); + /* 3. 有则更新、无则插入、失效删除 */ + refreshContainerTable(cur.getDokerHostId(), remoteList, sshInfo); + /* 4. 更新主机运行数 */ + updateRunNum(host, remoteList); return ApiResult.success(); } catch (Exception e) { - return ApiResult.error(500, e.getMessage()); + System.out.println(e.getMessage()); } } return ApiResult.error();