[ Agent ] [ App ] - ingress front backend srs

This commit is contained in:
zeaslity
2023-12-06 09:53:21 +08:00
parent 386812625e
commit 46c9668ce6
7 changed files with 415 additions and 337 deletions

View File

@@ -3,12 +3,9 @@ package executor
import ( import (
"fmt" "fmt"
"net" "net"
"os"
"path/filepath"
"regexp" "regexp"
"sort" "sort"
"strconv" "strconv"
"strings"
"time" "time"
) )
@@ -59,9 +56,9 @@ func (op *AgentOsOperator) Deploy(appFuncName string, funcArgs ...string) (bool,
case "DEPLOY_K8S_MYSQL": case "DEPLOY_K8S_MYSQL":
resultOK, result = op.deployMySQL(funcArgs) resultOK, result = op.deployMySQL(funcArgs)
break break
case "LOAD_MYSQL_INIT_SCRIPT": //case "LOAD_MYSQL_INIT_SCRIPT":
resultOK, result = op.loadMysqlInitScript(funcArgs) // resultOK, result = op.loadMysqlInitScript(funcArgs)
break // break
case "checkMySQL": case "checkMySQL":
resultOK, result = op.checkMySQL(funcArgs) resultOK, result = op.checkMySQL(funcArgs)
break break
@@ -499,95 +496,95 @@ func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) {
} }
} }
func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) { //func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) {
//
folder, i := CheckAppInstallFolder() // folder, i := CheckAppInstallFolder()
if !folder { // if !folder {
return false, i // return false, i
} // }
//
// download offline sql list // // download offline sql list
if len(funcArgs) <= 7 { // if len(funcArgs) <= 7 {
return false, []string{ // return false, []string{
"[loadMysqlInitScript]- MySQL初始化参数有误 无法进行初始化", // "[loadMysqlInitScript]- MySQL初始化参数有误 无法进行初始化",
} // }
} // }
//
jackeyLove := funcArgs[7] // jackeyLove := funcArgs[7]
if !strings.HasSuffix(jackeyLove, "tar") { // if !strings.HasSuffix(jackeyLove, "tar") {
return false, []string{ // return false, []string{
"[loadMysqlInitScript]- jackeyLove 有误!", // "[loadMysqlInitScript]- jackeyLove 有误!",
} // }
} // }
log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove) // log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove)
//
jackeyLoveLocalPrefix := "/root/wdd/jackeylove/" // jackeyLoveLocalPrefix := "/root/wdd/jackeylove/"
PureResultSingleExecute([]string{ // PureResultSingleExecute([]string{
"rm", // "rm",
"-f", // "-f",
jackeyLoveLocalPrefix, // jackeyLoveLocalPrefix,
}) // })
BasicCreateFolder(jackeyLoveLocalPrefix) // BasicCreateFolder(jackeyLoveLocalPrefix)
//
jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0] // jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0]
ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove) // ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove)
if !ok { // if !ok {
return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!") // return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!")
} // }
//
// unzip // // unzip
if !PureResultSingleExecute([]string{ // if !PureResultSingleExecute([]string{
"tar", // "tar",
"-vxf", // "-vxf",
jackeyLoveLocalPrefix + jackeyLove, // jackeyLoveLocalPrefix + jackeyLove,
"-C", // "-C",
jackeyLoveLocalPrefix, // jackeyLoveLocalPrefix,
}) { // }) {
return false, []string{ // return false, []string{
"[loadMysqlInitScript]- jackeyLove unzip error ", // "[loadMysqlInitScript]- jackeyLove unzip error ",
} // }
} // }
//
// list all sql file and sort and convert to []string // // list all sql file and sort and convert to []string
files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder) // files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder)
if err != nil { // if err != nil {
return false, []string{ // return false, []string{
"[loadMysqlInitScript]- read unzipped jackeylove error ", // "[loadMysqlInitScript]- read unzipped jackeylove error ",
} // }
} // }
//
var jackeyLoveFileList []string // var jackeyLoveFileList []string
for _, file := range files { // for _, file := range files {
if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" { // if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" {
jackeyLoveFileList = append(jackeyLoveFileList, file.Name()) // jackeyLoveFileList = append(jackeyLoveFileList, file.Name())
} // }
} // }
//
// sort for numeric order // // sort for numeric order
sortFileNames(jackeyLoveFileList) // sortFileNames(jackeyLoveFileList)
var jackeyLoveFileAbsolutePath []string // var jackeyLoveFileAbsolutePath []string
for _, jackeyLoveFile := range jackeyLoveFileList { // for _, jackeyLoveFile := range jackeyLoveFileList {
jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile) // jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile)
} // }
//
log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath) // log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath)
//
// dispatch mysql execution command // // dispatch mysql execution command
jackeyLoveIP := funcArgs[0] // jackeyLoveIP := funcArgs[0]
parseIP := net.ParseIP(jackeyLoveIP) // parseIP := net.ParseIP(jackeyLoveIP)
if parseIP == nil { // if parseIP == nil {
return false, []string{ // return false, []string{
"[loadMysqlInitScript]- ip config error ", // "[loadMysqlInitScript]- ip config error ",
} // }
} // }
load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath) // load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath)
if !load { // if !load {
return false, result // return false, result
} // }
//
return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !") // return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !")
//
} //}
func sortFileNames(fileNames []string) { func sortFileNames(fileNames []string) {
re := regexp.MustCompile(`(\d+)_`) re := regexp.MustCompile(`(\d+)_`)
@@ -741,6 +738,8 @@ func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) {
} }
} }
// todo should I check ingress exists ?
// 成功启动 // 成功启动
return true, []string{ return true, []string{
"Redis 部署成功!", "Redis 部署成功!",
@@ -750,15 +749,12 @@ func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) {
ingressTemplate := "ingress-template.yaml" ingressTemplate := "k8s-ingress-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 Ingress !") result := append(AppExecuteErrorLogPrefix, "部署 Ingress !")
// 环境判定 // 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{ if !BasicCommandExistByPath("kubectl") {
"kubectl", result = append(result, "命令不存在", "kubectl")
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result return false, result
} }
folder, i := CheckAppInstallFolder() folder, i := CheckAppInstallFolder()
@@ -767,37 +763,38 @@ func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) {
} }
// 下载模板文件 // 下载模板文件
if !PureResultSingleExecute([]string{ k8sIngressYamlFile := "/root/wdd/install/k8s-ingress.yaml"
"wget", ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+ingressTemplate, k8sIngressYamlFile)
"-q", if !ok {
op.OssOfflinePrefix + "/" + ingressTemplate, return false, resultLog
}) {
result = append(result, "下载模板文件")
return false, result
} }
// 根据参数 A1C2IP 替换 // 根据参数 A1C2IP 替换
if !BasicReplace(ingressTemplate, "SUPREME", funcArgs[0]) { parseIP := net.ParseIP(funcArgs[0])
result = append(result, "替换SUPREME信息") if parseIP == nil {
return false, result return false, append(result, "ip args error !")
} }
if !BasicReplace(ingressTemplate, "A1C2IP", funcArgs[1]) { if !BasicReplace(k8sIngressYamlFile, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息") result = append(result, "替换A1C2IP信息")
return false, result return false, result
} }
if !BasicReplace(ingressTemplate, "A1C1JS", funcArgs[1]) { if !BasicReplace(k8sIngressYamlFile, "SUPREME", funcArgs[1]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BasicReplace(k8sIngressYamlFile, "A1C1JS", funcArgs[4]) {
result = append(result, "替换A1C1JS信息") result = append(result, "替换A1C1JS信息")
return false, result return false, result
} }
if !BasicReplace(k8sIngressYamlFile, "KIMMY", funcArgs[6]) {
result = append(result, "替换KIMMY信息")
return false, result
}
// 启动服务 // 启动服务
if !PureResultSingleExecute([]string{ exec, strings := KubectlApplyExec(k8sIngressYamlFile)
"kubectl", if !exec {
"apply", return false, append(result, strings...)
"-f",
ingressTemplate,
}) {
result = append(result, "创建 Ingress 失败!")
return false, result
} }
// 成功启动 // 成功启动
@@ -808,15 +805,12 @@ func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) {
fontTemplate := "front-template.yaml" fontTemplate := "k8s-front-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 前端服务 !") result := append(AppExecuteErrorLogPrefix, "部署 前端服务 !")
// 环境判定 // 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{ if !BasicCommandExistByPath("kubectl") {
"kubectl", result = append(result, "命令不存在", "kubectl")
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result return false, result
} }
folder, i := CheckAppInstallFolder() folder, i := CheckAppInstallFolder()
@@ -825,35 +819,38 @@ func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) {
} }
// 下载模板文件 // 下载模板文件
if !PureResultSingleExecute([]string{ k8sFrontYamlFilePath := "/root/wdd/install/k8s-front.yaml"
"wget", ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+fontTemplate, k8sFrontYamlFilePath)
"-q", if !ok {
op.OssOfflinePrefix + "/" + fontTemplate, return false, resultLog
}) { }
result = append(result, "下载模板文件")
// 根据参数 A1C2IP 替换
parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sFrontYamlFilePath, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息")
return false, result return false, result
} }
// 根据参数 A1C2IP 替换 if !BasicReplace(k8sFrontYamlFilePath, "SUPREME", funcArgs[1]) {
if !BasicReplace(fontTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息") result = append(result, "替换SUPREME信息")
return false, result return false, result
} }
if !BasicReplace(fontTemplate, "A1C2IP", funcArgs[1]) { if !BasicReplace(k8sFrontYamlFilePath, "KIMMY", funcArgs[6]) {
result = append(result, "替换A1C2IP信息") result = append(result, "替换KIMMY信息")
return false, result return false, result
} }
// 启动服务 // 启动服务
if !PureResultSingleExecute([]string{ exec, strings := KubectlApplyExec(k8sFrontYamlFilePath)
"kubectl", if !exec {
"apply", return false, append(result, strings...)
"-f",
fontTemplate,
}) {
result = append(result, "创建 前端服务 失败!")
return false, result
} }
// check all front end pod exits!
// 成功启动 // 成功启动
return true, []string{ return true, []string{
"前端服务 部署成功!", "前端服务 部署成功!",
@@ -893,12 +890,20 @@ func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) {
result = append(result, "替换SUPREME信息") result = append(result, "替换SUPREME信息")
return false, result return false, result
} }
if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[1]) { parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息") result = append(result, "替换A1C2IP信息")
return false, result return false, result
} }
if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[1]) { parseIP = net.ParseIP(funcArgs[5])
result = append(result, "替换A1C2IP信息") if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[5]) {
result = append(result, "替换M2D2IP信息")
return false, result return false, result
} }
@@ -922,15 +927,12 @@ func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) {
srsTemplate := "srs-template.yaml" srsTemplate := "k8s-srs-template.yaml"
result := append(AppExecuteErrorLogPrefix, "开始部署SRS服务") result := append(AppExecuteErrorLogPrefix, "开始部署SRS服务")
// 环境判定 // 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{ if !BasicCommandExistByPath("kubectl") {
"kubectl", result = append(result, "命令不存在", "kubectl")
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result return false, result
} }
folder, i := CheckAppInstallFolder() folder, i := CheckAppInstallFolder()
@@ -939,43 +941,51 @@ func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) {
} }
// 下载模板文件 // 下载模板文件
if !PureResultSingleExecute([]string{ k8sSRSYamlFilePath := "/root/wdd/install/k8s-srs.yaml"
"wget", ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+srsTemplate, k8sSRSYamlFilePath)
"-q", if !ok {
op.OssOfflinePrefix + "/" + srsTemplate, return false, resultLog
}) {
result = append(result, "下载模板文件")
return false, result
} }
// 根据参数 A1C2IP 替换 // 根据参数 A1C2IP 替换
if !BasicReplace(srsTemplate, "SUPREME", funcArgs[0]) { if !BasicReplace(k8sSRSYamlFilePath, "SUPREME", funcArgs[1]) {
result = append(result, "替换SUPREME信息") result = append(result, "替换SUPREME信息")
return false, result return false, result
} }
if !BasicReplace(srsTemplate, "A1C2IP", funcArgs[1]) { parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sSRSYamlFilePath, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息") result = append(result, "替换A1C2IP信息")
return false, result return false, result
} }
if !BasicReplace(srsTemplate, "A1C1JS", funcArgs[1]) { if !BasicReplace(k8sSRSYamlFilePath, "A1C1JS", funcArgs[4]) {
result = append(result, "替换A1C1JS信息") result = append(result, "替换A1C1JS信息")
return false, result return false, result
} }
if !BasicReplace(srsTemplate, "M2D2IP", funcArgs[1]) { parseIP = net.ParseIP(funcArgs[5])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sSRSYamlFilePath, "M2D2IP", funcArgs[5]) {
result = append(result, "替换M2D2IP信息") result = append(result, "替换M2D2IP信息")
return false, result return false, result
} }
// 启动服务 if !BasicReplace(k8sSRSYamlFilePath, "KIMMY", funcArgs[6]) {
if !PureResultSingleExecute([]string{ result = append(result, "替换KIMMY信息")
"kubectl",
"apply",
"-f",
srsTemplate,
}) {
result = append(result, "部署 SRS 失败!")
return false, result return false, result
} }
// 启动服务
exec, strings := KubectlApplyExec(k8sSRSYamlFilePath)
if !exec {
return false, append(result, strings...)
}
// check pod ok
// 成功启动 // 成功启动
return true, []string{ return true, []string{
"部署 SRS 成功!", "部署 SRS 成功!",
@@ -1008,48 +1018,52 @@ func (op *AgentOsOperator) modifyNacos(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) {
backendTemplate := "backend-template.yaml" backendTemplate := "k8s-backend-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 后端 服务 !") result := append(AppExecuteErrorLogPrefix, "部署 后端 服务 !")
// 环境判定 // 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{ if !BasicCommandExistByPath("kubectl") {
"kubectl", result = append(result, "命令不存在", "kubectl")
})
if !commandExist {
result = append(result, "命令不存在", commandName)
return false, result return false, result
} }
folder, i := CheckAppInstallFolder()
if !folder {
return false, i
}
// 下载模板文件 // 下载模板文件
if !PureResultSingleExecute([]string{ k8sBackendYamlFilePath := "/root/wdd/install/k8s-backend.yaml"
"wget", ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+backendTemplate, k8sBackendYamlFilePath)
"-q", if !ok {
op.OssOfflinePrefix + "/" + backendTemplate, return false, resultLog
}) { }
result = append(result, "下载模板文件")
// 根据参数 A1C2IP 替换
parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sBackendYamlFilePath, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息")
return false, result return false, result
} }
// 根据参数 A1C2IP 替换 if !BasicReplace(k8sBackendYamlFilePath, "SUPREME", funcArgs[1]) {
if !BasicReplace(backendTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息") result = append(result, "替换SUPREME信息")
return false, result return false, result
} }
if !BasicReplace(backendTemplate, "A1C2IP", funcArgs[1]) { if !BasicReplace(k8sBackendYamlFilePath, "KIMMY", funcArgs[6]) {
result = append(result, "替换A1C2IP信息") result = append(result, "替换KIMMY信息")
return false, result return false, result
} }
// 启动服务 // 启动服务
if !PureResultSingleExecute([]string{ exec, strings := KubectlApplyExec(k8sBackendYamlFilePath)
"kubectl", if !exec {
"apply", return false, append(result, strings...)
"-f",
backendTemplate,
}) {
result = append(result, "创建 后端服务 失败!")
return false, result
} }
// check all front end pod exits!
// 成功启动 // 成功启动
return true, []string{ return true, []string{
"后端服务 部署成功!", "后端服务 部署成功!",

View File

@@ -222,6 +222,7 @@ func BasicPrettyPrint(resultOk bool, resultLog []string) {
} }
for _, s := range resultLog { for _, s := range resultLog {
fmt.Println(s) fmt.Println(s)
fmt.Println()
} }
} }

View File

@@ -1,127 +1,183 @@
package executor package executor
import ( //import (
"bufio" // _ "github.com/go-sql-driver/mysql"
"database/sql" //)
"fmt"
_ "github.com/go-sql-driver/mysql"
"os"
"strings"
)
func MysqlSqlFileLoad(jackeyLoveIp string, jackeyLoveFileList []string) (bool, []string) { //func MysqlSqlFileLoad(jackeyLoveIp string, jackeyLoveFileList []string) (bool, []string) {
//
// dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/"
// db, err := sql.Open("mysql", dsn)
// if err != nil {
// errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error())
// log.Error(errConnect)
// return false, []string{
// errConnect,
// }
// }
// defer db.Close()
//
// // 确保数据库连接是有效的
// if err := db.Ping(); err != nil {
// errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !"
// log.Error(errConnect)
// return false, []string{
// errConnect,
// }
// }
//
// for _, jackeyLoveFile := range jackeyLoveFileList {
//
// // 打开 SQL 文件
// jackeyLove, err := os.Open(jackeyLoveFile)
// if err != nil {
// log.ErrorF("[MysqlSqlFileLoad] - failed to load jackeyLoveFile => %s", jackeyLove.Name())
// }
// defer jackeyLove.Close()
//
// // 逐行读取 SQL 文件并执行
// query := ""
// delimiterSwitched := false
// scanner := bufio.NewScanner(jackeyLove)
// for scanner.Scan() {
// sqlStatement := scanner.Text()
//
// if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") {
// delimiterSwitched = true
// continue
// }
// if delimiterSwitched {
// if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" {
// delimiterSwitched = false
// // 替换自定义分隔符为 ;
// sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";")
// } else {
// // 忽略自定义分隔符行
// continue
// }
// }
//
// // 这里可以添加逻辑来忽略空行或注释行
// if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" {
// continue
// }
//
// query += sqlStatement
//
// if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") {
//
// fmt.Printf("%s -> %s", jackeyLoveFile, query)
//
// _, err := db.Exec(query)
// if err != nil {
// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 执行出错: %s, 错误信息: %s", jackeyLove.Name(), sqlStatement, err.Error())
// log.Error(executeError)
// return false, []string{
// executeError,
// }
// }
// query = ""
// } else {
// query += " " // 添加空格以便连接多行语句
// }
// }
//
// // 检查扫描过程中是否有错误
// if err := scanner.Err(); err != nil {
// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error())
// log.Error(executeError)
// return false, []string{
// executeError,
// }
// }
// log.DebugF("[MysqlSqlFileLoad] - jackeyLoveFile %s execute success !", jackeyLove.Name())
// }
//
// return true, append(jackeyLoveFileList, "[MysqlSqlFileLoad] all file loaded !")
//}
dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/" //func MySqlParseSQLFile(sqlFilePath string) []string {
db, err := sql.Open("mysql", dsn) //
if err != nil { // var result []string
errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error()) //
log.Error(errConnect) // // 打开 SQL 文件
return false, []string{ // jackeyLove, err := os.Open(sqlFilePath)
errConnect, // if err != nil {
} // log.ErrorF("[MySqlParseSQLFile] - failed to load jackeyLoveFile => %s", jackeyLove.Name())
} // }
defer db.Close() // defer jackeyLove.Close()
//
// 确保数据库连接是有效的 // // 逐行读取 SQL 文件并执行
if err := db.Ping(); err != nil { // query := ""
errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !" // delimiterSwitched := false
log.Error(errConnect) // scanner := bufio.NewScanner(jackeyLove)
return false, []string{ // for scanner.Scan() {
errConnect, // sqlStatement := scanner.Text()
} //
} // if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") {
// delimiterSwitched = true
for _, jackeyLoveFile := range jackeyLoveFileList { // continue
// }
// 打开 SQL 文件 // if delimiterSwitched {
jackeyLove, err := os.Open(jackeyLoveFile) // if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" {
if err != nil { // delimiterSwitched = false
log.ErrorF("[MysqlSqlFileLoad] - failed to load jackeyLoveFile => %s", jackeyLove.Name()) // // 替换自定义分隔符为 ;
} // sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";")
defer jackeyLove.Close() // } else {
// // 忽略自定义分隔符行
// 逐行读取 SQL 文件并执行 // continue
query := "" // }
delimiterSwitched := false // }
scanner := bufio.NewScanner(jackeyLove) //
for scanner.Scan() { // // 这里可以添加逻辑来忽略空行或注释行
sqlStatement := scanner.Text() // if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" {
// continue
if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") { // }
delimiterSwitched = true //
continue // query += sqlStatement
} //
if delimiterSwitched { // if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") {
if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" { //
delimiterSwitched = false // result = append(result, query)
// 替换自定义分隔符为 ; //
sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";") // query = ""
} else { // } else {
// 忽略自定义分隔符行 // query += "" // 添加空格以便连接多行语句
continue // }
} // }
} //
// // 检查扫描过程中是否有错误
// 这里可以添加逻辑来忽略空行或注释行 // if err := scanner.Err(); err != nil {
if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" { // executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error())
continue // log.Error(executeError)
} //
//
query += sqlStatement // }
//
if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") { // return result
//}
fmt.Printf("%s -> %s", jackeyLoveFile, query) //
//func MySqlConnection(jackeyLoveIp string, jackeyLovePort string) (bool, []string) {
_, err := db.Exec(query) //
if err != nil { // dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/"
executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 执行出错: %s, 错误信息: %s", jackeyLove.Name(), sqlStatement, err.Error()) // db, err := sql.Open("mysql", dsn)
log.Error(executeError) // if err != nil {
return false, []string{ // errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error())
executeError, // log.Error(errConnect)
} // return false, []string{
} // errConnect,
query = "" // }
} else { // }
query += " " // 添加空格以便连接多行语句 // defer db.Close()
} //
} // // 确保数据库连接是有效的
// if err := db.Ping(); err != nil {
// 检查扫描过程中是否有错误 // errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !"
if err := scanner.Err(); err != nil { // log.Error(errConnect)
executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error()) // return false, []string{
log.Error(executeError) // errConnect,
return false, []string{ // }
executeError, // }
} //
} // return true, nil
log.DebugF("[MysqlSqlFileLoad] - jackeyLoveFile %s execute success !", jackeyLove.Name()) //}
}
return true, append(jackeyLoveFileList, "[MysqlSqlFileLoad] all file loaded !")
}
func MySqlConnection(jackeyLoveIp string, jackeyLovePort string) (bool, []string) {
dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/"
db, err := sql.Open("mysql", dsn)
if err != nil {
errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error())
log.Error(errConnect)
return false, []string{
errConnect,
}
}
defer db.Close()
// 确保数据库连接是有效的
if err := db.Ping(); err != nil {
errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !"
log.Error(errConnect)
return false, []string{
errConnect,
}
}
return true, nil
}

View File

@@ -1,13 +1,18 @@
package executor package executor
import "testing" //func TestMySqlConnection(t *testing.T) {
//
func TestMySqlConnection(t *testing.T) { // connection, strings := MySqlConnection("10.250.0.126", "33306")
// if !connection {
connection, strings := MySqlConnection("10.250.0.126", "33306") // t.Error(strings)
if !connection { // }
t.Error(strings) //
} // println("success!")
//}
println("success!") //
} //func TestMySqlParseSQLFile(t *testing.T) {
//
// parseSQLFile := MySqlParseSQLFile("C:\\Users\\wdd\\Documents\\4.1.6-部署\\init_5.1.0\\1_all_tables_demo_5.1.0.sql")
//
// BasicPrettyPrint(true, parseSQLFile)
//}

View File

@@ -3,7 +3,6 @@ module agent-go
go 1.18 go 1.18
require ( require (
github.com/go-sql-driver/mysql v1.7.1
github.com/magiconair/properties v1.8.7 github.com/magiconair/properties v1.8.7
github.com/mittwald/goharbor-client/v5 v5.4.2 github.com/mittwald/goharbor-client/v5 v5.4.2
github.com/panjf2000/ants/v2 v2.7.2 github.com/panjf2000/ants/v2 v2.7.2

View File

@@ -51,10 +51,10 @@ public enum AppFunctionEnum {
"部署k8s mysql, 参数 A1C2IP, SUPREME" "部署k8s mysql, 参数 A1C2IP, SUPREME"
), ),
LOAD_MYSQL_INIT_SCRIPT( // LOAD_MYSQL_INIT_SCRIPT(
"LOAD_MYSQL_INIT_SCRIPT", // "LOAD_MYSQL_INIT_SCRIPT",
"加载MySQl的初始化脚本" // "加载MySQl的初始化脚本废弃,手动!"
), // ),
DEPLOY_K8S_REDIS( DEPLOY_K8S_REDIS(
"DEPLOY_K8S_REDIS", "DEPLOY_K8S_REDIS",

View File

@@ -103,7 +103,10 @@ public class AppFuncScheduler {
// AppFunctionEnum.DEPLOY_K8S_MYSQL // AppFunctionEnum.DEPLOY_K8S_MYSQL
// AppFunctionEnum.DEPLOY_K8S_REDIS // AppFunctionEnum.DEPLOY_K8S_REDIS
// AppFunctionEnum.DEPLOY_K8S_PVC // AppFunctionEnum.DEPLOY_K8S_PVC
AppFunctionEnum.LOAD_MYSQL_INIT_SCRIPT AppFunctionEnum.DEPLOY_INGRESS,
AppFunctionEnum.DEPLOY_FRONTEND,
AppFunctionEnum.DEPLOY_BACKEND
); );