diff --git a/agent-go/executor/BasicFunction.go b/agent-go/executor/BasicFunction.go index 9e3672a..68314dc 100644 --- a/agent-go/executor/BasicFunction.go +++ b/agent-go/executor/BasicFunction.go @@ -34,6 +34,59 @@ func BasicCommandExistsBatch(commandNameList []string) (bool, string) { return true, "" } +// BasicCommandExistByPath 根据路径判定 命令是否存在 +func BasicCommandExistByPath(commandName string) bool { + + if BasicFileExistInFolder(commandName, "/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "bin", "/snap/bin") { + return true + } + + return false +} + +// BasicFileExistInFolder 查询fileName是否存在于目录folderList中,如果存在返回true,不存在返回false +func BasicFileExistInFolder(fileName string, folderList ...string) bool { + + for _, folder := range folderList { + if BasicFolderExists(folder) { + // is folder + ok, _ := PipelineCommandExecutor([][]string{ + { + "ls", + folder, + }, + { + "grep", + "-c", + fileName, + }, + }) + if ok { + return true + } + + } else { + // it's a file + ok, _ := PipelineCommandExecutor([][]string{ + { + "echo", + folder, + }, + { + "grep", + "-c", + fileName, + }, + }) + if ok { + return true + } + } + } + + return false +} + // BasicReplace 基础替换命令 func BasicReplace(filename string, origin string, replace string) bool { @@ -78,6 +131,18 @@ func BasicFileExistAndNotNull(filename string) bool { } } +func BasicFolderExists(folderName string) bool { + + cmd := exec.Command("test", "-d", folderName) + err := cmd.Run() + if err != nil { + log.DebugF("目录 %s 不存在!", folderName) + return false + } else { + return true + } +} + func BasicCreateFolder(folderName string) bool { cmd := exec.Command("test", "-d", folderName) err := cmd.Run() @@ -115,30 +180,9 @@ func BasicSystemdShutdown(serviceName string) (ok bool, resultLog []string) { serviceName = serviceName + ".service" } - systemdFilePath := []string{ - "/lib/systemd/system/", - "/etc/systemd/system", - } - // 检查是否存在 - var existService bool - - for _, s := range systemdFilePath { - resultOk, _ := PipelineCommandExecutor( - [][]string{ - { - "ls", - s, - }, - { - "grep", - serviceName, - }, - }) - if resultOk { - existService = true - } - } + existService := BasicFileExistInFolder(serviceName, "/lib/systemd/system/", + "/etc/systemd/system") if !existService { return true, []string{ serviceName, @@ -175,30 +219,9 @@ func BasicSystemdUp(serviceName string) (ok bool, resultLog []string) { if !strings.HasSuffix(serviceName, ".service") { serviceName = serviceName + ".service" } - - systemdFilePath := []string{ - "/lib/systemd/system/", - "/etc/systemd/system", - } - // 检查是否存在 - var existService bool - - for _, s := range systemdFilePath { - resultOk, _ := PipelineCommandExecutor( - [][]string{ - {"ls", - s, - }, - { - "grep", - serviceName, - }, - }) - if resultOk { - existService = true - } - } + existService := BasicFileExistInFolder(serviceName, "/lib/systemd/system/", + "/etc/systemd/system") if !existService { return true, []string{ serviceName, @@ -269,7 +292,7 @@ func BasicDownloadFile(downloadUrl, desFile string) (downloadOk bool, resultLog // wget or curl download var ok bool - if BasicCommandExists("wget") { + if BasicCommandExistByPath("wget") { ok, resultLog = AllCommandExecutor([]string{ "wget", @@ -280,7 +303,7 @@ func BasicDownloadFile(downloadUrl, desFile string) (downloadOk bool, resultLog desFile, }) - } else if BasicCommandExists("curl") { + } else if BasicCommandExistByPath("curl") { ok, resultLog = AllCommandExecutor([]string{ "curl", "-o", diff --git a/agent-go/executor/CommandExecutor.go b/agent-go/executor/CommandExecutor.go index 42fc823..04ca149 100644 --- a/agent-go/executor/CommandExecutor.go +++ b/agent-go/executor/CommandExecutor.go @@ -30,7 +30,7 @@ func Execute(em *ExecutionMessage) (bool, []string) { var resultLog []string var err error ok := true - executionContent := em.ExecutionType + "==" + strings.Join(em.FuncContent, " - ") + executionContent := em.ExecutionType + " == " + strings.Join(em.FuncContent, " - ") log.DebugF("em message is => %#v", em) diff --git a/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java b/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java index b24f658..05642a9 100644 --- a/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java +++ b/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java @@ -1,12 +1,21 @@ package io.wdd.func.auto.beans; +/** + * 参数固定顺序为 A1C2IP SUPREME N1C2IP A1C1IP A1C1JS M2D2IP KIMMY + */ public enum AppFunctionEnum { + DEPLOY_RKE( "DEPLOY_RKE", "部署rke的组件,准备环境" ), + DEPLOY_K8S_NAMESPACE( + "DEPLOY_K8S_NAMESPACE", + "部署k8s的业务应用的namespace, 参数A1C2IP, SUPREME" + ), + DEPLOY_K8S_DASHBOARD( "DEPLOY_K8S_DASHBOARD", "部署kubernetes dashboard, 参数A1C2IP" @@ -19,7 +28,7 @@ public enum AppFunctionEnum { DEPLOY_NFS( "DEPLOY_NFS", - "部署nfs+storage_class, 参数为N1C2IP" + "部署nfs+storage_class, 参数为A1C2IP, SUPREME, N1C2IP" ), @@ -30,12 +39,12 @@ public enum AppFunctionEnum { DEPLOY_K8S_PVC( "DEPLOY_K8S_PVC", - "部署所需要的pvc后端存储,参数 SUPREME" + "部署所需要的pvc后端存储,参数 A1C2IP, SUPREME" ), DEPLOY_K8S_MYSQL( "DEPLOY_K8S_MYSQL", - "部署k8s mysql, 参数 SUPREME, A1C2IP" + "部署k8s mysql, 参数 A1C2IP, SUPREME" ), LOAD_MYSQL_INIT_SCRIPT( @@ -45,17 +54,17 @@ public enum AppFunctionEnum { DEPLOY_K8S_REDIS( "DEPLOY_K8S_REDIS", - "部署k8s redis, 参数 SUPREME, A1C2IP " + "部署k8s redis, 参数 A1C2IP, SUPREME " ), DEPLOY_K8S_MIDDLEWARES( "DEPLOY_K8S_MIDDLEWARES", - "部署k8s mongo nacos emqxs, 参数 SUPREME, A1C2IP " + "部署k8s mongo nacos emqxs, 参数 A1C2IP, SUPREME " ), INIT_MINIO( "INIT_MINIO", - "初始化MINIO, c参数SUPREME A1C2IP M2D2IP" + "初始化MINIO, 参数 A1C2IP, SUPREME, M2D2IP" ), DEPLOY_K8S_SRS( diff --git a/server/src/main/java/io/wdd/func/auto/beans/ProjectDeployContext.java b/server/src/main/java/io/wdd/func/auto/beans/ProjectDeployContext.java index a30a75f..a15ed3a 100644 --- a/server/src/main/java/io/wdd/func/auto/beans/ProjectDeployContext.java +++ b/server/src/main/java/io/wdd/func/auto/beans/ProjectDeployContext.java @@ -17,24 +17,23 @@ import java.util.List; @ApiModel("项目实施阶段的上下文实体类") public class ProjectDeployContext { - Long projectId; - - ServerInfoPO masterNode; - - List agentNodeList; - - boolean masterBaseProcedureAccomplished; - - boolean agentBaseProcedureAccomplished; - + // harbor public static final ArrayList PROJECT_NEED_TO_BY_SYNCHRONIZED = new ArrayList<>( List.of( "rancher", "cmii" ) ); + Long projectId; + ServerInfoPO masterNode; + List agentNodeList; + // base + boolean masterBaseProcedureAccomplished; + boolean agentBaseProcedureAccomplished; boolean rancherHarborSynchronized; boolean cmiiHarborSynchronized; String currentSynchronizingProject; + // app + } diff --git a/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java b/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java new file mode 100644 index 0000000..a76e66a --- /dev/null +++ b/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java @@ -0,0 +1,140 @@ +package io.wdd.func.auto.service; + +import io.wdd.func.auto.beans.AppFunctionEnum; +import io.wdd.func.auto.beans.ProjectDeployContext; +import io.wdd.server.beans.po.ProjectInfoPO; +import io.wdd.server.coreService.CoreProjectService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service +@Slf4j +public class AppFuncScheduler { + + @Resource + FuncService funcService; + + @Resource + CoreProjectService coreProjectService; + + /** + * 参数固定顺序为 A1C2IP SUPREME N1C2IP A1C1IP A1C1JS M2D2IP KIMMY + * + * @param projectDeployContext + * @param projectInfoPO + * @return + */ + private static ArrayList buildAppFuncArgs(ProjectDeployContext projectDeployContext, ProjectInfoPO projectInfoPO) { + + ArrayList appFuncArgs = new ArrayList<>(); + appFuncArgs.add(projectDeployContext + .getMasterNode() + .getServerIpInV4()); + appFuncArgs.add(projectInfoPO.getProjectNamespace()); + appFuncArgs.add(projectDeployContext + .getMasterNode() + .getServerIpInV4()); + appFuncArgs.add(projectDeployContext + .getMasterNode() + .getServerIpPbV4()); + appFuncArgs.add(projectInfoPO.getProjectWebServicePort()); + appFuncArgs.add("M2D2IP"); + appFuncArgs.add(projectInfoPO.getProjectVersion()); + + return appFuncArgs; + } + + public boolean runProcedure(ProjectDeployContext projectDeployContext) { + + // before run + // check base requirement + beforeRunProcedure(projectDeployContext); + + + // during run + doRunProcedure(projectDeployContext); + + + // after run + afterRunProcedure(projectDeployContext); + + + return true; + } + + private void afterRunProcedure(ProjectDeployContext projectDeployContext) { + + // 检查是否安装完成, 对安装环境进行判定 + log.debug("afterRunProcedure complete!"); + } + + private void doRunProcedure(ProjectDeployContext projectDeployContext) { + + // 执行 基础功能施工的内容 + String masterTopicName = projectDeployContext + .getMasterNode() + .getTopicName(); + + ProjectInfoPO projectInfoPO = coreProjectService.projectGetOne(projectDeployContext.getProjectId()); + if (ObjectUtils.isEmpty(projectInfoPO)) { + log.error( + "project id of [{}] wrong ! cant find project !", + projectDeployContext.getProjectId() + ); + } + + ArrayList appFuncArgs = buildAppFuncArgs( + projectDeployContext, + projectInfoPO + ); + + List appFunctionEnumList = List.of( + AppFunctionEnum.DEPLOY_RKE, + AppFunctionEnum.DEPLOY_K8S_DASHBOARD + ); + + + for (AppFunctionEnum appFunctionEnum : appFunctionEnumList) { + + // rebuild + appFuncArgs.add( + 0, + appFunctionEnum.getAppOpname() + ); + + boolean appFuncJudge = funcService.callAppFuncAndJudge( + masterTopicName, + appFunctionEnum, + appFuncArgs + ); + + if (!appFuncJudge) { + log.error( + "app func of {} execute error !", + appFunctionEnum.getAppOpname() + ); + return; + } + + } + + } + + private void beforeRunProcedure(ProjectDeployContext projectDeployContext) { + + // 检查是否符合规定 + + // 检查每一个Agent是否能够连通,调用命令返回结果 + + // 打印施工信息 + + log.debug("beforeRunProcedure complete!"); + + } + +} diff --git a/server/src/main/java/io/wdd/func/auto/service/BaseFuncScheduler.java b/server/src/main/java/io/wdd/func/auto/service/BaseFuncScheduler.java index 42a8317..fac3b4a 100644 --- a/server/src/main/java/io/wdd/func/auto/service/BaseFuncScheduler.java +++ b/server/src/main/java/io/wdd/func/auto/service/BaseFuncScheduler.java @@ -93,6 +93,7 @@ public class BaseFuncScheduler { // BaseFunctionEnum.INSTALL_DEFAULT_SSH_KEY, // BaseFunctionEnum.INSTALL_HARBOR, // BaseFunctionEnum.INSTALL_ZSH + ); diff --git a/server/src/main/java/io/wdd/func/auto/service/FuncService.java b/server/src/main/java/io/wdd/func/auto/service/FuncService.java index fc9bbed..d833230 100644 --- a/server/src/main/java/io/wdd/func/auto/service/FuncService.java +++ b/server/src/main/java/io/wdd/func/auto/service/FuncService.java @@ -1,6 +1,7 @@ package io.wdd.func.auto.service; +import io.wdd.func.auto.beans.AppFunctionEnum; import io.wdd.func.auto.beans.BaseFunctionEnum; import io.wdd.func.auto.beans.HarborFunctionEnum; @@ -25,5 +26,7 @@ public interface FuncService { */ boolean callBaseFuncAndJudge(String agentTopicName, BaseFunctionEnum baseFunctionEnum, List funcArgs, boolean durationTask); + boolean callAppFuncAndJudge(String agentTopicName, AppFunctionEnum appFunctionEnum, List funcArgs); + boolean callHarborFuncAndJudge(String agentTopicName, HarborFunctionEnum harborFunctionEnum, ArrayList funcArgs); } diff --git a/server/src/main/java/io/wdd/func/auto/service/FuncServiceImpl.java b/server/src/main/java/io/wdd/func/auto/service/FuncServiceImpl.java index fb252aa..5cbdae6 100644 --- a/server/src/main/java/io/wdd/func/auto/service/FuncServiceImpl.java +++ b/server/src/main/java/io/wdd/func/auto/service/FuncServiceImpl.java @@ -1,5 +1,6 @@ package io.wdd.func.auto.service; +import io.wdd.func.auto.beans.AppFunctionEnum; import io.wdd.func.auto.beans.BaseFunctionEnum; import io.wdd.func.auto.beans.HarborFunctionEnum; import io.wdd.rpc.execute.ExecutionMessageType; @@ -68,6 +69,20 @@ public class FuncServiceImpl implements FuncService { return JudgeSyncBaseCommandResult(syncResultLog); } + @Override + public boolean callAppFuncAndJudge(String agentTopicName, AppFunctionEnum appFunctionEnum, List funcArgs) { + List syncResultLog = syncCallFunction( + agentTopicName, + ExecutionMessageType.APP, + funcArgs, + true + ); + + boolean appFuncResult = JudgeSyncBaseCommandResult(syncResultLog); + + return appFuncResult; + } + @Override public boolean callHarborFuncAndJudge(String agentTopicName, HarborFunctionEnum harborFunctionEnum, ArrayList funcArgs) { diff --git a/server/src/main/java/io/wdd/server/beans/po/ProjectInfoPO.java b/server/src/main/java/io/wdd/server/beans/po/ProjectInfoPO.java index 19e1393..1f982b1 100644 --- a/server/src/main/java/io/wdd/server/beans/po/ProjectInfoPO.java +++ b/server/src/main/java/io/wdd/server/beans/po/ProjectInfoPO.java @@ -1,12 +1,10 @@ package io.wdd.server.beans.po; + import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import java.io.Serializable; import java.time.LocalDateTime; @@ -16,11 +14,7 @@ import java.time.LocalDateTime; */ @TableName(value = "project_info") @Data -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder(toBuilder = true) public class ProjectInfoPO implements Serializable { - @TableField(exist = false) private static final long serialVersionUID = 1L; /** @@ -39,10 +33,15 @@ public class ProjectInfoPO implements Serializable { @TableField(value = "project_province") private String projectProvince; /** - * + * 部署的版本 */ @TableField(value = "project_version") private String projectVersion; + /** + * 部署的公网端口 + */ + @TableField(value = "project_web_service_port") + private String projectWebServicePort; /** * */ diff --git a/server/src/main/java/io/wdd/server/beans/vo/ProjectServerVO.java b/server/src/main/java/io/wdd/server/beans/vo/ProjectServerVO.java index 8eeb0e5..d34a19a 100644 --- a/server/src/main/java/io/wdd/server/beans/vo/ProjectServerVO.java +++ b/server/src/main/java/io/wdd/server/beans/vo/ProjectServerVO.java @@ -6,14 +6,12 @@ import io.wdd.server.beans.po.ServerInfoPO; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor -@SuperBuilder(toBuilder = true) @ApiModel("Project-Server绑定关系实体类") public class ProjectServerVO extends ProjectInfoPO { diff --git a/server/src/main/java/io/wdd/server/mapper/ProjectInfoMapper.java b/server/src/main/java/io/wdd/server/mapper/ProjectInfoMapper.java index 5ec13cf..6c8577c 100644 --- a/server/src/main/java/io/wdd/server/mapper/ProjectInfoMapper.java +++ b/server/src/main/java/io/wdd/server/mapper/ProjectInfoMapper.java @@ -6,7 +6,7 @@ import io.wdd.server.beans.po.ProjectInfoPO; /** * @author wdd * @description 针对表【project_info】的数据库操作Mapper - * @createDate 2023-10-09 11:12:02 + * @createDate 2023-11-20 16:47:25 * @Entity io.wdd.server.beans.po.ProjectInfoPO */ public interface ProjectInfoMapper extends BaseMapper { diff --git a/server/src/main/java/io/wdd/server/service/ProjectInfoService.java b/server/src/main/java/io/wdd/server/service/ProjectInfoService.java index 00c4c60..9434daf 100644 --- a/server/src/main/java/io/wdd/server/service/ProjectInfoService.java +++ b/server/src/main/java/io/wdd/server/service/ProjectInfoService.java @@ -6,7 +6,7 @@ import io.wdd.server.beans.po.ProjectInfoPO; /** * @author wdd * @description 针对表【project_info】的数据库操作Service - * @createDate 2023-10-09 11:12:02 + * @createDate 2023-11-20 16:47:25 */ public interface ProjectInfoService extends IService { diff --git a/server/src/main/java/io/wdd/server/service/impl/ProjectInfoServiceImpl.java b/server/src/main/java/io/wdd/server/service/impl/ProjectInfoServiceImpl.java index f8b6c60..44b763a 100644 --- a/server/src/main/java/io/wdd/server/service/impl/ProjectInfoServiceImpl.java +++ b/server/src/main/java/io/wdd/server/service/impl/ProjectInfoServiceImpl.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; /** * @author wdd * @description 针对表【project_info】的数据库操作Service实现 - * @createDate 2023-10-09 11:12:02 + * @createDate 2023-11-20 16:47:25 */ @Service public class ProjectInfoServiceImpl extends ServiceImpl diff --git a/server/src/main/resources/mapper/ProjectInfoMapper.xml b/server/src/main/resources/mapper/ProjectInfoMapper.xml index bf6a4ca..89bae5c 100644 --- a/server/src/main/resources/mapper/ProjectInfoMapper.xml +++ b/server/src/main/resources/mapper/ProjectInfoMapper.xml @@ -9,6 +9,7 @@ + @@ -24,9 +25,9 @@ project_id ,project_name,project_province, - project_version,project_namespace,deploy_net_env, - deploy_hardware_env,create_time,update_time, - expired_time,trade_person_name,pre_sale_person_name, - is_offline_map,is_ai_deploy + project_version,project_web_service_port,project_namespace, + deploy_net_env,deploy_hardware_env,create_time, + update_time,expired_time,trade_person_name, + pre_sale_person_name,is_offline_map,is_ai_deploy diff --git a/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java b/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java index 05bc2aa..99e1e6d 100644 --- a/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java +++ b/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java @@ -1,6 +1,7 @@ package io.wdd.server.func; import io.wdd.func.auto.beans.ProjectDeployContext; +import io.wdd.func.auto.service.AppFuncScheduler; import io.wdd.func.auto.service.BaseFuncScheduler; import io.wdd.func.auto.service.HarborFuncScheduler; import io.wdd.server.beans.po.ServerInfoPO; @@ -20,6 +21,9 @@ public class TestBaseFuncScheduler { @Resource HarborFuncScheduler harborFuncScheduler; + @Resource + AppFuncScheduler appFuncScheduler; + @Resource CoreServerService serverService; @@ -51,7 +55,9 @@ public class TestBaseFuncScheduler { // baseFuncScheduler.runProcedure(projectDeployContext); - harborFuncScheduler.runProcedure(projectDeployContext); +// harborFuncScheduler.runProcedure(projectDeployContext); + + appFuncScheduler.runProcedure(projectDeployContext); } }