Files
ProjectOctopus/agent-go/executor/AppFunction.go

812 lines
18 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package executor
import (
"os/exec"
"time"
)
type OctopusFunc interface {
Command(baseFuncName string, funcArgs ...string) []string
Exec(baseFuncName string, funcArgs ...string) (bool, []string)
Deploy(appFuncName string, funcArgs ...string) (bool, []string)
}
type AppFunc interface {
Deploy(appFuncName string, funcArgs ...string) (bool, []string)
}
var AppExecuteErrorLogPrefix = []string{"App指令执行错误 => "}
func (op *AgentOsOperator) Deploy(appFuncName string, funcArgs ...string) (bool, []string) {
var resultOK bool
var result []string
switch appFuncName {
case "deployMinio":
resultOK, result = op.deployMinio(funcArgs)
break
case "deployNFS":
resultOK, result = op.deployNFS(funcArgs)
break
case "testNFS":
resultOK, result = op.testNFS(funcArgs)
break
case "deployPVC":
resultOK, result = op.deployPVC(funcArgs)
break
case "deploySC":
break
case "deployMySQL":
resultOK, result = op.deployMySQL(funcArgs)
break
case "checkMySQL":
resultOK, result = op.checkMySQL(funcArgs)
break
case "deployMiddlewares":
resultOK, result = op.deployMiddlewares(funcArgs)
break
case "deployRedis":
resultOK, result = op.deployRedis(funcArgs)
break
case "deployIngress":
resultOK, result = op.deployIngress(funcArgs)
break
case "deployFront":
resultOK, result = op.deployFront(funcArgs)
break
case "initMinio":
resultOK, result = op.initMinio(funcArgs)
break
case "deploySRS":
resultOK, result = op.deploySRS(funcArgs)
break
case "deployGDR":
resultOK, result = op.deployGDR(funcArgs)
break
case "modifyNacos":
resultOK, result = op.modifyNacos(funcArgs)
break
case "deployBackend":
resultOK, result = op.deployBackend(funcArgs)
break
default:
op.ok(funcArgs)
}
// debug
log.DebugF("app deploy of %s result is %v", appFuncName, result)
return resultOK, result
}
// 通用命令脚本
// BaseCommandExists 判定命令是否存在
func BaseCommandExists(commandName string) bool {
cmd := exec.Command("command", "-v", commandName)
err := cmd.Run()
if err != nil {
log.DebugF("指令 %s 不存在", commandName)
return false
} else {
return true
}
}
// BaseCommandExistsBatch 判定批量命令是否存在
func BaseCommandExistsBatch(commandNameList []string) (bool, string) {
for _, commandName := range commandNameList {
if !BaseCommandExists(commandName) {
return false, commandName
}
}
return true, ""
}
// BaseReplace 基础替换命令
func BaseReplace(filename string, origin string, replace string) bool {
cmd := exec.Command("sed", "-i", "s/"+origin+"/"+replace+"/g", filename)
err := cmd.Run()
if err != nil {
log.DebugF("文件 %s [%s] => [%s] 错误!", filename, origin, replace)
return false
} else {
return true
}
}
func BaseFileExists(filename string) bool {
cmd := exec.Command("test", "-f", filename)
err := cmd.Run()
if err != nil {
log.DebugF("文件 %s 不存在!", filename)
return false
} else {
return true
}
}
// 通用命令脚本
func (op *AgentOsOperator) deployMinio(funcArgs []string) (bool, []string) {
minioTemplateFileName := "minio-docker-compose.yaml"
result := append(AppExecuteErrorLogPrefix, "部署MINIO")
// 逻辑为接收执行,但是会报错
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"docker-compose",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 磁盘空间足够
// 目录存在
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + minioTemplateFileName,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(minioTemplateFileName, "A1C2IP", funcArgs[0]) {
result = append(result, "替换IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"docker-compose",
"-f",
minioTemplateFileName,
"up",
"-d",
}) {
result = append(result, "启动minio失败!")
return false, result
}
// 成功启动
return true, []string{
"MINIO安装成功!",
"输入如下命令查看启动情况: ",
"docker-compose logs minio1",
}
}
func (op *AgentOsOperator) deployNFS(funcArgs []string) (bool, []string) {
nfsTemplateFile := "nfs-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署NFS")
nfsDataPath := "/nfsdata"
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 创建目录修改权限
if !PureResultSingleExecuteBatch([][]string{
{"mkdir", "-p", nfsDataPath},
{"chmod", "777", nfsDataPath},
}) {
result = append(result, "目录不存在", nfsDataPath)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + nfsTemplateFile,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(nfsTemplateFile, "N1C2IP", funcArgs[0]) {
result = append(result, "替换IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
nfsTemplateFile,
}) {
result = append(result, "启动NFS失败!")
return false, result
}
// 成功启动
return true, []string{
"NFS部署成功!",
}
}
func (op *AgentOsOperator) testNFS(funcArgs []string) (bool, []string) {
nfsTemplateFile := "nfs-test-template.yaml"
result := append(AppExecuteErrorLogPrefix, "测试NFS部署")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + nfsTemplateFile,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(nfsTemplateFile, "N1C2IP", funcArgs[0]) {
result = append(result, "替换IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
nfsTemplateFile,
}) {
result = append(result, "启动NFS-TEST失败!")
return false, result
}
// 测试文件是否存在
if !BaseFileExists("/nfsdata/test-pod*/NFS-CREATE-SUCCESS") {
result = append(result, "NFS 测试功能 异常!!")
return false, result
}
// 成功启动
return true, []string{
"NFS 测试功能正常!",
}
}
func (op *AgentOsOperator) deployPVC(funcArgs []string) (bool, []string) {
pvcTemplateFile := "pvc-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署PVC")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + pvcTemplateFile,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(pvcTemplateFile, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
pvcTemplateFile,
}) {
result = append(result, "创建PVC失败!")
return false, result
}
// 成功启动
return true, []string{
"PVC部署成功",
}
}
func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) {
mysqlTemplate := "mysql-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 MySQL !")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + mysqlTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(mysqlTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(mysqlTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
mysqlTemplate,
}) {
result = append(result, "创建MySQL失败!")
return false, result
}
// 成功启动
return true, []string{
"MySQL部署成功",
}
}
func (op *AgentOsOperator) checkMySQL(funcArgs []string) (bool, []string) {
// 设置超时时间为 120 秒
timeout := time.After(120 * time.Second)
for {
select {
case <-timeout:
msg := "检查MySQL时间Pod的运行状态超时! 120s"
log.Error(msg)
return false, []string{msg}
default:
msg := "MySQL Pod已经启动!"
if CheckPodStatus("helm-mysql-0", funcArgs[0]) {
log.Info(msg)
return true, []string{msg}
}
}
// 每隔5s检查一次
time.Sleep(5 * time.Second)
}
}
func (op *AgentOsOperator) deployMiddlewares(funcArgs []string) (bool, []string) {
middlewaresTemplate := "middleware-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 所有的中间件 !")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + middlewaresTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(middlewaresTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(middlewaresTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
middlewaresTemplate,
}) {
result = append(result, "创建 中间件 失败!")
return false, result
}
// 成功启动
return true, []string{
"中间件部署成功!",
}
}
func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) {
redisTemplate := "redis-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 redis !")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + redisTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(redisTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(redisTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
redisTemplate,
}) {
result = append(result, "创建 Redis 失败!")
return false, result
}
// 成功启动
return true, []string{
"Redis 部署成功!",
}
}
func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) {
ingressTemplate := "ingress-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 Ingress !")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + ingressTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(ingressTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(ingressTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
if !BaseReplace(ingressTemplate, "A1C1JS", funcArgs[1]) {
result = append(result, "替换A1C1JS信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
ingressTemplate,
}) {
result = append(result, "创建 Ingress 失败!")
return false, result
}
// 成功启动
return true, []string{
"Ingress 部署成功!",
}
}
func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) {
fontTemplate := "front-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 前端服务 !")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + fontTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(fontTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(fontTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
fontTemplate,
}) {
result = append(result, "创建 前端服务 失败!")
return false, result
}
// 成功启动
return true, []string{
"前端服务 部署成功!",
}
}
func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) {
initMinioTemplate := "minio-init.sh"
result := append(AppExecuteErrorLogPrefix, "进行MINIO初始化服务 !")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + initMinioTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(initMinioTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(initMinioTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
if !BaseReplace(initMinioTemplate, "M2D2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
initMinioTemplate,
}) {
result = append(result, "MINIO 初始化 失败!")
return false, result
}
// 成功启动
return true, []string{
"MINIO 初始化 成功!",
}
}
func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) {
srsTemplate := "srs-template.yaml"
result := append(AppExecuteErrorLogPrefix, "开始部署SRS服务")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + srsTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(srsTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(srsTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
if !BaseReplace(srsTemplate, "A1C1JS", funcArgs[1]) {
result = append(result, "替换A1C1JS信息")
return false, result
}
if !BaseReplace(srsTemplate, "M2D2IP", funcArgs[1]) {
result = append(result, "替换M2D2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
srsTemplate,
}) {
result = append(result, "部署 SRS 失败!")
return false, result
}
// 成功启动
return true, []string{
"部署 SRS 成功!",
}
}
func (op *AgentOsOperator) deployGDR(funcArgs []string) (bool, []string) {
return true, []string{
"请手动进行GDR的部署工作",
}
}
func (op *AgentOsOperator) modifyNacos(funcArgs []string) (bool, []string) {
log.Info("请开始进行Nacos的配置修改工作")
log.Info("请开始进行Nacos的配置修改工作")
after := time.After(120 * time.Second)
<-after
msg := "等待Nacos的配置结束"
log.Info(msg)
return true, []string{msg}
}
func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) {
backendTemplate := "backend-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 后端 服务 !")
// 环境判定
commandExist, commandName := BaseCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + backendTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
}
// 根据参数 A1C2IP 替换
if !BaseReplace(backendTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BaseReplace(backendTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
backendTemplate,
}) {
result = append(result, "创建 后端服务 失败!")
return false, result
}
// 成功启动
return true, []string{
"后端服务 部署成功!",
}
}