@@ -0,0 +1,804 @@
package executor
import (
"os/exec"
"time"
)
type AppFunc interface {
Deploy ( appFuncName string , funcArgs ... string ) [ ] 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 {
"后端服务 部署成功!" ,
}
}