diff --git a/pom.xml b/pom.xml index 8a2e9af..59c32cd 100644 --- a/pom.xml +++ b/pom.xml @@ -135,6 +135,11 @@ httpclient5 5.4.2 + + com.cmcc.hy + gzs-common-oss + 0.1.6-SNAPSHOT + @@ -236,6 +241,10 @@ org.springframework spring-tx + + com.cmcc.hy + gzs-common-oss + com.squareup.okhttp3 mockwebserver diff --git a/src/main/java/com/cmcc/magent/config/CommonConfigure.java b/src/main/java/com/cmcc/magent/config/CommonConfigure.java index 45aa19c..f0f6fc8 100644 --- a/src/main/java/com/cmcc/magent/config/CommonConfigure.java +++ b/src/main/java/com/cmcc/magent/config/CommonConfigure.java @@ -114,6 +114,14 @@ public class CommonConfigure { */ private String dataRootDirectory; + /** + * 中间件部署任务执行模式。 + *

+ * 是否异步部署中间件,接收到部署任务后尽快返回。 + *

+ */ + private boolean asyncDeployment; + /** * 设置全局静态变量的值。 * diff --git a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java index ca3ebf4..86c1690 100644 --- a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java +++ b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java @@ -25,6 +25,7 @@ import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicReference; /** @@ -52,6 +53,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { @Resource private CommonConfigure commonConfigure; + /** + * 根据命令获取对应的文件名。 + * + * @param cmd 中间件管理命令 + * @return 对应的文件名 + */ private String getFilenameForCommand(MiddlewareManagerCommand cmd) { return switch (cmd) { case COMMAND_DEPLOYMENT -> DEPLOYMENT_FILENAME; @@ -64,6 +71,14 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { }; } + /** + * 将命令写入 Shell 脚本文件。 + * + * @param workDir 工作目录 + * @param cmd 中间件管理命令 + * @param command 命令内容 + * @return 返回一个 MulReturnType 对象,其中包含写入结果的错误码和文件名 + */ private MulReturnType writeCommandToShellScript(String workDir, MiddlewareManagerCommand cmd, String command) { String filename = getFilenameForCommand(cmd); try { @@ -79,6 +94,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { } } + /** + * 创建工作目录。 + * + * @param workDir 工作目录路径 + * @return 如果创建成功, 返回 true;否则返回 false + */ private boolean createWorkDirectory(String workDir) { Path path = Paths.get(workDir); if (!Files.exists(path)) { @@ -91,6 +112,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { return true; } + /** + * 处理命令参数,并更新 MiddlewareData 对象。 + * + * @param data 要更新的 MiddlewareData 对象 + * @param command 命令参数映射 + */ private void processCommands(MiddlewareData data, Map command) { command.forEach((cmd, param) -> { switch (cmd) { @@ -119,6 +146,13 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { }); } + /** + * 保存命令到 Shell 脚本文件。 + * + * @param workDir 工作目录 + * @param command 命令参数映射 + * @return 返回一个 MulReturnType 对象,其中包含保存结果的错误码和文件名 + */ private MulReturnType saveCommands(String workDir, Map command) { AtomicReference errorCode = new AtomicReference<>(ErrorCode.ERR_OK); AtomicReference filename = new AtomicReference<>(""); @@ -133,11 +167,18 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { return new MulReturnType<>(errorCode.get(), filename.get()); } + /** + * 下载并校验配置文件。 + * + * @param workDir 工作目录 + * @param configFiles 配置文件列表 + * @return 返回一个 MulReturnType 对象,其中包含下载和校验结果的错误码和相关信息 + */ private MulReturnType downloadAndValidateConfigFiles(String workDir, List configFiles) { for (RemoteFileDetails file : configFiles) { try { - String saveName = Paths.get(workDir + File.separator + file.getFileName()).toString(); - FileDownloader dl = new FileDownloader(file.getUrl(), saveName, new FileDownloader.SimpleDownloadCallback() { + String saveName = Paths.get(workDir + File.separator + file.getFileName()).toString(); + FileDownloader dl = new FileDownloader(file.getUrl(), saveName, new FileDownloader.SimpleDownloadCallback() { @Override public void onStart(String url) { } @@ -163,13 +204,19 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { return new MulReturnType<>(ErrorCode.ERR_OK, ""); } + /** + * 执行命令。 + * + * @param workDir 工作目录 + * @param command 命令参数映射 + */ private void runCommand(String workDir, Map command) { TreeMap sorted = new TreeMap<>(command); for (MiddlewareManagerCommand cmd : sorted.keySet()) { String filename = getFilenameForCommand(cmd); List ret = ExecutingCommand.runNative("/bin/bash", workDir + File.separator + filename); - log.info("Run {} Command: {}", MiddlewareManagerCommand.COMMAND_DEPLOYMENT.getStringValue(), ret); + log.info("Run {} Command: {}", MiddlewareManagerCommand.COMMAND_DEPLOYMENT.getEnumString(), ret); } } @@ -208,17 +255,37 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { return new MulReturnType<>(ErrorCode.ERR_SYSTEMEXCEPTION, ""); } - err = saveCommands(workDir, command); - if (err.getFirstParam() != ErrorCode.ERR_OK) { - return err; - } - err = downloadAndValidateConfigFiles(workDir, configFiles); - if (err.getFirstParam() != ErrorCode.ERR_OK) { - return err; - } + if (!commonConfigure.isAsyncDeployment()) { + err = saveCommands(workDir, command); + if (err.getFirstParam() != ErrorCode.ERR_OK) { + return err; + } - runCommand(workDir, command); + err = downloadAndValidateConfigFiles(workDir, configFiles); + if (err.getFirstParam() != ErrorCode.ERR_OK) { + return err; + } + + runCommand(workDir, command); + } else { + CompletableFuture.runAsync(() -> { + log.info("++++ Task {} Start Running...", data.getUid()); + MulReturnType error = saveCommands(workDir, command); + if (error.getFirstParam() != ErrorCode.ERR_OK) { + log.error("---- Finish Task {} Because Of Save Command Error: {}", data.getUid(), error.getSecondParam()); + return; + } + + error = downloadAndValidateConfigFiles(workDir, configFiles); + if (error.getFirstParam() != ErrorCode.ERR_OK) { + log.error("---- Finish Task {} Because Of Download Config File Error: {}", data.getUid(), error.getSecondParam()); + return; + } + runCommand(workDir, command); + log.info("---- Task {} Finished", data.getUid()); + }); + } return new MulReturnType<>(ErrorCode.ERR_OK, data.getUid()); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ea86353..f6be05a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -28,6 +28,14 @@ spring.jackson.deserialization.fail-on-unknown-properties=false # Swagger-UI Custom Path springdoc.swagger-ui.path=/swagger-ui.html +# OSS Configuration +#gzs.common.oss.enabled=true +gzs.common.oss.config.default.accessKey=accessKey +gzs.common.oss.config.default.secretKey=secretKey +gzs.common.oss.config.default.endpoint=endpoint +gzs.common.oss.config.default.accessUrl=accessUrl +gzs.common.oss.config.default.bucketName=bucketName + # common : common.token-expired-of-seconds=600 common.allow-passwd-retry-times=3 @@ -35,6 +43,7 @@ common.show-sql-command=false common.res-sampling-msencond=10000 common.locale=zh_CN common.data-root-directory=/opt/middleware-agent/data +common.async-deployment=true # protocol: protocol.check-timestamp=true diff --git a/src/main/resources/db/agent.db b/src/main/resources/db/agent.db index cd2083b..e6ce5f2 100644 Binary files a/src/main/resources/db/agent.db and b/src/main/resources/db/agent.db differ