Ver código fonte

处理应用状态接口

reghao 5 anos atrás
pai
commit
20f8ac1104

+ 20 - 17
common/src/main/java/cn/reghao/autodop/common/dockerc/Docker.java

@@ -360,30 +360,33 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
      * @date 2020-05-19 上午10:26
      */
     @Override
-    public List<String> logs(String containerId, String logLevel) throws DockerException {
-        LogLevel level = LogLevel.valueOf(logLevel);
-        String uri = DockerApi.logsGet.replace("{}", containerId);
+    public List<String> consoleLogs(String containerId, String logLevel) throws DockerException {
         try {
+            String uri = DockerApi.logsGet.replace("{}", containerId);
             FullHttpResponse response;
-            switch (level) {
+            switch (LogLevel.valueOf(logLevel)) {
                 case info:
-                    // stdout
-                    String params = "?stdout=true&tail=500";
+                    // 标准输出
+                    String params = "?stdout=true&tail=1000";
                     response = client.get(uri + params, null);
                     if (response != null) {
                         String stdout = response.content().toString(StandardCharsets.UTF_8);
                         return Arrays.asList(stdout.split(System.lineSeparator()));
+                    } else {
+                        throw new DockerException("请求 " + uri + " 的响应是 NULL...");
                     }
                 case error:
-                    // stderr
-                    params = "?stderr=true&tail=500";
+                    // 标准错误
+                    params = "?stderr=true&tail=1000";
                     response = client.get(uri + params, null);
                     if (response != null) {
                         String stderr = response.content().toString(StandardCharsets.UTF_8);
                         return Arrays.asList(stderr.split(System.lineSeparator()));
+                    } else {
+                        throw new DockerException("请求 " + uri + " 的响应是 NULL...");
                     }
                 default:
-                    throw new DockerException("日志级别不存在...");
+                    throw new DockerException("日志级别 " + logLevel + " 不存在");
             }
         } catch (IOException | InterruptedException e) {
             throw new DockerException(ExceptionUtil.errorMsg(e));
@@ -398,17 +401,14 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
      * @date 2020-05-19 上午10:26
      */
     @Override
-    public List<String> fileLog(String containerId, String logLevel, String logPath) throws DockerException {
-        LogLevel level = LogLevel.valueOf(logLevel);
-        switch (level) {
+    public List<String> fileLogs(String containerId, String logLevel, String logPath) throws DockerException {
+        switch (LogLevel.valueOf(logLevel)) {
             case info:
-                // info 日志目录
                 return appLog(containerId, logPath);
             case error:
-                // error 日志目录
                 return appLog(containerId, logPath);
             default:
-                throw new DockerException(level + " 日志类型不存在");
+                throw new DockerException("日志级别 " + logLevel + " 不存在");
         }
     }
 
@@ -449,8 +449,11 @@ public class Docker implements ImageOps, ContainerOps, AutoCloseable {
 
     public static void main(String[] args) {
         try (Docker docker = new Docker()) {
-            String id = docker.getIdByName("registry");
-            ContainerInfo containerInfo = docker.inspectContainer(id);
+            String appId = "user-dev";
+            String containerId = docker.getIdByName(appId);
+            String logLevel = LogLevel.info.name();
+            List<String> logs = docker.consoleLogs(containerId, logLevel);
+            System.out.println();
         } catch (DockerException e) {
             e.printStackTrace();
         }

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

@@ -43,7 +43,7 @@ public interface ContainerOps {
      * @return
      * @date 2020-05-19 上午10:57
      */
-    List<String> logs(String containerId, String logLevel) throws DockerException;
+    List<String> consoleLogs(String containerId, String logLevel) throws DockerException;
 
     /**
      * 文件日志
@@ -52,7 +52,7 @@ public interface ContainerOps {
      * @return
      * @date 2020-05-19 上午10:58
      */
-    List<String> fileLog(String containerId, String logLevel, String logPath) throws DockerException;
+    List<String> fileLogs(String containerId, String logLevel, String logPath) throws DockerException;
 
     /**
      * 查看容器的详细信息

+ 28 - 18
dagent/src/main/java/cn/reghao/autodop/dagent/app/App.java

@@ -12,6 +12,8 @@ import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2021-02-22 16:20:22
@@ -42,37 +44,45 @@ public class App {
                 appStatus = zipAppServiceImpl.deploy(appDeployArgs);
                 break;
             default:
-                return RpcResult.error("没有这种打包类型...");
+                return RpcResult.error("打包类型 " + appDeployArgs.getPackerType() + " 不存在");
         }
         return RpcResult.success(JsonConverter.objectToJson(appStatus));
     }
 
     public RpcResult status(String payload) {
         AppIdArgs appIdArgs = (AppIdArgs) JsonConverter.jsonToObject(payload, AppIdArgs.class);
+        AppStatus appStatus;
         switch (PackerType.valueOf(appIdArgs.getPackerType())) {
             case docker:
+                appStatus = dockerAppServiceImpl.status(appIdArgs.getAppId());
                 break;
             case zip:
+                appStatus = zipAppServiceImpl.status(appIdArgs.getAppId());
                 break;
             default:
-                return RpcResult.error("没有这种打包类型...");
+                return RpcResult.error("打包类型 " + appIdArgs.getPackerType() + " 不存在");
         }
-
-        return RpcResult.success("ok");
+        return RpcResult.success(JsonConverter.objectToJson(appStatus));
     }
 
     public RpcResult log(String payload) {
-        AppLogArgs appLogArgs = (AppLogArgs) JsonConverter.jsonToObject(payload, AppLogArgs.class);
-        switch (PackerType.valueOf(appLogArgs.getPackerType())) {
-            case docker:
-                break;
-            case zip:
-                break;
-            default:
-                return RpcResult.error("没有这种打包类型...");
+        try {
+            AppLogArgs appLogArgs = (AppLogArgs) JsonConverter.jsonToObject(payload, AppLogArgs.class);
+            List<String> logs;
+            switch (PackerType.valueOf(appLogArgs.getPackerType())) {
+                case docker:
+                    logs = dockerAppServiceImpl.log(appLogArgs);
+                    break;
+                case zip:
+                    logs = zipAppServiceImpl.log(appLogArgs);
+                    break;
+                default:
+                    return RpcResult.error("打包类型 " + appLogArgs.getPackerType() + " 不存在");
+            }
+            return RpcResult.success(JsonConverter.objectToJson(logs));
+        } catch (Exception e) {
+            return RpcResult.fail(ExceptionUtil.errorMsg(e));
         }
-
-        return RpcResult.success("ok");
     }
 
     public RpcResult restart(String payload) {
@@ -83,7 +93,7 @@ public class App {
             case zip:
                 break;
             default:
-                return RpcResult.error("没有这种打包类型...");
+                return RpcResult.error("打包类型 " + appIdArgs.getPackerType() + " 不存在");
         }
 
         return RpcResult.success("ok");
@@ -97,7 +107,7 @@ public class App {
             case zip:
                 break;
             default:
-                return RpcResult.error("没有这种打包类型...");
+                return RpcResult.error("打包类型 " + appIdArgs.getPackerType() + " 不存在");
         }
 
         return RpcResult.success("ok");
@@ -111,7 +121,7 @@ public class App {
             case zip:
                 break;
             default:
-                return RpcResult.error("没有这种打包类型...");
+                return RpcResult.error("打包类型 " + appIdArgs.getPackerType() + " 不存在");
         }
 
         return RpcResult.success("ok");
@@ -125,7 +135,7 @@ public class App {
             case zip:
                 break;
             default:
-                return RpcResult.error("没有这种打包类型...");
+                return RpcResult.error("打包类型 " + appIdArgs.getPackerType() + " 不存在");
         }
 
         return RpcResult.success("ok");

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

@@ -14,7 +14,7 @@ import java.util.List;
 public interface AppService {
     AppStatus deploy(AppDeployArgs appDeployArgs) throws DockerException;
     AppStatus status(String appId);
-    List<String> log(AppLogArgs appLogArgs);
+    List<String> log(AppLogArgs appLogArgs) throws DockerException;
     void restart(String appId);
     void stop(String appId);
     void start(String appId);

+ 47 - 9
dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppServiceImpl.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.LogType;
 import cn.reghao.autodop.common.dagent.machine.Machine;
 import cn.reghao.autodop.common.dockerc.Docker;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
@@ -41,33 +42,70 @@ public class DockerAppServiceImpl implements AppService {
     }
 
     @Override
-    public List<String> log(AppLogArgs appLogArgs) {
-        List<String> list = new ArrayList<>();
-        return list;
+    public List<String> log(AppLogArgs appLogArgs) throws DockerException {
+        try (Docker docker = new Docker()) {
+            String appId = appLogArgs.getAppId();
+            String containerId = docker.getIdByName(appId);
+
+            String logType = appLogArgs.getLogType();
+            String logLevel = appLogArgs.getLogLevel();
+            switch (LogType.valueOf(logType)) {
+                case console:
+                    return docker.consoleLogs(containerId, logLevel);
+                case file:
+                    return docker.fileLogs(containerId, logLevel, "");
+                default:
+                    throw new DockerException("日志类型 " + logType + " 不存在");
+            }
+        }
     }
 
     @Override
     public AppStatus status(String appId) {
+        try (Docker docker = new Docker()) {
+            String containerId = docker.getIdByName(appId);
+            ContainerInfo containerInfo = docker.inspectContainer(containerId);
+
+            AppStatus appStatus = new AppStatus();
+        } catch (DockerException e) {
+            e.printStackTrace();
+        }
         return null;
     }
 
     @Override
-    public void start(String appId) {
-
+    public void restart(String appId)  {
+        try (Docker docker = new Docker()) {
+            docker.getIdByName(appId);
+        } catch (DockerException e) {
+            e.printStackTrace();
+        }
     }
 
     @Override
     public void stop(String appId)  {
-
+        try (Docker docker = new Docker()) {
+            docker.getIdByName(appId);
+        } catch (DockerException e) {
+            e.printStackTrace();
+        }
     }
 
     @Override
-    public void restart(String appId)  {
-
+    public void start(String appId) {
+        try (Docker docker = new Docker()) {
+            docker.getIdByName(appId);
+        } catch (DockerException e) {
+            e.printStackTrace();
+        }
     }
 
     @Override
     public void run(String appId, String commitId) {
-
+        try (Docker docker = new Docker()) {
+            docker.getIdByName(appId);
+        } catch (DockerException e) {
+            e.printStackTrace();
+        }
     }
 }

+ 2 - 2
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.fileLog(containerId, logLevel, logPath);
+                    return docker.fileLogs(containerId, logLevel, logPath);
                 default:
                     throw new Exception(type + " 日志类型不存在");
             }
@@ -42,7 +42,7 @@ public class DockerAppLogServiceImpl implements AppLogService {
             LogType type = LogType.valueOf(logType);
             switch (type) {
                 case console:
-                    return docker.logs(containerId, logLevel);
+                    return docker.consoleLogs(containerId, logLevel);
                 case file:
                     String rootfs = docker.rootfs(containerId);
                     // 返回最近的 500 行日志

+ 9 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/StatusController.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
+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 io.swagger.annotations.Api;
@@ -25,13 +26,20 @@ public class StatusController {
     }
 
     @ApiOperation(value = "获取已部署应用的运行状态")
-    @GetMapping("/status")
+    @GetMapping("/list")
     public ResponseEntity<String> status(@RequestParam("env") String env,
                                          @RequestParam("page") int page,
                                          @RequestParam("size") int size) throws DockerException {
+
         return ResponseEntity.ok().body(WebResult.success("pageList"));
     }
 
+    @GetMapping("/{appId}")
+    public ResponseEntity<String> appStatus(@PathVariable("appId") String appId) {
+        AppStatus appStatus = statusService.appStatus(appId);
+        return ResponseEntity.ok().body(WebResult.success(appStatus));
+    }
+
     @ApiOperation(value = "获取指定主机上应用的所有日志文件")
     @GetMapping("/logs")
     public ResponseEntity<String> appLogs(@RequestParam("appId") String appId,

+ 62 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusService.java

@@ -6,10 +6,15 @@ import cn.reghao.autodop.common.amqp.RabbitProducer;
 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.AppLog;
+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.JsonConverter;
 import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
 import cn.reghao.autodop.dmaster.app.entity.config.orchestration.AppOrchestration;
 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;
@@ -44,7 +49,7 @@ public class AppStatusService {
         return null;
     }
     
-    private AppStatus appStatus(String appId) {
+    public AppStatus appStatus(String appId) {
         AppOrchestration app = cache.findByAppId(appId);
 
         List<MqMessage> mqMessages = new ArrayList<>();
@@ -63,16 +68,70 @@ public class AppStatusService {
 
         Map<String, RpcResult> rpcResultMap = callService.call(mqMessages);
         rpcResultMap.forEach((machineId, rpcResult) -> {
+            if (rpcResult.getStatusCode() == 0) {
+
+            }
         });
 
         return null;
     }
 
-    public List<LogFile> logFiles() {
+    public List<LogFile> logFiles(String appId) {
+        AppOrchestration app = cache.findByAppId(appId);
+        List<LogConfig> logs = app.getRunningConfig().getLogs();
+
+        List<MqMessage> mqMessages = new ArrayList<>();
+        for (DeployConfig deployConfig : app.getDeployConfigs()) {
+            AppLogArgs appLogArgs = new AppLogArgs();
+            appLogArgs.setPackerType(deployConfig.getPackerType());
+            appLogArgs.setAppId(appId);
+            appLogArgs.setLogType(LogType.console.name());
+            appLogArgs.setLogLevel(LogLevel.info.name());
+
+            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);
+        }
+
+        Map<String, RpcResult> rpcResultMap = callService.call(mqMessages);
+        rpcResultMap.forEach((machineId, rpcResult) -> {
+            if (rpcResult.getStatusCode() == 0) {
+
+            }
+        });
+
         return null;
     }
 
-    public List<String> logContent() {
+    public List<String> logContent(String appId) {
+        AppOrchestration app = cache.findByAppId(appId);
+
+        List<MqMessage> mqMessages = new ArrayList<>();
+        for (DeployConfig deployConfig : app.getDeployConfigs()) {
+            AppIdArgs appIdArgs = new AppIdArgs(app.getBuildConfig().getPackerConfig().getType(), appId);
+
+            MqMessage mqMessage = new MqMessage();
+            mqMessage.setMachineId(deployConfig.getMachineId());
+            mqMessage.setSendTime(System.currentTimeMillis());
+            mqMessage.setRpc(true);
+            mqMessage.setType(MessageType.appType.name());
+            mqMessage.setOps(AppOps.appStatusOps.name());
+            mqMessage.setPayload(JsonConverter.objectToJson(appIdArgs));
+            mqMessages.add(mqMessage);
+        }
+
+        Map<String, RpcResult> rpcResultMap = callService.call(mqMessages);
+        rpcResultMap.forEach((machineId, rpcResult) -> {
+            if (rpcResult.getStatusCode() == 0) {
+
+            }
+        });
+
         return null;
     }