diff --git a/agent-go/AgentInitialization.go b/agent-go/AgentInitialization.go index 1407fb7..3891b29 100644 --- a/agent-go/AgentInitialization.go +++ b/agent-go/AgentInitialization.go @@ -189,7 +189,7 @@ func parseAgentServerInfo(agentServerInfoConf string) *register.AgentServerInfo } log.Info(fmt.Sprintf("agent server info is %v", string(jsonFormat))) - // build a operator cache + // build operator cache BuildAgentOsOperator(agentServerInfo) return agentServerInfo @@ -197,21 +197,13 @@ func parseAgentServerInfo(agentServerInfoConf string) *register.AgentServerInfo func BuildAgentOsOperator(agentServerInfo *register.AgentServerInfo) { - executor.AgentOsOperatorCache = &executor.AgentOsOperator{ - InstallCommandPrefix: []string{ - "apt-get", "install", "-y", - }, - RemoveCommandPrefix: []string{"apt", "remove", "-y"}, - CanAccessInternet: true, - IsOsTypeUbuntu: true, - IsAgentInnerWall: true, - AgentArch: "amd64", - AgentOSReleaseCode: "focal", - AgentServerInfo: agentServerInfo, - } + // call the init exec function + agentOsOperator := executor.BuildAgentOsOperator(agentServerInfo.OSInfo) + + // assign the agentServerInfo + agentOsOperator.AgentServerInfo = agentServerInfo // debug - marshal, _ := json.Marshal(executor.AgentOsOperatorCache) - log.DebugF("cached agent operator is %s", marshal) - + marshal, _ := json.Marshal(agentOsOperator) + log.DebugF("[Agent INIT] cached agent operator is %s", marshal) } diff --git a/agent-go/executor/CommandExecutor.go b/agent-go/executor/CommandExecutor.go index 727198c..9de4b34 100644 --- a/agent-go/executor/CommandExecutor.go +++ b/agent-go/executor/CommandExecutor.go @@ -69,13 +69,17 @@ func PipeLineCommandExecutor(pipeLineCommand [][]string) ([]string, error) { var output []byte var err error + for i, command := range pipeLineCommand { + cmd := exec.Command(command[0], command[1:]...) cmd.Stdin = bytes.NewReader(output) + output, err = cmd.Output() if err != nil { return strings.Split(string(output), "\n"), err } + if i == len(pipeLineCommand)-1 { return strings.Split(string(output), "\n"), nil } diff --git a/agent-go/executor/InitFunction.go b/agent-go/executor/InitFunction.go new file mode 100644 index 0000000..9d67c97 --- /dev/null +++ b/agent-go/executor/InitFunction.go @@ -0,0 +1,80 @@ +package executor + +import "strings" + +func BuildAgentOsOperator(osInfo string) *AgentOsOperator { + + AgentOsOperatorCache = &AgentOsOperator{ + InstallCommandPrefix: []string{ + "apt-get", "install", "-y", + }, + RemoveCommandPrefix: []string{"apt", "remove", "-y"}, + CanAccessInternet: true, + IsOsTypeUbuntu: true, + IsAgentInnerWall: true, + AgentArch: "amd64", + AgentOSReleaseCode: "focal", + AgentServerInfo: nil, + } + + // os type + detectByOsType(AgentOsOperatorCache, osInfo) + + // internet + detectByInternet(AgentOsOperatorCache) + + return AgentOsOperatorCache +} + +func detectByOsType(os *AgentOsOperator, osInfo string) { + + ubuntuSsRealseCode := [][]string{ + { + "cat", + "/etc/os-release", + }, + { + "grep", + "CODE", + }, + { + "head", + "-1", + }, + { + "cut", + "-d", + "=", + "-f", + "2", + }, + } + + if strings.HasPrefix(osInfo, "Ce") { + // centos + os.IsOsTypeUbuntu = false + os.InstallCommandPrefix = []string{ + "yum", "install", "-y", + } + os.RemoveCommandPrefix = []string{ + "yum", "remove", + } + + } else { + // ubuntu + os.IsOsTypeUbuntu = true + os.RemoveCommandPrefix = []string{"apt", "remove", "-y"} + os.InstallCommandPrefix = []string{ + "apt-get", "install", "-y", + } + + // os release code + osRealseResult, _ := PipeLineCommandExecutor(ubuntuSsRealseCode) + os.AgentOSReleaseCode = osRealseResult[0] + } + +} + +func detectByInternet(os *AgentOsOperator) { + +} diff --git a/agent-go/rabbitmq/RabbitMsgQueue.go b/agent-go/rabbitmq/RabbitMsgQueue.go index 8edff5f..f163b0b 100644 --- a/agent-go/rabbitmq/RabbitMsgQueue.go +++ b/agent-go/rabbitmq/RabbitMsgQueue.go @@ -11,7 +11,6 @@ import ( type RabbitMQ interface { RabbitSendWriter - RabbitConnectCloser } @@ -29,6 +28,7 @@ type RabbitConnectCloser interface { type RabbitQueue struct { RabbitConn *RabbitMQConn + RabbitProp *ConnectProperty } diff --git a/agent-go/status/Disk.go b/agent-go/status/Disk.go index 09d93ef..11df2f1 100644 --- a/agent-go/status/Disk.go +++ b/agent-go/status/Disk.go @@ -3,14 +3,13 @@ package status import ( "fmt" "github.com/shirou/gopsutil/v3/disk" - "runtime" "time" ) type DiskStatus struct { - Total uint64 - Used uint64 - LogicalDisk []disk.PartitionStat + Total uint64 + Used uint64 + //LogicalDisk []disk.PartitionStat } func GetDiskStatus() *DiskStatus { @@ -22,11 +21,12 @@ func GetDiskStatus() *DiskStatus { ds.Total = du.Total ds.Used = du.Used + // 2023年7月14日 去除此部分 没什么用 // Get logical disk info for Linux systems - if runtime.GOOS == "linux" { - ld, _ := disk.Partitions(true) - ds.LogicalDisk = ld - } + //if runtime.GOOS == "linux" { + // ld, _ := disk.Partitions(true) + // ds.LogicalDisk = ld + //} return ds } diff --git a/common/src/main/java/io/wdd/common/beans/executor/ExecutorFunctionMessage.java b/common/src/main/java/io/wdd/common/beans/executor/ExecutorFunctionMessage.java index e51dc95..3fbb070 100644 --- a/common/src/main/java/io/wdd/common/beans/executor/ExecutorFunctionMessage.java +++ b/common/src/main/java/io/wdd/common/beans/executor/ExecutorFunctionMessage.java @@ -1,19 +1,19 @@ -package io.wdd.common.beans.executor; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@SuperBuilder(toBuilder = true) -@Deprecated -public class ExecutorFunctionMessage { - - String functionName; - - String functionContent; - -} +//package io.wdd.common.beans.executor; +// +//import lombok.AllArgsConstructor; +//import lombok.Data; +//import lombok.NoArgsConstructor; +//import lombok.experimental.SuperBuilder; +// +//@Data +//@NoArgsConstructor +//@AllArgsConstructor +//@SuperBuilder(toBuilder = true) +//@Deprecated +//public class ExecutorFunctionMessage { +// +// String functionName; +// +// String functionContent; +// +//} diff --git a/common/src/test/java/io/wdd/common/CommonApplicationTests.java b/common/src/test/java/io/wdd/common/CommonApplicationTests.java index 708f33c..cd57c6f 100644 --- a/common/src/test/java/io/wdd/common/CommonApplicationTests.java +++ b/common/src/test/java/io/wdd/common/CommonApplicationTests.java @@ -1,13 +1,7 @@ package io.wdd.common; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class CommonApplicationTests { - - @Test - void contextLoads() { +public class CommonApplicationTests { + public static void main(String[] args) { + System.out.println((double) System.currentTimeMillis()); } - -} +} \ No newline at end of file diff --git a/server/src/main/java/io/wdd/common/config/CorsConfig.java b/server/src/main/java/io/wdd/common/config/CorsConfig.java new file mode 100644 index 0000000..1a2d5af --- /dev/null +++ b/server/src/main/java/io/wdd/common/config/CorsConfig.java @@ -0,0 +1,25 @@ +package io.wdd.common.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry + .addMapping("/**") + .allowedOrigins("*") // 允许所有来源 + .allowedMethods( + "GET", + "POST", + "PUT", + "DELETE" + ) // 允许的请求方法 + .allowedHeaders("*") // 允许的请求头 + .allowCredentials(true); // 是否允许发送Cookie + } +} + diff --git a/server/src/main/java/io/wdd/common/utils/TimeUtils.java b/server/src/main/java/io/wdd/common/utils/TimeUtils.java index 11d1e54..743e5ea 100644 --- a/server/src/main/java/io/wdd/common/utils/TimeUtils.java +++ b/server/src/main/java/io/wdd/common/utils/TimeUtils.java @@ -81,6 +81,11 @@ public class TimeUtils { return LocalDateTime.now(SYSTEM_TIME_ZONE_ID); } + public static double utcTimeStampOfDouble() { + + return (double) System.currentTimeMillis(); + } + /** * @return 获取五秒时间误差内的统一时间 diff --git a/server/src/main/java/io/wdd/rpc/beans/request/MetricQueryEntity.java b/server/src/main/java/io/wdd/rpc/beans/request/MetricQueryEntity.java new file mode 100644 index 0000000..75716c3 --- /dev/null +++ b/server/src/main/java/io/wdd/rpc/beans/request/MetricQueryEntity.java @@ -0,0 +1,20 @@ +package io.wdd.rpc.beans.request; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("查询Agent运行状态的请求实体") +public class MetricQueryEntity { + + double metricStartTimeStamp; + + double metricEndTimeStamp; + + String agentTopicName; + +} diff --git a/server/src/main/java/io/wdd/rpc/controller/StatusController.java b/server/src/main/java/io/wdd/rpc/controller/StatusController.java index 335b24b..208d7cf 100644 --- a/server/src/main/java/io/wdd/rpc/controller/StatusController.java +++ b/server/src/main/java/io/wdd/rpc/controller/StatusController.java @@ -4,14 +4,14 @@ package io.wdd.rpc.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.wdd.common.response.R; +import io.wdd.rpc.beans.request.MetricQueryEntity; import io.wdd.rpc.scheduler.service.status.AgentAliveStatusMonitorService; +import io.wdd.rpc.status.beans.AgentStatus; import io.wdd.rpc.status.service.SyncStatusService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -55,7 +55,6 @@ public class StatusController { @PostMapping("/agent/all/string") public R GetAllAgentString() { - String data = ALL_AGENT_TOPIC_NAME_LIST.toString(); data.replace("[", ""); @@ -86,4 +85,14 @@ public class StatusController { } + @ApiOperation("[ Agent-Metric ] 获取Agent的Metric信息") + @PostMapping("/agent/metric") + public R> QueryMetricStatus( + @RequestBody MetricQueryEntity metricQueryEntity + ) { + + return R.ok(syncStatusService.QueryMetricStatus(metricQueryEntity)); + } + + } diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java b/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java index 766e039..1b32a5f 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java @@ -1,15 +1,19 @@ package io.wdd.rpc.scheduler.service.status; +import com.fasterxml.jackson.core.JsonProcessingException; +import io.wdd.common.utils.TimeUtils; import io.wdd.rpc.status.beans.AgentStatus; import io.wdd.rpc.status.service.SyncStatusService; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.Map; +import static io.wdd.common.utils.OctopusObjectMapperConfig.OctopusObjectMapper; import static io.wdd.rpc.status.CommonAndStatusCache.ALL_HEALTHY_AGENT_TOPIC_NAME_LIST; /** @@ -23,6 +27,9 @@ public class AgentMetricStatusCollectService { @Resource SyncStatusService syncStatusService; + @Resource + RedisTemplate redisTemplate; + /** * 收集所有健康主机的运行数据 */ @@ -40,12 +47,42 @@ public class AgentMetricStatusCollectService { 10 ); - // todo 需要进行存储或者咋滴 + // 2023年7月14日 使用redis存储状态数据 log.info( "[Agent Metric] - 所有主机的状态为 => {}", agentMetricStatusMap ); + agentMetricStatusMap + .entrySet() + .stream() + .forEach( + entry -> { + + try { + + String agentMetricString = OctopusObjectMapper.writeValueAsString(entry.getValue()); + + double currentTime = TimeUtils.utcTimeStampOfDouble(); + + redisTemplate + .opsForZSet() + .add( + entry.getKey() + "-Metric", + agentMetricString, + currentTime + ); + + // todo 处理长度缓存 + + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + + } + ); + } diff --git a/server/src/main/java/io/wdd/rpc/status/CommonAndStatusCache.java b/server/src/main/java/io/wdd/rpc/status/CommonAndStatusCache.java index f9719e8..edb4856 100644 --- a/server/src/main/java/io/wdd/rpc/status/CommonAndStatusCache.java +++ b/server/src/main/java/io/wdd/rpc/status/CommonAndStatusCache.java @@ -119,12 +119,15 @@ public class CommonAndStatusCache { ALL_AGENT_TOPIC_NAME_LIST.addAll(collect); ALL_AGENT_TOPIC_NAME_SET.addAll(collect); + String[] all_agent_topic_name_array = new String[ALL_AGENT_TOPIC_NAME_LIST.size()]; + ALL_AGENT_TOPIC_NAME_LIST.toArray(all_agent_topic_name_array); + // 2023年7月10日 同步缓存至Redis中 redisTemplate .opsForSet() .add( ALL_AGENT_TOPIC_NAME_REDIS_KEY, - ALL_AGENT_TOPIC_NAME_SET + all_agent_topic_name_array ); } diff --git a/server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java b/server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java index add5821..40532c1 100644 --- a/server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java +++ b/server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java @@ -17,7 +17,7 @@ public class CPUStatus { @JsonProperty("NumCores") private Integer numCores; - @JsonProperty("CPUStatus") + @JsonProperty("CPUInfo") private List cPUInfo; @JsonProperty("CPUPercent") private Double cPUPercent; diff --git a/server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java b/server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java index 2c728cf..d58aa3b 100644 --- a/server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java +++ b/server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java @@ -4,8 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - @NoArgsConstructor @Data public class DiskStatus { @@ -14,19 +12,19 @@ public class DiskStatus { private Long total; @JsonProperty("Used") private Long used; - @JsonProperty("LogicalDisk") - private List logicalDisk; +// @JsonProperty("LogicalDisk") +// private List logicalDisk; - @NoArgsConstructor - @Data - public static class LogicalDiskDTO { - @JsonProperty("device") - private String device; - @JsonProperty("mountpoint") - private String mountpoint; - @JsonProperty("fstype") - private String fstype; - @JsonProperty("opts") - private List opts; - } +// @NoArgsConstructor +// @Data +// public static class LogicalDiskDTO { +// @JsonProperty("device") +// private String device; +// @JsonProperty("mountpoint") +// private String mountpoint; +// @JsonProperty("fstype") +// private String fstype; +// @JsonProperty("opts") +// private List opts; +// } } diff --git a/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java b/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java index ab9d69b..d9bc4c5 100644 --- a/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java +++ b/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java @@ -1,7 +1,9 @@ package io.wdd.rpc.status.service; +import io.wdd.rpc.beans.request.MetricQueryEntity; import io.wdd.rpc.status.beans.AgentStatus; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -24,4 +26,15 @@ public interface SyncStatusService { * @return */ Map SyncCollectAgentMetricStatus(List agentTopicNameList, int collectMetricWaitMaxTime); + + + /* Metric 调用的后端接口 */ + + /** + * 根据前端的请求实体,查询相应的Metric信息 + * + * @return + */ + ArrayList QueryMetricStatus(MetricQueryEntity metricQueryEntity); + } diff --git a/server/src/main/java/io/wdd/rpc/status/service/SyncStatusServiceImpl.java b/server/src/main/java/io/wdd/rpc/status/service/SyncStatusServiceImpl.java index 6079932..c80cfa2 100644 --- a/server/src/main/java/io/wdd/rpc/status/service/SyncStatusServiceImpl.java +++ b/server/src/main/java/io/wdd/rpc/status/service/SyncStatusServiceImpl.java @@ -2,6 +2,7 @@ package io.wdd.rpc.status.service; import com.fasterxml.jackson.core.JsonProcessingException; import io.wdd.common.utils.TimeUtils; +import io.wdd.rpc.beans.request.MetricQueryEntity; import io.wdd.rpc.message.OctopusMessage; import io.wdd.rpc.message.OctopusMessageType; import io.wdd.rpc.message.handler.async.AsyncWaitOctopusMessageResultService; @@ -9,10 +10,12 @@ import io.wdd.rpc.message.handler.async.OctopusMessageSynScReplayContend; import io.wdd.rpc.message.sender.OMessageToAgentSender; import io.wdd.rpc.status.beans.AgentStatus; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -35,6 +38,9 @@ public class SyncStatusServiceImpl implements SyncStatusService { @Resource AsyncWaitOctopusMessageResultService asyncWaitOctopusMessageResultService; + @Resource + RedisTemplate redisTemplate; + @Override public Map SyncCollectAgentAliveStatus(List agentTopicNameList, int aliveStatusWaitMaxTime) { @@ -185,6 +191,52 @@ public class SyncStatusServiceImpl implements SyncStatusService { return metricMap; } + @Override + public ArrayList QueryMetricStatus(MetricQueryEntity metricQueryEntity) { + + String queryRedisKey = metricQueryEntity.getAgentTopicName() + "-Metric"; + + if (!redisTemplate.hasKey(queryRedisKey)) { + log.error( + "[Metric] - 查询到没有此Agent {} 的Metric信息,直接返回!", + metricQueryEntity.getAgentTopicName() + ); + } + + double start = metricQueryEntity.getMetricStartTimeStamp(); + double end = metricQueryEntity.getMetricEndTimeStamp(); + + ArrayList statusArrayList = new ArrayList<>(); + + redisTemplate + .opsForZSet() + .rangeByScore( + queryRedisKey, + start, + end + ) + .stream() + .forEachOrdered( + metricString -> { + try { + + AgentStatus agentStatus = OctopusObjectMapper.readValue( + (String) metricString, + AgentStatus.class + ); + + statusArrayList.add(agentStatus); + + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + ); + + + return statusArrayList; + } + /** * 2023年7月10日 通用的底层构造方法 Status类型的Octopus Message diff --git a/server/src/main/java/io/wdd/server/beans/request/ServerQueryEntity.java b/server/src/main/java/io/wdd/server/beans/request/ServerQueryEntity.java new file mode 100644 index 0000000..44eccf8 --- /dev/null +++ b/server/src/main/java/io/wdd/server/beans/request/ServerQueryEntity.java @@ -0,0 +1,29 @@ +package io.wdd.server.beans.request; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 前端请求 Server模块 的请求查询体 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("前端请求 Server模块 的请求查询体") +public class ServerQueryEntity { + + /*分页相关*/ + Integer pageNumber; + + Integer pageSize; + + /*条件查询*/ + String serverName; + + String serverIPv4; + + String serverLocation; + +} diff --git a/server/src/main/java/io/wdd/server/beans/vo/ServerInfoVO.java b/server/src/main/java/io/wdd/server/beans/vo/ServerInfoVO.java index 0b84bc3..fb83c80 100644 --- a/server/src/main/java/io/wdd/server/beans/vo/ServerInfoVO.java +++ b/server/src/main/java/io/wdd/server/beans/vo/ServerInfoVO.java @@ -16,6 +16,8 @@ import java.time.LocalDateTime; @SuperBuilder(toBuilder = true) public class ServerInfoVO { + private Integer id; + /** * server host name */ @@ -23,7 +25,6 @@ public class ServerInfoVO { /** * server public ipv4 - */ private String serverIpPbV4; diff --git a/server/src/main/java/io/wdd/server/controller/ServerController.java b/server/src/main/java/io/wdd/server/controller/ServerController.java index 411f0eb..6c0c31a 100644 --- a/server/src/main/java/io/wdd/server/controller/ServerController.java +++ b/server/src/main/java/io/wdd/server/controller/ServerController.java @@ -1,12 +1,14 @@ package io.wdd.server.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.wdd.common.response.R; import io.wdd.server.beans.po.DomainInfoPO; import io.wdd.server.beans.po.ServerInfoPO; +import io.wdd.server.beans.request.ServerQueryEntity; import io.wdd.server.beans.vo.AppInfoVO; import io.wdd.server.beans.vo.DomainInfoVO; import io.wdd.server.beans.vo.ServerInfoVO; @@ -34,6 +36,15 @@ public class ServerController { return R.ok(coreServerService.serverGetAll()); } + @PostMapping("/all") + @ApiOperation("获取服务器信息-web") + public R> serverGetAllByPage( + @RequestBody ServerQueryEntity serverQueryEntity + ) { + + return R.ok(coreServerService.serverGetByPage(serverQueryEntity)); + } + @GetMapping("/allIncludeDelete") public R serverGetAllIncludeDelete() { @@ -41,8 +52,8 @@ public class ServerController { } @PostMapping("/single") - @ApiOperation("根据信息查询单个服务器信息") - public R serverGetSingle( + @ApiOperation("根据信息查询单个服务器信息-非页面") + public R> serverGetSingle( @RequestParam(value = "serverIPv4", required = false) @ApiParam(value = "服务器IPv4地址", required = false) @Nullable String ipv4, @RequestParam(value = "serverName", required = false) @ApiParam(value = "服务器名称", required = false) @Nullable String serverName, @RequestParam(value = "serverLocation", required = false) @ApiParam(value = "服务器地理位置", required = false) @Nullable String serverLocation diff --git a/server/src/main/java/io/wdd/server/coreService/CoreServerService.java b/server/src/main/java/io/wdd/server/coreService/CoreServerService.java index b38a115..f4d9ec1 100644 --- a/server/src/main/java/io/wdd/server/coreService/CoreServerService.java +++ b/server/src/main/java/io/wdd/server/coreService/CoreServerService.java @@ -1,20 +1,26 @@ package io.wdd.server.coreService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.wdd.server.beans.po.DomainInfoPO; import io.wdd.server.beans.po.ServerInfoPO; +import io.wdd.server.beans.request.ServerQueryEntity; import io.wdd.server.beans.vo.AppInfoVO; import io.wdd.server.beans.vo.DomainInfoVO; import io.wdd.server.beans.vo.ServerInfoVO; import java.util.List; -import java.util.Set; public interface CoreServerService { - List serverGetSingle(String serverName, String ipv4, String serverLocation); + List serverGetSingle(String serverName, String ipv4, String serverLocation); List serverGetAll(); + /** + * 查询主机信息,但是是条件查询 + */ + Page serverGetByPage(ServerQueryEntity serverQueryEntity); + List serverGetAllIncludeDelete(); boolean serverCreate(ServerInfoVO serverInfoVO); diff --git a/server/src/main/java/io/wdd/server/coreService/impl/CoreServerServiceImpl.java b/server/src/main/java/io/wdd/server/coreService/impl/CoreServerServiceImpl.java index 02edb94..b89d6da 100644 --- a/server/src/main/java/io/wdd/server/coreService/impl/CoreServerServiceImpl.java +++ b/server/src/main/java/io/wdd/server/coreService/impl/CoreServerServiceImpl.java @@ -1,9 +1,11 @@ package io.wdd.server.coreService.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; -import com.google.errorprone.annotations.Var; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.wdd.server.beans.po.*; +import io.wdd.server.beans.request.ServerQueryEntity; import io.wdd.server.beans.vo.AppInfoVO; import io.wdd.server.beans.vo.DomainInfoVO; import io.wdd.server.beans.vo.ServerInfoVO; @@ -14,15 +16,15 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; - -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import javax.annotation.Resource; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.stream.Collectors; @@ -46,14 +48,30 @@ public class CoreServerServiceImpl implements CoreServerService { DomainInfoService domainInfoService; @Override - public List serverGetSingle(String serverName, String ipv4, String serverLocation) { + public List serverGetSingle(String serverName, String ipv4, String serverLocation) { // ignore if deleted ! - return new LambdaQueryChainWrapper<>(serverInfoService.getBaseMapper()) - .eq(StringUtils.isNoneEmpty(serverName), ServerInfoPO::getServerName, serverName) - .eq(StringUtils.isNoneEmpty(ipv4), ServerInfoPO::getServerIpPbV4, ipv4) - .eq(StringUtils.isNoneEmpty(serverLocation), ServerInfoPO::getLocation, serverLocation) + List list = new LambdaQueryChainWrapper<>(serverInfoService.getBaseMapper()) + .eq( + StringUtils.isNoneEmpty(serverName), + ServerInfoPO::getServerName, + serverName + ) + .eq( + StringUtils.isNoneEmpty(ipv4), + ServerInfoPO::getServerIpPbV4, + ipv4 + ) + .eq( + StringUtils.isNoneEmpty(serverLocation), + ServerInfoPO::getLocation, + serverLocation + ) .list(); + return this.covertServerPOtoVO( + list, + 0 + ); } @@ -63,7 +81,59 @@ public class CoreServerServiceImpl implements CoreServerService { List serverInfoPOWithOutDelete = serverInfoService.list(); - return covertServerPOtoVO(serverInfoPOWithOutDelete); + return covertServerPOtoVO( + serverInfoPOWithOutDelete, + 0 + ); + } + + @Override + public Page serverGetByPage(ServerQueryEntity serverQueryEntity) { + + + Page serverInfoPOPage = new Page<>( + serverQueryEntity.getPageNumber(), + serverQueryEntity.getPageSize() + ); + // 查询Page,会直接写入到serverInfoPOPage中 + serverInfoService + .getBaseMapper() + .selectPage( + serverInfoPOPage, + new QueryWrapper() + .like( + StringUtils.isNoneEmpty(serverQueryEntity.getServerName()), + "server_name", + serverQueryEntity.getServerName() + ) + .likeRight( + StringUtils.isNoneEmpty(serverQueryEntity.getServerIPv4()), + "server_ip_pb_v4", + serverQueryEntity.getServerIPv4() + ) + .likeRight( + StringUtils.isNoneEmpty(serverQueryEntity.getServerLocation()), + "location", + serverQueryEntity.getServerLocation() + ) + .orderByAsc("server_id") + ); + + + // 将查询结果中的User对象转换为UserVO对象 + Page serverInfoVOPage = new Page<>( + serverInfoPOPage.getCurrent(), + serverInfoPOPage.getSize() + ); + serverInfoVOPage.setTotal(serverInfoPOPage.getTotal()); + serverInfoVOPage.setRecords( + this.covertServerPOtoVO( + serverInfoPOPage.getRecords(), + (serverQueryEntity.getPageNumber() - 1) * serverQueryEntity.getPageSize() + ) + ); + + return serverInfoVOPage; } @Override @@ -79,7 +149,10 @@ public class CoreServerServiceImpl implements CoreServerService { public boolean serverCreate(ServerInfoVO serverInfoVO) { // BeanUtils.copyProperties(serverInfoVO, serverInfoPO); - ServerInfoPO serverInfoPO = EntityUtils.cvToTarget(serverInfoVO, ServerInfoPO.class); + ServerInfoPO serverInfoPO = EntityUtils.cvToTarget( + serverInfoVO, + ServerInfoPO.class + ); return serverInfoService.save(serverInfoPO); } @@ -88,18 +161,28 @@ public class CoreServerServiceImpl implements CoreServerService { public boolean serverCreateOrUpdate(ServerInfoVO serverInfoVO) { ServerInfoPO po = new LambdaQueryChainWrapper(serverInfoService.getBaseMapper()) - .eq(ServerInfoPO::getServerName, serverInfoVO.getServerName()).one(); + .eq( + ServerInfoPO::getServerName, + serverInfoVO.getServerName() + ) + .one(); if (ObjectUtils.isNotEmpty(po)) { try { - org.apache.commons.beanutils.BeanUtils.copyProperties(po, serverInfoVO); + org.apache.commons.beanutils.BeanUtils.copyProperties( + po, + serverInfoVO + ); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } else { - po = EntityUtils.cvToTarget(serverInfoVO, ServerInfoPO.class); + po = EntityUtils.cvToTarget( + serverInfoVO, + ServerInfoPO.class + ); } return serverInfoService.saveOrUpdate(po); @@ -113,7 +196,10 @@ public class CoreServerServiceImpl implements CoreServerService { } return new LambdaUpdateChainWrapper<>(serverInfoService.getBaseMapper()) - .eq(ServerInfoPO::getServerId, serverInfoPO.getServerId()) + .eq( + ServerInfoPO::getServerId, + serverInfoPO.getServerId() + ) .update(serverInfoPO); } @@ -126,9 +212,20 @@ public class CoreServerServiceImpl implements CoreServerService { // set isDelete = 1 return new LambdaUpdateChainWrapper<>(serverInfoService.getBaseMapper()) - .eq(serverId != null, ServerInfoPO::getServerId, serverId) - .eq(StringUtils.isNoneEmpty(serverName), ServerInfoPO::getServerName, serverName) - .set(ServerInfoPO::getIsDelete, 1) + .eq( + serverId != null, + ServerInfoPO::getServerId, + serverId + ) + .eq( + StringUtils.isNoneEmpty(serverName), + ServerInfoPO::getServerName, + serverName + ) + .set( + ServerInfoPO::getIsDelete, + 1 + ) .update(); } @@ -138,27 +235,47 @@ public class CoreServerServiceImpl implements CoreServerService { // serverInfo --- server_app_relation --- appInfo - List serverAppRelationPOList = new LambdaQueryChainWrapper(serverAppRelationService.getBaseMapper()).eq(ServerAppRelationPO::getServerId, serverId).list(); + List serverAppRelationPOList = new LambdaQueryChainWrapper(serverAppRelationService.getBaseMapper()) + .eq( + ServerAppRelationPO::getServerId, + serverId + ) + .list(); - Assert.notEmpty(serverAppRelationPOList,"No server find"); + Assert.notEmpty( + serverAppRelationPOList, + "No server find" + ); // query the app info with specific server id - List appInfoPOList = appInfoService.listByIds(serverAppRelationPOList.stream().map( - serverAppRelationPO -> serverAppRelationPO.getAppId() - ).collect(Collectors.toList())); + List appInfoPOList = appInfoService.listByIds(serverAppRelationPOList + .stream() + .map( + serverAppRelationPO -> serverAppRelationPO.getAppId() + ) + .collect(Collectors.toList())); - return EntityUtils.cvToTarget(appInfoPOList,AppInfoVO.class); + return EntityUtils.cvToTarget( + appInfoPOList, + AppInfoVO.class + ); } @Override @Transactional public AppInfoVO appCreate(Long serverId, AppInfoVO appInfoVO) { - Assert.notNull(serverInfoService.getById(serverId),"server not find, can't create a app"); + Assert.notNull( + serverInfoService.getById(serverId), + "server not find, can't create a app" + ); // 1- save appInfo itself - AppInfoPO appInfoPO = EntityUtils.cvToTarget(appInfoVO, AppInfoPO.class); + AppInfoPO appInfoPO = EntityUtils.cvToTarget( + appInfoVO, + AppInfoPO.class + ); appInfoService.save(appInfoPO); // 2. create the relation @@ -168,15 +285,24 @@ public class CoreServerServiceImpl implements CoreServerService { serverAppRelationService.save(relationPO); - return EntityUtils.cvToTarget(appInfoPO, AppInfoVO.class); + return EntityUtils.cvToTarget( + appInfoPO, + AppInfoVO.class + ); } @Override @Transactional public boolean appDelete(Long serverId, Long appId) { - Assert.notNull(serverInfoService.getById(serverId),"server not find, can't delete a app"); - Assert.notNull(appInfoService.getById(appId),"app not find, can't delete a app"); + Assert.notNull( + serverInfoService.getById(serverId), + "server not find, can't delete a app" + ); + Assert.notNull( + appInfoService.getById(appId), + "app not find, can't delete a app" + ); // 1. delete the relation serverAppRelationService.removeById(serverId); @@ -186,65 +312,114 @@ public class CoreServerServiceImpl implements CoreServerService { return true; } - private List covertServerPOtoVO(List serverInfoPOList) { + private List covertServerPOtoVO(List serverInfoPOList, int startIndex) { if (null == serverInfoPOList || serverInfoPOList.size() == 0) { return Collections.emptyList(); } + ArrayList serverInfoVOList = new ArrayList<>(32); - return serverInfoPOList.stream().map(serverInfoPO -> { - ServerInfoVO serverInfoVO = new ServerInfoVO(); - BeanUtils.copyProperties(serverInfoPO, serverInfoVO); - return serverInfoVO; - } - ).collect(Collectors.toList()); + + for (int i = 0; i < serverInfoPOList.size(); i++) { + + ServerInfoVO serverInfoVO = new ServerInfoVO(); + + BeanUtils.copyProperties( + serverInfoPOList.get(i), + serverInfoVO + ); + + // 2023年7月13日 设置序号 + serverInfoVO.setId(startIndex++); + + serverInfoVOList.add(serverInfoVO); + } + + return serverInfoVOList; } /* - * below is server associated domain - * server --- domain - * 1 ----------- n - * */ + * below is server associated domain + * server --- domain + * 1 ----------- n + * */ @Override public List domainGetAll(Long serverId) { - Assert.notNull(serverInfoService.getById(serverId),"server not find, can't create a app"); + Assert.notNull( + serverInfoService.getById(serverId), + "server not find, can't create a app" + ); List domainRelationPOList = new LambdaQueryChainWrapper(serverDomainRelationService.getBaseMapper()) - .eq(ServerDomainRelationPO::getServerId, serverId).list(); + .eq( + ServerDomainRelationPO::getServerId, + serverId + ) + .list(); - List domainInfoPOList = domainInfoService.listByIds(domainRelationPOList.stream().map( - domainRelationPO -> domainRelationPO.getDomainId() - ).collect(Collectors.toList())); + List domainInfoPOList = domainInfoService.listByIds(domainRelationPOList + .stream() + .map( + domainRelationPO -> domainRelationPO.getDomainId() + ) + .collect(Collectors.toList())); - return EntityUtils.cvToTarget(domainInfoPOList, DomainInfoVO.class); + return EntityUtils.cvToTarget( + domainInfoPOList, + DomainInfoVO.class + ); } @Override public List domainGetSingle(Long serverId, String domainName, String dnsIP) { - Assert.notNull(serverInfoService.getById(serverId),"server not find, can't create a app"); + Assert.notNull( + serverInfoService.getById(serverId), + "server not find, can't create a app" + ); List domainRelationPOList = new LambdaQueryChainWrapper(serverDomainRelationService.getBaseMapper()) - .eq(ServerDomainRelationPO::getServerId, serverId).list(); + .eq( + ServerDomainRelationPO::getServerId, + serverId + ) + .list(); - List domainInfoPOList = domainRelationPOList.stream().map( - domainPO -> { - // query single according to every server id related domain ID - return new LambdaQueryChainWrapper(domainInfoService.getBaseMapper()) - .eq(DomainInfoPO::getDomainId, domainPO.getDomainId()) - .like(StringUtils.isNotEmpty(domainName), DomainInfoPO::getDomainName, domainName) - .eq(StringUtils.isNoneEmpty(dnsIP), DomainInfoPO::getDnsIp, dnsIP) - .one(); - } - ).collect(Collectors.toList()); + List domainInfoPOList = domainRelationPOList + .stream() + .map( + domainPO -> { + // query single according to every server id related domain ID + return new LambdaQueryChainWrapper(domainInfoService.getBaseMapper()) + .eq( + DomainInfoPO::getDomainId, + domainPO.getDomainId() + ) + .like( + StringUtils.isNotEmpty(domainName), + DomainInfoPO::getDomainName, + domainName + ) + .eq( + StringUtils.isNoneEmpty(dnsIP), + DomainInfoPO::getDnsIp, + dnsIP + ) + .one(); + } + ) + .collect(Collectors.toList()); - return EntityUtils.cvToTarget(domainInfoPOList, DomainInfoVO.class); + return EntityUtils.cvToTarget( + domainInfoPOList, + DomainInfoVO.class + ); } @Override