Преглед на файлове

开发应用状态管理接口

reghao преди 5 години
родител
ревизия
dcd16d46f6
променени са 20 файла, в които са добавени 239 реда и са изтрити 226 реда
  1. 0 14
      common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/AppLog.java
  2. 3 5
      common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/AppLogArgs.java
  3. 29 0
      common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/LogConfig.java
  4. 1 2
      common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/LogFile.java
  5. 19 42
      common/src/main/java/cn/reghao/autodop/common/dockerc/Docker.java
  6. 4 4
      common/src/main/java/cn/reghao/autodop/common/dockerc/api/ContainerOps.java
  7. 14 68
      dagent/src/main/java/cn/reghao/autodop/dagent/app/App.java
  8. 17 1
      dagent/src/main/java/cn/reghao/autodop/dagent/app/AppService.java
  9. 30 18
      dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppServiceImpl.java
  10. 3 3
      dagent/src/main/java/cn/reghao/autodop/dagent/app/ZipAppServiceImpl.java
  11. 3 3
      dagent/src/main/java/cn/reghao/autodop/dagent/app/deploy/DockerAppLogServiceImpl.java
  12. 6 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/StatusController.java
  13. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/tools/CompilerConfig.java
  14. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/tools/PackerConfig.java
  15. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/tools/RepoConfig.java
  16. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/LogConfig.java
  17. 8 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/AppStatus.java
  18. 4 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/AppStatusRepository.java
  19. 80 47
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusService.java
  20. 4 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/AppStatusCrudService.java

+ 0 - 14
common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/AppLog.java

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.common.dagent.app.api.data.log;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2020-12-25 19:01:22
- */
-@Data
-public class AppLog {
-    private List<String> logs;
-}

+ 3 - 5
common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/AppLogArgs.java

@@ -2,6 +2,8 @@ package cn.reghao.autodop.common.dagent.app.api.data.log;
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2020-12-25 19:01:22
@@ -9,10 +11,6 @@ import lombok.Data;
 @Data
 public class AppLogArgs {
     private String packerType;
-    private String logType;
-    private String logLevel;
     private String appId;
-    private boolean isLogFile;
-    // 根据 isLogFile 判断是日志目录或文件路径
-    private String logPath;
+    private List<LogConfig> logConfigs;
 }

+ 29 - 0
common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/LogConfig.java

@@ -0,0 +1,29 @@
+package cn.reghao.autodop.common.dagent.app.api.data.log;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * 应用日志配置
+ * 等价于 cn.reghao.autodop.dmaster.app.entity.deploy.LogConfig
+ *
+ * @author reghao
+ * @date 2020-05-19 09:24:41
+ */
+@AllArgsConstructor
+@Data
+public class LogConfig {
+    private String type;
+    private String level;
+    // 相对于 runningHome
+    private String logPath;
+    // 判断是日志目录还是日志文件
+    private Boolean isDir;
+
+    public LogConfig(String type, String level, String logPath) {
+        this.type = type;
+        this.level = level;
+        this.logPath = logPath;
+        this.isDir =true;
+    }
+}

+ 1 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/LogFile.java → common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/LogFile.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.vo;
+package cn.reghao.autodop.common.dagent.app.api.data.log;
 
 import lombok.Data;
 
@@ -8,7 +8,6 @@ import java.util.List;
  * @author reghao
  * @date 2020-06-03 21:41:21
  */
-@Deprecated
 @Data
 public class LogFile {
     private String logType;

+ 19 - 42
common/src/main/java/cn/reghao/autodop/common/dockerc/Docker.java

@@ -213,12 +213,7 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
         String uri = DockerApi.createPost + "?name=" + containerName;
 
         config.setImage(repoTag);
-        String tmp = JsonConverter.objectToJson(config);
-        String json = tmp.replace("image", "Image")
-                .replace("hostConfig", "HostConfig")
-                .replace("networkMode", "NetworkMode");
-        //.replace("volumes", "Volumes");
-
+        String json = JsonConverter.objectToJson(config);
         try {
             FullHttpResponse response = client.postJson(uri, null, json);
             if (response != null) {
@@ -289,10 +284,11 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
      * @date 2020-05-19 上午10:26
      */
     @Override
-    public List<String> consoleLogs(String containerId, String logLevel) throws DockerException {
+    public List<String> consoleLog(String containerId, String logLevel) throws DockerException {
         try {
             String uri = DockerApi.logsGet.replace("{}", containerId);
             FullHttpResponse response;
+            // TODO 处理乱码
             switch (LogLevel.valueOf(logLevel)) {
                 case info:
                     // 标准输出
@@ -323,49 +319,34 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
     }
 
     /**
-     * 文件日志
+     * 目录中的文件列表
      *
      * @param
      * @return
      * @date 2020-05-19 上午10:26
      */
-    @Override
-    public List<String> fileLogs(String containerId, String logLevel, String logPath, boolean isLogFile)
-            throws DockerException {
-        switch (LogLevel.valueOf(logLevel)) {
-            case info:
-                if (!isLogFile) {
-                    return appLogFiles(containerId, logPath);
-                } else {
-                    return appLogFileContent(containerId, logPath);
-                }
-            case error:
-                if (!isLogFile) {
-                    return appLogFiles(containerId, logPath);
-                } else {
-                    return appLogFileContent(containerId, logPath);
-                }
-            default:
-                throw new DockerException("日志级别 " + logLevel + " 不存在");
-        }
-    }
-
-    private List<String> appLogFiles(String containerId, String dirPath) throws DockerException {
+    public List<String> fileList(String containerId, String dirPath) throws DockerException {
         String logDirPath = rootfs(containerId) + dirPath;
         File logDir = new File(logDirPath);
-        if (!logDir.exists()) {
-            throw new DockerException(logDirPath + " 目录不存在");
-        } else if (logDir.isFile()) {
-            throw new DockerException(logDirPath + " 是一个文件");
-        } else {
+        if (logDir.exists()) {
             return Arrays.stream(Objects.requireNonNull(logDir.listFiles()))
                     .map(File::getName)
                     .collect(Collectors.toList());
+        } else {
+            return new ArrayList<>();
         }
     }
 
-    private List<String> appLogFileContent(String containerId, String filePath) throws DockerException {
-        String logFilePath = rootfs(containerId) + filePath;
+    /**
+     * 文件日志
+     *
+     * @param
+     * @return
+     * @date 2020-05-19 上午10:26
+     */
+    @Override
+    public List<String> fileLog(String containerId, String logPath) throws DockerException {
+        String logFilePath = rootfs(containerId) + logPath;
         File logFile = new File(logFilePath);
         if (!logFile.exists()) {
             throw new DockerException(logFilePath + " 文件不存在");
@@ -416,6 +397,7 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
         return containerInfo.getGraphDriver().getData().getMergedDir();
     }
 
+    // TODO 待实现 docker cp
     public void archive(String containerId) {
         String uri = "http://v1.4.0/containers/32487cddf5d5/archive?path=/";
         try {
@@ -435,11 +417,6 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
         try (Docker docker = new Docker()) {
             String appId = "registry";
             String containerId = docker.getIdByName(appId);
-            ContainerInfo containerInfo = docker.inspectContainer(containerId);
-            String rootfs = docker.rootfs(containerId);
-
-            String logLevel = LogLevel.info.name();
-            List<String> logs = docker.fileLogs(containerId, logLevel, "", true);
             System.out.println();
         } catch (DockerException e) {
             e.printStackTrace();

+ 4 - 4
common/src/main/java/cn/reghao/autodop/common/dockerc/api/ContainerOps.java

@@ -31,22 +31,22 @@ public interface ContainerOps {
     void rmContainer(String containerId) throws DockerException;
 
     /**
-     * 控制台日志
+     * 控制台日志内容
      *
      * @param
      * @return
      * @date 2020-05-19 上午10:57
      */
-    List<String> consoleLogs(String containerId, String logLevel) throws DockerException;
+    List<String> consoleLog(String containerId, String logLevel) throws DockerException;
 
     /**
-     * 文件日志
+     * 文件日志内容
      *
      * @param
      * @return
      * @date 2020-05-19 上午10:58
      */
-    List<String> fileLogs(String containerId, String logLevel, String logPath, boolean isLogFile) throws DockerException;
+    List<String> fileLog(String containerId, String logPath) throws DockerException;
 
     /**
      * 查看容器状态

+ 14 - 68
dagent/src/main/java/cn/reghao/autodop/dagent/app/App.java

@@ -6,6 +6,8 @@ import cn.reghao.autodop.common.dagent.app.api.data.AppStatus;
 import cn.reghao.autodop.common.dagent.app.api.data.deploy.AppDeployArgs;
 import cn.reghao.autodop.common.dagent.app.api.data.deploy.PackerType;
 import cn.reghao.autodop.common.dagent.app.api.data.log.AppLogArgs;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogConfig;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
 import cn.reghao.autodop.common.utils.ExceptionUtil;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
@@ -55,84 +57,28 @@ public class App {
         try {
             AppLogArgs appLogArgs = (AppLogArgs) JsonConverter.jsonToObject(payload, AppLogArgs.class);
             String packerType = appLogArgs.getPackerType();
-            boolean isLogFile = appLogArgs.isLogFile();
-            /*if (!isLogFile) {
-                return logFiles(appLogArgs);
-            } else {
-                return logContent(appLogArgs);
-            }*/
-
-            List<String> logs;
+            long count = appLogArgs.getLogConfigs().stream().filter(LogConfig::getIsDir).count();
+
             switch (PackerType.valueOf(packerType)) {
                 case docker:
-                    if (!isLogFile) {
-                        logs = dockerAppServiceImpl.logFiles(appLogArgs);
+                    if (count > 0) {
+                        List<LogFile> logFiles = dockerAppServiceImpl.logFiles(appLogArgs);
+                        return RpcResult.success(JsonConverter.objectToJson(logFiles));
                     } else {
-                        logs = dockerAppServiceImpl.logContent(appLogArgs);
+                        List<String> logContent = dockerAppServiceImpl.logContent(appLogArgs);
+                        return RpcResult.success(JsonConverter.objectToJson(logContent));
                     }
-
-                    break;
                 case zip:
-                    if (!isLogFile) {
-                        logs = zipAppServiceImpl.logFiles(appLogArgs);
+                    if (count > 0) {
+                        List<LogFile> logFiles = zipAppServiceImpl.logFiles(appLogArgs);
+                        return RpcResult.success(JsonConverter.objectToJson(logFiles));
                     } else {
-                        logs = zipAppServiceImpl.logContent(appLogArgs);
+                        List<String> logContent = zipAppServiceImpl.logContent(appLogArgs);
+                        return RpcResult.success(JsonConverter.objectToJson(logContent));
                     }
-                    break;
-                default:
-                    return RpcResult.error("打包类型 " + appLogArgs.getPackerType() + " 不存在");
-            }
-            return RpcResult.success(JsonConverter.objectToJson(logs));
-        } catch (Exception e) {
-            return RpcResult.fail(ExceptionUtil.errorMsg(e));
-        }
-    }
-
-    /**
-     * 日志文件列表
-     *
-     * @param
-     * @return
-     * @date 2021-02-26 上午10:56
-     */
-    private RpcResult logFiles(AppLogArgs appLogArgs) throws DockerException {
-        String packerType = appLogArgs.getPackerType();
-        List<String> logs;
-        switch (PackerType.valueOf(packerType)) {
-            case docker:
-                logs = dockerAppServiceImpl.logFiles(appLogArgs);
-                break;
-            case zip:
-                logs = zipAppServiceImpl.logFiles(appLogArgs);
-                break;
-            default:
-                return RpcResult.error("打包类型 " + appLogArgs.getPackerType() + " 不存在");
-        }
-        return RpcResult.success(JsonConverter.objectToJson(logs));
-    }
-
-    /**
-     * 日志文件内容
-     *
-     * @param
-     * @return
-     * @date 2021-02-26 上午10:56
-     */
-    private RpcResult logContent(AppLogArgs appLogArgs) {
-        try {
-            String packerType = appLogArgs.getPackerType();
-            List<String> logs;
-            switch (PackerType.valueOf(packerType)) {
-                case docker:
-                    logs = dockerAppServiceImpl.logContent(appLogArgs);
-                    break;
-                case zip:
-                    logs = zipAppServiceImpl.logContent(appLogArgs);
-                    break;
                 default:
                     return RpcResult.error("打包类型 " + appLogArgs.getPackerType() + " 不存在");
             }
-            return RpcResult.success(JsonConverter.objectToJson(logs));
         } catch (Exception e) {
             return RpcResult.fail(ExceptionUtil.errorMsg(e));
         }

+ 17 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/app/AppService.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dagent.app;
 import cn.reghao.autodop.common.dagent.app.api.data.AppStatus;
 import cn.reghao.autodop.common.dagent.app.api.data.deploy.AppDeployArgs;
 import cn.reghao.autodop.common.dagent.app.api.data.log.AppLogArgs;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
 
 import java.util.List;
@@ -13,7 +14,22 @@ import java.util.List;
  */
 public interface AppService {
     AppStatus deploy(AppDeployArgs appDeployArgs) throws DockerException;
-    List<String> logFiles(AppLogArgs appLogArgs) throws DockerException;
+    /**
+     * 日志文件列表
+     *
+     * @param
+     * @return
+     * @date 2021-02-26 下午3:25
+     */
+    List<LogFile> logFiles(AppLogArgs appLogArgs) throws DockerException;
+
+    /**
+     * 日志内容
+     *
+     * @param
+     * @return
+     * @date 2021-02-26 下午3:26
+     */
     List<String> logContent(AppLogArgs appLogArgs) throws DockerException;
     AppStatus status(String appId) throws DockerException;
     AppStatus restart(String appId) throws DockerException;

+ 30 - 18
dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppServiceImpl.java

@@ -3,6 +3,8 @@ package cn.reghao.autodop.dagent.app;
 import cn.reghao.autodop.common.dagent.app.api.data.AppStatus;
 import cn.reghao.autodop.common.dagent.app.api.data.deploy.AppDeployArgs;
 import cn.reghao.autodop.common.dagent.app.api.data.log.AppLogArgs;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogConfig;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
 import cn.reghao.autodop.common.dagent.app.api.data.log.LogType;
 import cn.reghao.autodop.common.dagent.machine.Machine;
 import cn.reghao.autodop.common.dockerc.Docker;
@@ -56,41 +58,51 @@ public class DockerAppServiceImpl implements AppService {
     }
 
     @Override
-    public List<String> logFiles(AppLogArgs appLogArgs) throws DockerException {
+    public List<LogFile> logFiles(AppLogArgs appLogArgs) throws DockerException {
         String appId = appLogArgs.getAppId();
-        String logType = appLogArgs.getLogType();
-        String logLevel = appLogArgs.getLogLevel();
-        String logPath = appLogArgs.getLogPath();
-        boolean isLogFile = appLogArgs.isLogFile();
+        List<LogConfig> logConfigs = appLogArgs.getLogConfigs();
 
         try (Docker docker = new Docker()) {
             String containerId = docker.getIdByName(appId);
-            switch (LogType.valueOf(logType)) {
-                case console:
-                    return docker.consoleLogs(containerId, logLevel);
-                case file:
-                    return docker.fileLogs(containerId, logLevel, logPath, isLogFile);
-                default:
-                    throw new DockerException("日志类型 " + logType + " 不存在");
+            List<LogFile> logFiles = new ArrayList<>();
+            for (LogConfig logConfig : logConfigs) {
+                String logType = logConfig.getType();
+                String logLevel = logConfig.getLevel();
+                String logPath = logConfig.getLogPath();
+
+                LogFile logFile = new LogFile(logType, logLevel);
+                switch (LogType.valueOf(logType)) {
+                    case console:
+                        logFile.setFiles(docker.fileList(containerId, logPath));
+                        break;
+                    case file:
+                        logFile.setFiles(docker.fileList(containerId, logPath));
+                        break;
+                    default:
+                        throw new DockerException("日志类型 " + logType + " 不存在");
+                }
+                logFiles.add(logFile);
             }
+            return logFiles;
         }
     }
 
     @Override
     public List<String> logContent(AppLogArgs appLogArgs) throws DockerException {
         String appId = appLogArgs.getAppId();
-        String logType = appLogArgs.getLogType();
-        String logLevel = appLogArgs.getLogLevel();
-        String logPath = appLogArgs.getLogPath();
-        boolean isLogFile = appLogArgs.isLogFile();
+        List<LogConfig> logConfigs = appLogArgs.getLogConfigs();
+        LogConfig logConfig = logConfigs.get(0);
+        String logType = logConfig.getType();
+        String logLevel = logConfig.getLevel();
+        String logPath = logConfig.getLogPath();
 
         try (Docker docker = new Docker()) {
             String containerId = docker.getIdByName(appId);
             switch (LogType.valueOf(logType)) {
                 case console:
-                    return docker.consoleLogs(containerId, logLevel);
+                    return docker.consoleLog(containerId, logLevel);
                 case file:
-                    return docker.fileLogs(containerId, logLevel, logPath, isLogFile);
+                    return docker.fileLog(containerId, logPath);
                 default:
                     throw new DockerException("日志类型 " + logType + " 不存在");
             }

+ 3 - 3
dagent/src/main/java/cn/reghao/autodop/dagent/app/ZipAppServiceImpl.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dagent.app;
 import cn.reghao.autodop.common.dagent.app.api.data.AppStatus;
 import cn.reghao.autodop.common.dagent.app.api.data.deploy.AppDeployArgs;
 import cn.reghao.autodop.common.dagent.app.api.data.log.AppLogArgs;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
 import lombok.extern.slf4j.Slf4j;
 
@@ -22,9 +23,8 @@ public class ZipAppServiceImpl implements AppService {
     }
 
     @Override
-    public List<String> logFiles(AppLogArgs appLogArgs) {
-        List<String> list = new ArrayList<>();
-        return list;
+    public List<LogFile> logFiles(AppLogArgs appLogArgs) {
+        return null;
     }
 
     @Override

+ 3 - 3
dagent/src/main/java/cn/reghao/autodop/dagent/app/deploy/DockerAppLogServiceImpl.java

@@ -28,7 +28,7 @@ public class DockerAppLogServiceImpl implements AppLogService {
                     }
                     return list;
                 case file:
-                    return docker.fileLogs(containerId, logLevel, logPath, true);
+                    return docker.fileLog(containerId, logPath);
                 default:
                     throw new Exception(type + " 日志类型不存在");
             }
@@ -42,12 +42,12 @@ public class DockerAppLogServiceImpl implements AppLogService {
             LogType type = LogType.valueOf(logType);
             switch (type) {
                 case console:
-                    return docker.consoleLogs(containerId, logLevel);
+                    return docker.consoleLog(containerId, logLevel);
                 case file:
                     String rootfs = docker.rootfs(containerId);
                     // 返回最近的 500 行日志
                     // TODO 实现双向流,读取更早的日志。解决中文乱码问题
-                    return new TextFile().tailRead(rootfs + logfilePath, 500);
+                    return new TextFile().tailRead(rootfs + logfilePath, 1000);
                 default:
                     throw new Exception(type + " 日志类型不存在");
             }

+ 6 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/StatusController.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dmaster.app.controller;
 import cn.reghao.autodop.dmaster.app.entity.log.AppStatus;
 import cn.reghao.autodop.dmaster.app.service.AppStatusService;
 import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -32,27 +33,24 @@ public class StatusController {
     @GetMapping("/list")
     public ResponseEntity<String> status(@RequestParam("page") int page, @RequestParam("size") int size,
                                          @RequestParam("env") String env) {
-
         PageList<AppStatus> pageList = statusService.deployedAppStatus(page, size, env);
         return ResponseEntity.ok().body(WebResult.success(pageList));
     }
 
     @ApiOperation(value = "获取指定主机上应用的所有日志文件")
     @GetMapping("/log/files")
-    public ResponseEntity<String> appLogFiles(@RequestParam("appId") String appId,
-                                              @RequestParam("logType") String logType,
-                                              @RequestParam("logLevel") String logLevel,
-                                              @RequestParam("machineId") String machineId) {
-        List<String> list = statusService.logFiles(appId, logType, logLevel, machineId);
+    public ResponseEntity<String> appLogFiles(@RequestParam("machineId") String machineId,
+                                              @RequestParam("appId") String appId) {
+        List<LogFile> list = statusService.logFiles(appId, machineId);
         return ResponseEntity.ok().body(WebResult.success(list));
     }
 
     @ApiOperation(value = "获取应用日志内容")
     @GetMapping("/log/content")
-    public ResponseEntity<String> appLogContent(@RequestParam("appId") String appId,
+    public ResponseEntity<String> appLogContent(@RequestParam("machineId") String machineId,
+                                                @RequestParam("appId") String appId,
                                                 @RequestParam("logType") String logType,
                                                 @RequestParam("logLevel") String logLevel,
-                                                @RequestParam("machineId") String machineId,
                                                 @RequestParam("logFile") String logFile) {
         List<String> logs = statusService.logContent(appId, logType, logLevel, machineId, logFile);
         return ResponseEntity.ok().body(WebResult.success(logs));

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/tools/CompilerConfig.java

@@ -39,9 +39,10 @@ public class CompilerConfig extends BaseEntity {
     }
 
     public CompilerConfig vo() {
-        this.id = null;
-        this.createTime = null;
-        this.updateTime = null;
+        this.setId(null);
+        this.setIsDelete(null);
+        this.setCreateTime(null);
+        this.setUpdateTime(null);
         return this;
     }
 }

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/tools/PackerConfig.java

@@ -33,9 +33,10 @@ public class PackerConfig extends BaseEntity {
     }
 
     public PackerConfig vo() {
-        this.id = null;
-        this.createTime = null;
-        this.updateTime = null;
+        this.setId(null);
+        this.setIsDelete(null);
+        this.setCreateTime(null);
+        this.setUpdateTime(null);
         return this;
     }
 }

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/tools/RepoConfig.java

@@ -38,9 +38,10 @@ public class RepoConfig extends BaseEntity {
     }
 
     public RepoConfig vo() {
-        this.id = null;
-        this.createTime = null;
-        this.updateTime = null;
+        this.setId(null);
+        this.setIsDelete(null);
+        this.setCreateTime(null);
+        this.setUpdateTime(null);
         return this;
     }
 }

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/LogConfig.java

@@ -17,4 +17,6 @@ public class LogConfig {
     private String level;
     // 相对于 runningHome
     private String logPath;
+    // 判断是日志目录还是日志文件
+    private Boolean isDir;
 }

+ 8 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/AppStatus.java

@@ -26,4 +26,12 @@ public class AppStatus extends BaseEntity {
     private boolean isRunning;
     private long startTime;
     private int pid;
+
+    public AppStatus vo() {
+        this.setId(null);
+        this.setIsDelete(null);
+        this.setCreateTime(null);
+        this.setUpdateTime(null);
+        return this;
+    }
 }

+ 4 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/log/AppStatusRepository.java

@@ -1,6 +1,8 @@
 package cn.reghao.autodop.dmaster.app.repository.log;
 
 import cn.reghao.autodop.dmaster.app.entity.log.AppStatus;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 /**
@@ -8,6 +10,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
  * @date 2020-01-21 14:53:03
  */
 public interface AppStatusRepository extends JpaRepository<AppStatus, Long> {
+    Page<AppStatus> findAllByEnv(String env, Pageable pageable);
+
     /**
      * 找到唯一的 AppStatus 对象
      *

+ 80 - 47
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusService.java

@@ -6,8 +6,6 @@ import cn.reghao.autodop.common.amqp.RpcResult;
 import cn.reghao.autodop.common.dagent.app.api.AppOps;
 import cn.reghao.autodop.common.dagent.app.api.data.AppIdArgs;
 import cn.reghao.autodop.common.dagent.app.api.data.log.AppLogArgs;
-import cn.reghao.autodop.common.dagent.app.api.data.log.LogLevel;
-import cn.reghao.autodop.common.dagent.app.api.data.log.LogType;
 import cn.reghao.autodop.common.utils.serializer.JsonArrayDeserializer;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
@@ -16,7 +14,7 @@ import cn.reghao.autodop.dmaster.app.entity.deploy.DeployConfig;
 import cn.reghao.autodop.dmaster.app.entity.deploy.LogConfig;
 import cn.reghao.autodop.dmaster.app.entity.log.AppStatus;
 import cn.reghao.autodop.dmaster.app.service.crud.log.AppStatusCrudService;
-import cn.reghao.autodop.dmaster.app.vo.LogFile;
+import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import org.springframework.stereotype.Service;
 
@@ -45,66 +43,56 @@ public class AppStatusService {
     }
 
     public PageList<AppStatus> deployedAppStatus(int page, int size, String env) {
-        PageList<AppStatus> pageList = statusCrudService.getByPage(page, size);
+        PageList<AppStatus> pageList = statusCrudService.getByPage(page, size, env);
         return pageList;
     }
 
     /**
-     * 日志文件列表
+     * 获取应用日志文件列表
      *
      * @param
      * @return
      * @date 2021-02-26 上午8:23
      */
-    public List<String> logFiles(String appId, String logType, String logLevel, String machineId) {
+    public List<LogFile> logFiles(String appId, String machineId) {
         AppOrchestration app = cache.findByAppId(appId);
-        List<LogConfig> list = app.getRunningConfig().getLogConfigs();
-        List<LogConfig> configs = list.stream()
-                .filter(logConfig -> logConfig.getType().equals(logType))
-                .filter(logConfig -> logConfig.getLevel().equals(logLevel))
+        List<cn.reghao.autodop.common.dagent.app.api.data.log.LogConfig> logConfigs = app.getRunningConfig().getLogConfigs()
+                .stream()
+                .filter(LogConfig::getIsDir)
+                .map(logConfig -> new cn.reghao.autodop.common.dagent.app.api.data.log.LogConfig(
+                        logConfig.getType(), logConfig.getLevel(), logConfig.getLogPath()))
                 .collect(Collectors.toList());
 
-        if (configs.size() != 1) {
-            return null;
-        }
-
-        LogConfig logConfig = configs.get(0);
-        List<MqMessage> mqMessages = new ArrayList<>();
-        for (DeployConfig deployConfig : app.getDeployConfigs()) {
-            if (deployConfig.getMachineId().equals(machineId)) {
-                AppLogArgs appLogArgs = new AppLogArgs();
-                appLogArgs.setPackerType(deployConfig.getPackerType());
-                appLogArgs.setAppId(appId);
-                appLogArgs.setLogType(logType);
-                appLogArgs.setLogLevel(logLevel);
-                appLogArgs.setLogFile(false);
-                appLogArgs.setLogPath(logConfig.getLogPath());
-
-                MqMessage mqMessage = new MqMessage();
-                mqMessage.setMachineId(deployConfig.getMachineId());
-                mqMessage.setSendTime(System.currentTimeMillis());
-                mqMessage.setRpc(true);
-                mqMessage.setType(MessageType.appType.name());
-                mqMessage.setOps(AppOps.appLogOps.name());
-                mqMessage.setPayload(JsonConverter.objectToJson(appLogArgs));
-
-                mqMessages.add(mqMessage);
-                break;
-            }
-        }
-
-        RpcResult rpcResult = callService.call(mqMessages.get(0));
+        List<DeployConfig> deployConfigs = app.getDeployConfigs().stream()
+                .filter(deployConfig -> deployConfig.getMachineId().equals(machineId))
+                .collect(Collectors.toList());
+        DeployConfig deployConfig = deployConfigs.get(0);
+
+        AppLogArgs appLogArgs = new AppLogArgs();
+        appLogArgs.setPackerType(deployConfig.getPackerType());
+        appLogArgs.setAppId(appId);
+        appLogArgs.setLogConfigs(logConfigs);
+
+        MqMessage mqMessage = new MqMessage();
+        mqMessage.setMachineId(deployConfig.getMachineId());
+        mqMessage.setSendTime(System.currentTimeMillis());
+        mqMessage.setRpc(true);
+        mqMessage.setType(MessageType.appType.name());
+        mqMessage.setOps(AppOps.appLogOps.name());
+        mqMessage.setPayload(JsonConverter.objectToJson(appLogArgs));
+
+        RpcResult rpcResult = callService.call(mqMessage);
         if (rpcResult.getStatusCode() == 0) {
             String result = rpcResult.getResult();
-            JsonArrayDeserializer<String> deserializer = new JsonArrayDeserializer<>();
-            return deserializer.fromJsonArray(result, String.class);
+            JsonArrayDeserializer<LogFile> deserializer = new JsonArrayDeserializer<>();
+            List<LogFile> logFiles = deserializer.fromJsonArray(result, LogFile.class);
+            return logFiles;
         }
-
-        return new ArrayList<>();
+        return null;
     }
 
     /**
-     * 日志内容
+     * 获取应用日志内容
      *
      * @param
      * @return
@@ -112,6 +100,47 @@ public class AppStatusService {
      */
     public List<String> logContent(String appId, String logType, String logLevel, String machineId, String logFile) {
         AppOrchestration app = cache.findByAppId(appId);
+        List<LogConfig> logConfigs = app.getRunningConfig().getLogConfigs().stream()
+                .filter(logConfig -> logConfig.getType().equals(logType) && logConfig.getLevel().equals(logLevel))
+                .collect(Collectors.toList());
+        LogConfig logConfig = logConfigs.get(0);
+
+        cn.reghao.autodop.common.dagent.app.api.data.log.LogConfig config =
+                new cn.reghao.autodop.common.dagent.app.api.data.log.LogConfig(
+                        logType, logLevel, logConfig.getLogPath() + "/" + logFile, false);
+        List<cn.reghao.autodop.common.dagent.app.api.data.log.LogConfig> configs = new ArrayList<>();
+        configs.add(config);
+
+        List<DeployConfig> deployConfigs = app.getDeployConfigs().stream()
+                .filter(deployConfig -> deployConfig.getMachineId().equals(machineId))
+                .collect(Collectors.toList());
+        DeployConfig deployConfig = deployConfigs.get(0);
+
+        AppLogArgs appLogArgs = new AppLogArgs();
+        appLogArgs.setPackerType(deployConfig.getPackerType());
+        appLogArgs.setAppId(appId);
+        appLogArgs.setLogConfigs(configs);
+
+        MqMessage mqMessage = new MqMessage();
+        mqMessage.setMachineId(deployConfig.getMachineId());
+        mqMessage.setSendTime(System.currentTimeMillis());
+        mqMessage.setRpc(true);
+        mqMessage.setType(MessageType.appType.name());
+        mqMessage.setOps(AppOps.appLogOps.name());
+        mqMessage.setPayload(JsonConverter.objectToJson(appLogArgs));
+
+        RpcResult rpcResult = callService.call(mqMessage);
+        if (rpcResult.getStatusCode() == 0) {
+            String result = rpcResult.getResult();
+            JsonArrayDeserializer<String> deserializer = new JsonArrayDeserializer<>();
+            List<String> logContent = deserializer.fromJsonArray(result, String.class);
+            return logContent;
+        }
+        return null;
+    }
+
+    private List<String> getAppLog(String appId, String logType, String logLevel, String machineId, String logFile) {
+        /*AppOrchestration app = cache.findByAppId(appId);
         List<LogConfig> list = app.getRunningConfig().getLogConfigs();
         List<LogConfig> configs = list.stream()
                 .filter(logConfig -> logConfig.getType().equals(logType))
@@ -132,7 +161,11 @@ public class AppStatusService {
                 appLogArgs.setLogType(logType);
                 appLogArgs.setLogLevel(logLevel);
                 appLogArgs.setLogFile(true);
-                appLogArgs.setLogPath(logConfig.getLogPath() + "/" + logFile);
+                if (logFile != null) {
+                    appLogArgs.setLogPath(logConfig.getLogPath() + "/" + logFile);
+                } else {
+                    appLogArgs.setLogPath(logConfig.getLogPath());
+                }
 
                 MqMessage mqMessage = new MqMessage();
                 mqMessage.setMachineId(deployConfig.getMachineId());
@@ -153,7 +186,7 @@ public class AppStatusService {
             JsonArrayDeserializer<String> deserializer = new JsonArrayDeserializer<>();
             return deserializer.fromJsonArray(result, String.class);
         }
-
+*/
         return new ArrayList<>();
     }
 

+ 4 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/crud/log/AppStatusCrudService.java

@@ -10,6 +10,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -43,11 +44,12 @@ public class AppStatusCrudService implements CrudOps<AppStatus> {
         // 默认按更新时间倒序
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Page<AppStatus> page1 = statusRepository.findAll(pageRequest);
+
+        Page<AppStatus> page1 = statusRepository.findAllByEnv(env, pageRequest);
         PageList<AppStatus> pageList = new PageList<>();
         pageList.setTotalSize(page1.getTotalElements());
         pageList.setTotalPages(page1.getTotalPages());
-        pageList.setList(page1.getContent());
+        pageList.setList(page1.getContent().stream().map(AppStatus::vo).collect(Collectors.toList()));
         return pageList;
     }