From 540d69ede271d62947860eed73313f2225e0c5cf Mon Sep 17 00:00:00 2001 From: zeaslity Date: Thu, 13 Jun 2024 15:06:33 +0800 Subject: [PATCH] [agent-operator] - cmii deploy part --- agent-common/utils/FileUtils.go | 30 +++++- agent-common/utils/PrintUtils.go | 12 ++- agent-deploy/OctopusDeploy.go | 44 ++++++++- agent-operator/CmiiDeployOperator.go | 82 ++++++++++++++++ agent-operator/CmiiK8sOperator.go | 43 ++++----- agent-operator/CmiiK8sOperator_test.go | 2 +- agent-operator/CmiiOperator.go | 19 ++-- agent-operator/K8sOperator.go | 81 +++++++++++++++- .../CmiiImageConfig.go} | 93 ++++++++++++++++++- agent-operator/{ => config}/CmiiK8sConfig.go | 93 +------------------ agent-operator/config/cmii-core-cluster.yaml | 0 agent-operator/config/cmii-dev-cluster.yaml | 18 ++++ agent-operator/go.mod | 5 +- agent-operator/go.sum | 4 +- ...{CmiiImageSync.go => CmiiImageOperator.go} | 31 ++++++- ...Sync_test.go => CmiiImageOperator_test.go} | 3 +- agent-operator/main.go | 2 +- agent-operator/mysql/MysqlOperator.go | 38 ++++++++ agent-operator/mysql/cmii_mysql_dump.sh | 43 +++++++++ 19 files changed, 503 insertions(+), 140 deletions(-) create mode 100644 agent-operator/CmiiDeployOperator.go rename agent-operator/{image/CmiiDependencyImageConfig.go => config/CmiiImageConfig.go} (68%) rename agent-operator/{ => config}/CmiiK8sConfig.go (75%) create mode 100644 agent-operator/config/cmii-core-cluster.yaml create mode 100644 agent-operator/config/cmii-dev-cluster.yaml rename agent-operator/image/{CmiiImageSync.go => CmiiImageOperator.go} (94%) rename agent-operator/image/{CmiiImageSync_test.go => CmiiImageOperator_test.go} (98%) create mode 100644 agent-operator/mysql/MysqlOperator.go create mode 100644 agent-operator/mysql/cmii_mysql_dump.sh diff --git a/agent-common/utils/FileUtils.go b/agent-common/utils/FileUtils.go index 4079d2c..eba833e 100644 --- a/agent-common/utils/FileUtils.go +++ b/agent-common/utils/FileUtils.go @@ -214,7 +214,7 @@ func RemoveFolderComplete(folderName string) bool { return true } -func ReadLineFromFile(fileFullPath string) (result []string) { +func ReadAllContentFromFile(fileFullPath string) (result []string) { f, err := os.Open(fileFullPath) if err != nil { @@ -238,3 +238,31 @@ func ReadLineFromFile(fileFullPath string) (result []string) { return result } + +// FolderMoveFiles 将源文件夹中除了子文件夹外的所有文件移动到目标文件夹 +func FolderMoveFiles(srcDir, dstDir string) error { + // 读取源文件夹中的所有条目 + entries, err := os.ReadDir(srcDir) + if err != nil { + return fmt.Errorf("读取源文件夹失败: %w", err) + } + + // 遍历所有条目 + for _, entry := range entries { + // 跳过子文件夹 + if entry.IsDir() { + continue + } + + // 构造源文件路径和目标文件路径 + srcPath := filepath.Join(srcDir, entry.Name()) + dstPath := filepath.Join(dstDir, entry.Name()) + + // 移动文件 + if err := os.Rename(srcPath, dstPath); err != nil { + return fmt.Errorf("移动文件失败: %w", err) + } + } + + return nil +} diff --git a/agent-common/utils/PrintUtils.go b/agent-common/utils/PrintUtils.go index 2eaaafa..9b66680 100644 --- a/agent-common/utils/PrintUtils.go +++ b/agent-common/utils/PrintUtils.go @@ -31,13 +31,21 @@ func BeautifulPrintToString(object interface{}) string { return string(bytes) } +func BeautifulPrintWithTitle(contend any, title string) { + + fmt.Println() + fmt.Println(fmt.Sprintf("content tile is => %s", title)) + bytes, _ := json.MarshalIndent(contend, "", " ") + fmt.Println(string(bytes)) + fmt.Println("---------- end -----------") +} + func BeautifulPrintListWithTitle(contend []string, title string) { fmt.Println() fmt.Println(fmt.Sprintf("content tile is => %s", title)) for _, line := range contend { - bytes, _ := json.MarshalIndent(line, "", " ") - fmt.Println(string(bytes)) + fmt.Println(line) } fmt.Println("---------- end -----------") } diff --git a/agent-deploy/OctopusDeploy.go b/agent-deploy/OctopusDeploy.go index 6d1f83d..2735218 100644 --- a/agent-deploy/OctopusDeploy.go +++ b/agent-deploy/OctopusDeploy.go @@ -4,6 +4,7 @@ import ( "os" image2 "wdd.io/agent-common/image" "wdd.io/agent-common/logger" + "wdd.io/agent-common/utils" "wdd.io/agent-deploy/a_dashboard" "wdd.io/agent-deploy/a_nfs" "wdd.io/agent-deploy/b_middle" @@ -166,7 +167,7 @@ func configMapDeploy(common *z_dep.CommonEnvironmentConfig) { } // CmiiEnvironmentDeploy 部署完整的CMII环境的所有组件 -func CmiiEnvironmentDeploy() { +func CmiiEnvironmentDeploy(isCompleteDeploy bool, cmiiNameSpace string, backendImageVersionMap, frontendImageVersionMap map[string]string) (applyYamlFolder string) { // common environment common := &z_dep.CommonEnvironmentConfig{ @@ -174,20 +175,55 @@ func CmiiEnvironmentDeploy() { WebPort: "", HarborIP: image2.CmiiHarborPrefix, HarborPort: "", - Namespace: "devflight", + Namespace: cmiiNameSpace, TagVersion: "5.5.0", - TenantEnv: "devflight", + TenantEnv: cmiiNameSpace, } - folderPrefix := "/home/wdd/IdeaProjects/ProjectOctopus/agent-deploy/" + folderPrefix := "/home/wdd/IdeaProjects/ProjectOctopus/agent-deploy/" + common.Namespace + "/" // clear old apply file + _ = os.Mkdir(folderPrefix, os.ModeDir) + + oldApplyFileFolder := folderPrefix + "old" + utils.RemoveFolderComplete(oldApplyFileFolder) + _ = os.Mkdir(oldApplyFileFolder, os.ModeDir) + + // move all apply file to old folder + _ = utils.FolderMoveFiles(folderPrefix, oldApplyFileFolder) // clear all middleware data // ignore redis rabbitmq mongo nacos emqx // sync mysql-data + z_dep.ApplyFilePrefix = folderPrefix // generate new apply file for specific environment + if isCompleteDeploy { + + // pvc + b_middle.PVCDeploy(common) + + // middlewares + b_middle.MidMySQlDeploy(common) + b_middle.MidRedisDeploy(common) + b_middle.MidEmqxDeploy(common) + b_middle.MidMongoDeploy(common) + b_middle.MidRabbitMQDeploy(common) + b_middle.MidNacosDeploy(common) + + configMapDeploy(common) + c_app.IngressDeploy(common) + + } + + // frontend + + // frontend + frontendDeploy(common, frontendImageVersionMap) + // backend + backendDeploy(common, backendImageVersionMap) // apply for them + + return folderPrefix } diff --git a/agent-operator/CmiiDeployOperator.go b/agent-operator/CmiiDeployOperator.go new file mode 100644 index 0000000..9cf8945 --- /dev/null +++ b/agent-operator/CmiiDeployOperator.go @@ -0,0 +1,82 @@ +package main + +import ( + "os" + "path/filepath" + "wdd.io/agent-common/utils" + "wdd.io/agent-deploy" + "wdd.io/agent-operator/image" +) + +func CmiiEnvDeploy() { + + // 完整部署 + shouldDoCompleteDeploy := true + + // 部署的环境 + cmiiNamespace := dev + + // 输出特定版本的Tag 或者 从DEMO环境拉取 + DeploySpecificTag := "5.5.0" + + var backendMap map[string]string + var frontendMap map[string]string + var srsMap map[string]string + + if DeploySpecificTag == "" { + // 从DEMO环境拉取 + backendMap, frontendMap, srsMap = BackupAllCmiiDeploymentToMap(demo) + } else { + // 输出特定版本的Tag + backendMap, frontendMap, srsMap = image.GenerateCmiiTagVersionImageMap(DeploySpecificTag) + } + + utils.BeautifulPrintWithTitle(backendMap, "backendMap") + utils.BeautifulPrintWithTitle(frontendMap, "frontendMap") + utils.BeautifulPrintWithTitle(srsMap, "srsMap") + + // generate and get all old stuff + applyYamlFolder := agent_deploy.CmiiEnvironmentDeploy(shouldDoCompleteDeploy, cmiiNamespace, frontendMap, backendMap) + + // clear old apply file + clearOldApplyStuff(applyYamlFolder+"old/", cmiiNamespace) + + // apply new app + applyNewAppStuff(applyYamlFolder, cmiiNamespace) + +} + +func applyNewAppStuff(applyYamlFolder string, cmiiEnv string) bool { + files, err := os.ReadDir(applyYamlFolder) + if err != nil { + log.ErrorF("failed to read directory: %v", err) + return false + } + + for _, file := range files { + if filepath.Ext(file.Name()) == ".yaml" || filepath.Ext(file.Name()) == ".yml" { + filePath := filepath.Join(applyYamlFolder, file.Name()) + ApplyByKubectl(filePath, cmiiEnv) + } + } + + return true +} + +func clearOldApplyStuff(oldApplyYamlFolder string, cmiiEnv string) bool { + + files, err := os.ReadDir(oldApplyYamlFolder) + if err != nil { + log.ErrorF("failed to read directory: %v", err) + return false + } + + for _, file := range files { + if filepath.Ext(file.Name()) == ".yaml" || filepath.Ext(file.Name()) == ".yml" { + filePath := filepath.Join(oldApplyYamlFolder, file.Name()) + DeleteByKubectl(filePath, cmiiEnv) + } + } + + return true +} diff --git a/agent-operator/CmiiK8sOperator.go b/agent-operator/CmiiK8sOperator.go index ea2b838..bf5641e 100644 --- a/agent-operator/CmiiK8sOperator.go +++ b/agent-operator/CmiiK8sOperator.go @@ -7,6 +7,7 @@ import ( "time" image2 "wdd.io/agent-common/image" "wdd.io/agent-common/utils" + "wdd.io/agent-operator/config" ) var DefaultCmiiOperator = CmiiK8sOperator{} @@ -193,7 +194,7 @@ func FindCmiiMiddlewarePodInterface(cmiiEnv string) (podList []CmiiPodInterface) cmiiPodInterfaces := DefaultCmiiOperator.PodAllInterface(cmiiEnv) for _, podInterface := range cmiiPodInterfaces { - for key := range CmiiMiddlewareNameMap { + for key := range config.CmiiMiddlewareNameMap { if strings.Contains(podInterface.Name, key) { podList = append(podList, podInterface) } @@ -204,8 +205,8 @@ func FindCmiiMiddlewarePodInterface(cmiiEnv string) (podList []CmiiPodInterface) } func ScaleCmiiFrontendDeploymentToDesiredReplicas(cmiiEnv string, desiredReplicas int32) (errorUpdateMap map[string]int32) { - frontMap := make(map[string]int32, len(CmiiFrontendAppMap)) - for aooName := range CmiiFrontendAppMap { + frontMap := make(map[string]int32, len(config.CmiiFrontendAppMap)) + for aooName := range config.CmiiFrontendAppMap { frontMap[aooName] = desiredReplicas } @@ -213,8 +214,8 @@ func ScaleCmiiFrontendDeploymentToDesiredReplicas(cmiiEnv string, desiredReplica } func ScaleCmiiBackendDeploymentToDesiredReplicas(cmiiEnv string, desiredReplicas int32) (errorUpdateMap map[string]int32) { - backMap := make(map[string]int32, len(CmiiBackendAppMap)) - for aooName := range CmiiBackendAppMap { + backMap := make(map[string]int32, len(config.CmiiBackendAppMap)) + for aooName := range config.CmiiBackendAppMap { backMap[aooName] = desiredReplicas } @@ -283,7 +284,7 @@ func RestartCmiiFrontendDeployment(cmiiEnv string) { cmiiDeploymentInterfaces := DefaultCmiiOperator.DeploymentAllInterface(cmiiEnv) for _, deploymentInterface := range cmiiDeploymentInterfaces { - _, ok := CmiiFrontendAppMap[deploymentInterface.Name] + _, ok := config.CmiiFrontendAppMap[deploymentInterface.Name] if ok { if !DefaultCmiiOperator.DeploymentRestart(deploymentInterface.Namespace, deploymentInterface.Name) { log.ErrorF("[RestartCmiiFrontendDeployment] - restart of [%s] [%s] failed !", deploymentInterface.Namespace, deploymentInterface.Name) @@ -408,8 +409,8 @@ func RollBackCmiiDeploymentFromUpdateLog(updateLog string) bool { return ok } -// BackupAllDeploymentFromEnv 从DEMO提取全部的CMII的应用 -func BackupAllDeploymentFromEnv(cmiiEnv string) bool { +// BackupAllDeploymentFromEnvToFile 从DEMO提取全部的CMII的应用 +func BackupAllDeploymentFromEnvToFile(cmiiEnv string) bool { allInterface := DefaultCmiiOperator.DeploymentAllInterface(cmiiEnv) @@ -419,7 +420,7 @@ func BackupAllDeploymentFromEnv(cmiiEnv string) bool { //filePath := "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\cmii_operator\\log\\all-" + DefaultCmiiOperator.CurrentNamespace + "-" + utils.TimeSplitFormatString() + ".txt" filePath := "/home/wdd/IdeaProjects/ProjectOctopus/agent-operator/log/all-" + DefaultCmiiOperator.CurrentNamespace + "-" + utils.TimeSplitFormatString() + ".txt" - log.InfoF("[BackupAllDeploymentFromEnv] - backup all image from %s => %s", DefaultCmiiOperator.CurrentNamespace, filePath) + log.InfoF("[BackupAllDeploymentFromEnvToFile] - backup all image from %s => %s", DefaultCmiiOperator.CurrentNamespace, filePath) firstCol := 0 secondCol := 0 @@ -457,7 +458,7 @@ func BackupAllDeploymentFromEnv(cmiiEnv string) bool { content += "\n" if !utils.AppendContentToFile(content, filePath) { - log.ErrorF("[BackupAllDeploymentFromEnv] - write to file %s error with contend %s", filePath, content) + log.ErrorF("[BackupAllDeploymentFromEnvToFile] - write to file %s error with contend %s", filePath, content) return false } @@ -485,7 +486,7 @@ func BackupAllCmiiDeploymentToMap(cmiiEnv string) (backendMap, frontendMap, srsM } // add srs part - for key, value := range CmiiSrsAppMap { + for key, value := range config.CmiiSrsAppMap { var app *CmiiDeploymentInterface if strings.Contains(value, "deployment") { app = DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key) @@ -545,7 +546,7 @@ func BackUpAllCmiiAppImageNameFromEnv(cmiiEnv string) { only := make(map[string]string, 150) // front utils.AppendContentToFile("---\n", filePath) - for key, value := range CmiiFrontendAppMap { + for key, value := range config.CmiiFrontendAppMap { _, ok := only[key] if !ok { deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key) @@ -556,7 +557,7 @@ func BackUpAllCmiiAppImageNameFromEnv(cmiiEnv string) { } } utils.AppendContentToFile("---\n", filePath) - for key, value := range CmiiBackendAppMap { + for key, value := range config.CmiiBackendAppMap { _, ok := only[key] if !ok { deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key) @@ -569,7 +570,7 @@ func BackUpAllCmiiAppImageNameFromEnv(cmiiEnv string) { // backend utils.AppendContentToFile("---\n", filePath) // gis server - for key, value := range CmiiGISAppMap { + for key, value := range config.CmiiGISAppMap { _, ok := only[key] if !ok { deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key) @@ -581,7 +582,7 @@ func BackUpAllCmiiAppImageNameFromEnv(cmiiEnv string) { } // srs utils.AppendContentToFile("---\n", filePath) - for key, value := range CmiiSrsAppMap { + for key, value := range config.CmiiSrsAppMap { _, ok := only[key] if !ok { var app *CmiiDeploymentInterface @@ -608,9 +609,9 @@ func BackUpAllCmiiAppImageNameFromEnv(cmiiEnv string) { func FilterAllCmiiAppStrict(source []CmiiDeploymentInterface) (result []CmiiDeploymentInterface) { for _, c := range source { - _, ok := CmiiBackendAppMap[c.ContainerName] + _, ok := config.CmiiBackendAppMap[c.ContainerName] if !ok { - _, ok = CmiiFrontendAppMap[c.ContainerName] + _, ok = config.CmiiFrontendAppMap[c.ContainerName] if !ok { log.WarnF("[FilterAllCmiiAppStrict] - [%s] not cmii pod !", c.ContainerName) continue @@ -662,9 +663,9 @@ func FilterAllCmiiAppSoft(source []CmiiDeploymentInterface) (result []CmiiDeploy func FilterAllCmiiPodStrict(podList []CmiiPodInterface) (result []CmiiPodInterface) { for _, c := range podList { - _, ok := CmiiBackendAppMap[c.ContainerName] + _, ok := config.CmiiBackendAppMap[c.ContainerName] if !ok { - _, ok = CmiiFrontendAppMap[c.ContainerName] + _, ok = config.CmiiFrontendAppMap[c.ContainerName] if !ok { log.WarnF("[FilterAllCmiiPodStrict] - [%s] not cmii pod !", c.ContainerName) continue @@ -734,9 +735,9 @@ func FilterAllCmiiNodeSoft(nodeList []CmiiNodeInterface) (result []CmiiNodeInter } func AppNameBelongsToCmiiImage(appName string) bool { - _, ok := CmiiBackendAppMap[appName] + _, ok := config.CmiiBackendAppMap[appName] if !ok { - _, ok = CmiiFrontendAppMap[appName] + _, ok = config.CmiiFrontendAppMap[appName] if !ok { log.WarnF("[AppNameBelongsToCmiiImage] - [%s] not cmii app !", appName) return false diff --git a/agent-operator/CmiiK8sOperator_test.go b/agent-operator/CmiiK8sOperator_test.go index dd619c5..23d7c43 100644 --- a/agent-operator/CmiiK8sOperator_test.go +++ b/agent-operator/CmiiK8sOperator_test.go @@ -227,7 +227,7 @@ func TestScaleCmiiBackendDeploymentToDesiredReplicas(t *testing.T) { func TestBackupAllDeploymentFromEnv(t *testing.T) { - BackupAllDeploymentFromEnv(demo) + BackupAllDeploymentFromEnvToFile(demo) } diff --git a/agent-operator/CmiiOperator.go b/agent-operator/CmiiOperator.go index bb4ed21..3123d68 100644 --- a/agent-operator/CmiiOperator.go +++ b/agent-operator/CmiiOperator.go @@ -5,6 +5,7 @@ import ( "os" "slices" "strings" + "wdd.io/agent-operator/config" image2 "wdd.io/agent-common/image" "wdd.io/agent-common/utils" @@ -330,7 +331,7 @@ func parseAndDownloadFromOss(ossUrlPrefix, ossFileName, localGzipFolder string) if strings.HasSuffix(ossFileName, ".txt") { // download from gzip file list txt // download all files in the txt file - result := utils.ReadLineFromFile(localGzipFolder + ossFileName) + result := utils.ReadAllContentFromFile(localGzipFolder + ossFileName) for _, gzipFileName := range result { DefaultCmiiMinioOperator.DemoMinioOperator.DownloadFileFromOssFullUrl(ossUrlPrefix+gzipFileName, localGzipFolder) } @@ -421,8 +422,8 @@ func buildAllCmiiImageNameListFromVersion(cmiiVersion string) []string { var realCmiiImageName []string - backendMap := CmiiBackendAppMap - frontendMap := CmiiFrontendAppMap + backendMap := config.CmiiBackendAppMap + frontendMap := config.CmiiFrontendAppMap for app := range backendMap { backendMap[app] = cmiiVersion @@ -434,7 +435,7 @@ func buildAllCmiiImageNameListFromVersion(cmiiVersion string) []string { realCmiiImageName = append(realCmiiImageName, image.CmiiImageMapToFullNameList(backendMap)...) realCmiiImageName = append(realCmiiImageName, image.CmiiImageMapToFullNameList(frontendMap)...) - for key, value := range CmiiSrsAppMap { + for key, value := range config.CmiiSrsAppMap { var app *CmiiDeploymentInterface if strings.Contains(value, "deployment") { app = DefaultCmiiOperator.DeploymentOneInterface(demo, key) @@ -469,12 +470,12 @@ func DownloadCompressUploadDependency(shouldGzip bool, shouldOss bool, shouldDow if isRKE { log.Info("DCU for rke!") - fulleImageNameList = image.Rancher1204Amd64 + fulleImageNameList = config.Rancher1204Amd64 gzipFolderPrefix = image.OfflineImageGzipFolderPrefix + "rke/" } else { log.Info("DCU for middle!") - fulleImageNameList = image.MiddlewareAmd64 + fulleImageNameList = config.MiddlewareAmd64 gzipFolderPrefix = image.OfflineImageGzipFolderPrefix + "middle/" } @@ -487,7 +488,7 @@ func LoadSplitCmiiGzipImageToTargetHarbor(projectName, targetHarborHost string) projectGzipFolder := image.OfflineImageGzipFolderPrefix + projectName errorLoadImageNameList = append(errorLoadImageNameList, image.LoadFromFolderPath(projectGzipFolder)...) // read from json - errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(image.Cmii520DemoImageList, targetHarborHost)...) + errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(config.Cmii520DemoImageList, targetHarborHost)...) // re-tag // push @@ -505,8 +506,8 @@ func LoadSplitDepGzipImageToTargetHarbor(targetHarborHost string) (errorLoadImag //errorLoadImageNameList = append(errorLoadImageNameList, ImageLoadFromFolderPath(middle)...) //errorLoadImageNameList = append(errorLoadImageNameList, ImageLoadFromFolderPath(rke)...) - errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(image.MiddlewareAmd64, targetHarborHost)...) - errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(image.Rancher1204Amd64, targetHarborHost)...) + errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(config.MiddlewareAmd64, targetHarborHost)...) + errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(config.Rancher1204Amd64, targetHarborHost)...) return errorLoadImageNameList, errorPushImageNameList diff --git a/agent-operator/K8sOperator.go b/agent-operator/K8sOperator.go index 79df48e..41fc15a 100644 --- a/agent-operator/K8sOperator.go +++ b/agent-operator/K8sOperator.go @@ -3,6 +3,7 @@ package main import ( "bytes" "context" + "fmt" v1 "k8s.io/api/apps/v1" autoscalingv1 "k8s.io/api/autoscaling/v1" corev1 "k8s.io/api/core/v1" @@ -13,12 +14,16 @@ import ( restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/remotecommand" + "os" + "os/exec" + "runtime" "strings" "sync" "time" image2 "wdd.io/agent-common/image" "wdd.io/agent-common/logger" "wdd.io/agent-common/utils" + "wdd.io/agent-operator/config" ) var log = logger.Log @@ -45,11 +50,83 @@ const ( workerThread = 4 ) +var CmiiDevClusterK8sConfig string +var CmiiCoreClusterK8sConfig string + +func init() { + + switch runtime.GOOS { + case "windows": + CmiiDevClusterK8sConfig = "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\agent-operator\\config\\cmii-dev-cluster.yaml" + CmiiCoreClusterK8sConfig = "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\agent-operator\\config\\cmii-core-cluster.yaml" + case "linux": + CmiiDevClusterK8sConfig = "" + CmiiCoreClusterK8sConfig = "" + } + +} + +func GetK8sConfigByEnv(cmiiEnv string) string { + switch cmiiEnv { + case dev: + return CmiiDevClusterK8sConfig + case devFlight: + return CmiiDevClusterK8sConfig + case devOperation: + return CmiiDevClusterK8sConfig + case integration: + return CmiiCoreClusterK8sConfig + case uat: + return CmiiCoreClusterK8sConfig + case validation: + return CmiiCoreClusterK8sConfig + case uavms: + return CmiiCoreClusterK8sConfig + case demo: + return CmiiCoreClusterK8sConfig + default: + return CmiiDevClusterK8sConfig + } + +} + +func DeleteByKubectl(applyFilePath string, cmiiEnv string) bool { + + kubeconfig := GetK8sConfigByEnv(cmiiEnv) + + cmd := exec.Command("/usr/local/bin/kubectl", "delete", "-f", applyFilePath) + cmd.Env = append(os.Environ(), fmt.Sprintf("KUBECONFIG=%s", kubeconfig)) + output, err := cmd.CombinedOutput() + if err != nil { + log.ErrorF("failed to delete resources in file %s: %v\n%s", applyFilePath, err, output) + return false + } + + log.InfoF("successfully deleted resources in file %s\n%s", applyFilePath, output) + return true +} + +func ApplyByKubectl(applyFilePath string, cmiiEnv string) bool { + + kubeconfig := GetK8sConfigByEnv(cmiiEnv) + + cmd := exec.Command("/usr/local/bin/kubectl", "apply", "-f", applyFilePath) + cmd.Env = append(os.Environ(), fmt.Sprintf("KUBECONFIG=%s", kubeconfig)) + output, err := cmd.CombinedOutput() + if err != nil { + log.ErrorF("failed to apply resources in file %s: %v\n%s", applyFilePath, err, output) + return false + } + + log.InfoF("successfully apply resources in file %s\n%s", applyFilePath, output) + return true +} + func (op *CmiiK8sOperator) checkAndBuildCmiiK8sOperator() { if op.DevClient == nil { log.InfoF("[client] - build devFlight k8s operator client !") - devConfig, err := clientcmd.RESTConfigFromKubeConfig([]byte(CmiiDevK8sConfig)) + devConfig, err := clientcmd.RESTConfigFromKubeConfig([]byte(config.CmiiDevK8sConfig)) if err != nil { msg := "[client] - build devFlight k8s operator error !" log.Error(msg) @@ -64,7 +141,7 @@ func (op *CmiiK8sOperator) checkAndBuildCmiiK8sOperator() { if op.CoreClient == nil { log.InfoF("[client] - build core k8s operator client !") - coreConfig, err := clientcmd.RESTConfigFromKubeConfig([]byte(CmiiCoreK8sConfig)) + coreConfig, err := clientcmd.RESTConfigFromKubeConfig([]byte(config.CmiiCoreK8sConfig)) if err != nil { msg := "[client] - build devFlight k8s operator error !" log.Error(msg) diff --git a/agent-operator/image/CmiiDependencyImageConfig.go b/agent-operator/config/CmiiImageConfig.go similarity index 68% rename from agent-operator/image/CmiiDependencyImageConfig.go rename to agent-operator/config/CmiiImageConfig.go index 509f2f1..c6edcad 100644 --- a/agent-operator/image/CmiiDependencyImageConfig.go +++ b/agent-operator/config/CmiiImageConfig.go @@ -1,4 +1,95 @@ -package image +package config + +var CmiiBackendAppMap = map[string]string{ + "cmii-admin-data": "5.2.0", + "cmii-admin-gateway": "5.2.0", + "cmii-admin-user": "5.2.0", + "cmii-app-release": "4.2.0-validation", + "cmii-open-gateway": "5.2.0", + "cmii-suav-supervision": "5.2.0", + "cmii-uav-airspace": "5.2.0", + "cmii-uav-alarm": "5.2.0", + "cmii-uav-autowaypoint": "4.1.6-cm-0828", + "cmii-uav-brain": "5.2.0", + "cmii-uav-cloud-live": "5.2.0", + "cmii-uav-clusters": "5.2.0", + "cmii-uav-cms": "5.2.0", + "cmii-uav-data-post-process": "5.2.0", + "cmii-uav-depotautoreturn": "4.2.0", + "cmii-uav-developer": "5.2.0-25858", + "cmii-uav-device": "5.2.0", + "cmii-uav-emergency": "5.2.0", + "cmii-uav-gateway": "5.2.0", + "cmii-uav-industrial-portfolio": "5.2.0-25268-10", + "cmii-uav-integration": "5.2.0-25447", + "cmii-uav-kpi-monitor": "5.2.0", + "cmii-uav-logger": "5.2.0", + "cmii-uav-material-warehouse": "5.2.0", + "cmii-uav-mission": "5.2.0-25840", + "cmii-uav-mqtthandler": "5.2.0-25340", + "cmii-uav-notice": "5.2.0", + "cmii-uav-oauth": "5.2.0", + "cmii-uav-process": "5.2.0", + "cmii-uav-surveillance": "5.2.0-25854", + "cmii-uav-threedsimulation": "5.2.0", + "cmii-uav-tower": "5.2.0", + "cmii-uav-user": "5.2.0", + "cmii-uav-waypoint": "5.2.0", + "cmii-uav-multilink": "5.2.0", + "cmii-uav-bridge": "5.2.0", + "cmii-uas-lifecycle": "5.2.0", + "cmii-uas-gateway": "5.2.0", +} + +var CmiiFrontendAppMap = map[string]string{ + "cmii-suav-platform-supervision": "5.2.0", + "cmii-suav-platform-supervisionh5": "5.2.0", + "cmii-uav-platform": "5.2.0-011004", + "cmii-uav-platform-ai-brain": "5.2.0", + "cmii-uav-platform-armypeople": "5.2.0-24538", + "cmii-uav-platform-base": "5.2.0", + "cmii-uav-platform-cms-portal": "5.2.0", + "cmii-uav-platform-detection": "5.2.0", + "cmii-uav-platform-emergency-rescue": "5.2.0", + "cmii-uav-platform-hljtt": "5.2.0", + "cmii-uav-platform-jiangsuwenlv": "4.1.3-jiangsu-0427", + "cmii-uav-platform-logistics": "5.2.0", + "cmii-uav-platform-media": "5.2.0", + "cmii-uav-platform-multiterminal": "5.2.0", + "cmii-uav-platform-mws": "5.2.0", + "cmii-uav-platform-oms": "5.2.0", + "cmii-uav-platform-open": "5.2.0", + "cmii-uav-platform-qingdao": "4.1.6-24238-qingdao", + "cmii-uav-platform-qinghaitourism": "4.1.0-21377-0508", + "cmii-uav-platform-security": "4.1.6", + "cmii-uav-platform-securityh5": "5.2.0", + "cmii-uav-platform-seniclive": "5.2.0", + "cmii-uav-platform-share": "5.2.0", + "cmii-uav-platform-splice": "5.2.0", + "cmii-uav-platform-threedsimulation": "5.2.0-21392", + "cmii-uav-platform-visualization": "5.2.0", +} + +var CmiiMiddlewareNameMap = map[string]string{ + "helm-nacos": "single", + "helm-emqxs": "single", + "helm-mysql": "single", + "helm-redis": "replication", + "helm-rabbitmq": "single", +} + +var CmiiSrsAppMap = map[string]string{ + "helm-live-op-v2": "deployment", + "helm-live-rtsp-op": "4.1.6", + "helm-live-srs-rtc": "statefulset", +} + +var CmiiGISAppMap = map[string]string{ + "cmii-uav-gis-server": "5.4.0", + "cmii-uav-grid-datasource": "5.4.0", + "cmii-uav-grid-engine": "5.4.0", + "cmii-uav-grid-manage": "5.4.0", +} var MiddlewareAmd64 = []string{ "bitnami/redis:6.2.6-debian-10-r0", diff --git a/agent-operator/CmiiK8sConfig.go b/agent-operator/config/CmiiK8sConfig.go similarity index 75% rename from agent-operator/CmiiK8sConfig.go rename to agent-operator/config/CmiiK8sConfig.go index 58ea2c7..0fa3937 100644 --- a/agent-operator/CmiiK8sConfig.go +++ b/agent-operator/config/CmiiK8sConfig.go @@ -1,95 +1,4 @@ -package main - -var CmiiBackendAppMap = map[string]string{ - "cmii-admin-data": "5.2.0", - "cmii-admin-gateway": "5.2.0", - "cmii-admin-user": "5.2.0", - "cmii-app-release": "4.2.0-validation", - "cmii-open-gateway": "5.2.0", - "cmii-suav-supervision": "5.2.0", - "cmii-uav-airspace": "5.2.0", - "cmii-uav-alarm": "5.2.0", - "cmii-uav-autowaypoint": "4.1.6-cm-0828", - "cmii-uav-brain": "5.2.0", - "cmii-uav-cloud-live": "5.2.0", - "cmii-uav-clusters": "5.2.0", - "cmii-uav-cms": "5.2.0", - "cmii-uav-data-post-process": "5.2.0", - "cmii-uav-depotautoreturn": "4.2.0", - "cmii-uav-developer": "5.2.0-25858", - "cmii-uav-device": "5.2.0", - "cmii-uav-emergency": "5.2.0", - "cmii-uav-gateway": "5.2.0", - "cmii-uav-industrial-portfolio": "5.2.0-25268-10", - "cmii-uav-integration": "5.2.0-25447", - "cmii-uav-kpi-monitor": "5.2.0", - "cmii-uav-logger": "5.2.0", - "cmii-uav-material-warehouse": "5.2.0", - "cmii-uav-mission": "5.2.0-25840", - "cmii-uav-mqtthandler": "5.2.0-25340", - "cmii-uav-notice": "5.2.0", - "cmii-uav-oauth": "5.2.0", - "cmii-uav-process": "5.2.0", - "cmii-uav-surveillance": "5.2.0-25854", - "cmii-uav-threedsimulation": "5.2.0", - "cmii-uav-tower": "5.2.0", - "cmii-uav-user": "5.2.0", - "cmii-uav-waypoint": "5.2.0", - "cmii-uav-multilink": "5.2.0", - "cmii-uav-bridge": "5.2.0", - "cmii-uas-lifecycle": "5.2.0", - "cmii-uas-gateway": "5.2.0", -} - -var CmiiFrontendAppMap = map[string]string{ - "cmii-suav-platform-supervision": "5.2.0", - "cmii-suav-platform-supervisionh5": "5.2.0", - "cmii-uav-platform": "5.2.0-011004", - "cmii-uav-platform-ai-brain": "5.2.0", - "cmii-uav-platform-armypeople": "5.2.0-24538", - "cmii-uav-platform-base": "5.2.0", - "cmii-uav-platform-cms-portal": "5.2.0", - "cmii-uav-platform-detection": "5.2.0", - "cmii-uav-platform-emergency-rescue": "5.2.0", - "cmii-uav-platform-hljtt": "5.2.0", - "cmii-uav-platform-jiangsuwenlv": "4.1.3-jiangsu-0427", - "cmii-uav-platform-logistics": "5.2.0", - "cmii-uav-platform-media": "5.2.0", - "cmii-uav-platform-multiterminal": "5.2.0", - "cmii-uav-platform-mws": "5.2.0", - "cmii-uav-platform-oms": "5.2.0", - "cmii-uav-platform-open": "5.2.0", - "cmii-uav-platform-qingdao": "4.1.6-24238-qingdao", - "cmii-uav-platform-qinghaitourism": "4.1.0-21377-0508", - "cmii-uav-platform-security": "4.1.6", - "cmii-uav-platform-securityh5": "5.2.0", - "cmii-uav-platform-seniclive": "5.2.0", - "cmii-uav-platform-share": "5.2.0", - "cmii-uav-platform-splice": "5.2.0", - "cmii-uav-platform-threedsimulation": "5.2.0-21392", - "cmii-uav-platform-visualization": "5.2.0", -} - -var CmiiMiddlewareNameMap = map[string]string{ - "helm-nacos": "single", - "helm-emqxs": "single", - "helm-mysql": "single", - "helm-redis": "replication", - "helm-rabbitmq": "single", -} - -var CmiiSrsAppMap = map[string]string{ - "helm-live-op-v2": "deployment", - "helm-live-rtsp-op": "4.1.6", - "helm-live-srs-rtc": "statefulset", -} - -var CmiiGISAppMap = map[string]string{ - "cmii-uav-gis-server": "5.4.0", - "cmii-uav-grid-datasource": "5.4.0", - "cmii-uav-grid-engine": "5.4.0", - "cmii-uav-grid-manage": "5.4.0", -} +package config var CmiiDevK8sConfig = `apiVersion: v1 clusters: diff --git a/agent-operator/config/cmii-core-cluster.yaml b/agent-operator/config/cmii-core-cluster.yaml new file mode 100644 index 0000000..e69de29 diff --git a/agent-operator/config/cmii-dev-cluster.yaml b/agent-operator/config/cmii-dev-cluster.yaml new file mode 100644 index 0000000..584f1ad --- /dev/null +++ b/agent-operator/config/cmii-dev-cluster.yaml @@ -0,0 +1,18 @@ +clusters: + - cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1ERXhPREEyTURZeU5Gb1hEVE14TURFeE5qQTJNRFl5TkZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2ZNCjFjTjBNUnhUTkRGdEZxcnRIZ0RPM29SV0dicmVob3VFcDJ3VUVRbU8yRUFyZDdkMUFReTJsSm9WM0RUVmhXbUwKcUFUOFcxaWRaS0x0Wm5mNjEva3JPeDd0U2lJeU4xa1ErN3NYRUhnTjVMc01EOVlKcndpUFdFY2FXdU9HVmI1aApMWDZWOTRjN0U5UlFDOENtd09iSkRCNG45ZE8zcDVlTDJHaFRpMkNrRWt3ZkRPR0tEL1IxeUNaK0tFcDRWWlplCnpwcnUzRG5zOUNqZHVOT1VBWTZzUGxjazNvdEdIVnhnRC9IRlRjUEhNbGhvUVQ4dmNDOTZwc0FtYXZPR1BZQ0YKa3RtN0VWYkZDOHN5Q1BMT3AwWWhTWHRkbGtKaC9UWHBaM0hSUWJxSzVPNXR4K1dGL05qMGJVc202ZldSMzZWQgpKQVVscUJIeFhSTzhGTFNrVHkwQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKeWZ2T3hHVVYvT2wybGRQNnYxeWFSTkd5RVkKWkVxTmM2Y29LSklsd0VQNUxNYzdZNGFReWorZCtVTE4zYmIrOXZsZXdHamluTHRrUW5HZ1R3Q3pKTU5ZNlNJNQo2NzJGZEtQTE85Szdpalhway9qRE9FVHJWS25aMXJBTytOUVBmSVhpcXQ3Y1RyVHlaVzdKTVl3emZNa2VlTGErCnREdmY1Rm5vQTBLN2U3a0ZXNTBpN2pXcGh4RXRMNEJpNzAwNnU4NEpqTU5weVp1MzhKMjFXZkR1RjBoU0NQREgKS0x4cnZIZ0FOYzJWU1c2L3JPaVVCQjdiV0JkcWcyQUNVRWZwN0V3UGs2S1BsdGNiNTJtdFhCU2xiQ3pRWWw4UQpmNmVGRFIrbnRjeXNGbU1FMFI3M1lNSHJwR0dGdlduSDVaTmEyVEJYdHpwN2tNNkVPREE5a2R4WkI1dz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + server: https://192.168.11.170:16443 + name: kubernetes +contexts: + - context: + cluster: kubernetes + user: kubernetes-admin + name: kubernetes-admin@kubernetes +current-context: kubernetes-admin@kubernetes +kind: Config +preferences: { } +users: + - name: kubernetes-admin + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4ekNDQWR1Z0F3SUJBZ0lKQU9SWThQZlhadWQyTUEwR0NTcUdTSWIzRFFFQkN3VUFNQlV4RXpBUkJnTlYKQkFNVENtdDFZbVZ5Ym1WMFpYTXdIaGNOTWpJd01URTRNRFl6TmpRMFdoY05Nekl3TVRFMk1EWXpOalEwV2pBMApNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RVpNQmNHQTFVRUF3d1FhM1ZpWlhKdVpYUmxjeTFoClpHMXBiakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPNTZ0ZG51M24rWUsxM3oKZmNlTzNiSmhBL2J0SGpoQXpvRnNObmZjeEY3dlRTZGczSUxySmVNVkFGbG50MHpUL2xacFBlU0ZUN25iL1g1Ygo4RjErSHA2dVR0b0hRVGJHR2VzbEprdkpFMjB3OGJ0Z3VrdlNmTnROOS9NNlFTWWkvTGlHeTZpd2kveGdBVUtKClFtVW1vZmhZSHNKMllFbXJCcExOVFhtenl2a2lUTlJZVC9iNlJJRzNiT3lIVm1Lc1cwQkNQNVZTTFJsLzErZlMKM0dCUUZ2UTNXdTdmVWlzMW9DSXhsc1k5V2VJUmpGOWJDbWtKNnZsT3BWbGlsTlA0cEtSSnl4aXNBNzExNENNWAprRGJvRFBXb2lxMktubzYveXI2L0xwMktsVVVSa1JhQklodEl5eXV2TldPbjhiTW90SUpCNWNOems4UkxYTm5TCklPZEtMVDhDQXdFQUFhTW5NQ1V3RGdZRFZSMFBBUUgvQkFRREFnV2dNQk1HQTFVZEpRUU1NQW9HQ0NzR0FRVUYKQndNQ01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1lwVk9NemlGRUFta1A4S3B2ZWttR3laVGV3dzQreVhyUwo3TEpoWTdTR2pGY210ZldMSW9PWEhmWmZlZWNsN3M5Snh1SytPZlhqU0d0UU9jWXk0WHo5OVFWY2FRandJMEg5Cnc3aWJiYUw3M093RGZrRDMrdlNhME9ZRWZKSFlsNXErQXBnQVpLVWRWazMvZHpJSmhRR0V6L0UxcjdYTlNabDUKL1hOT3pwbzl0VHV2dDAxRlllV0RMN01DeWZGRHFTelpQdnNyWW81bDFiTE5yeEZHb1dvSTdUMlJzR205VXJyYwoyTy84R2hMYTkwZ2tLeE9JTEpYdlJCY2RrOUN4N01ROGFGVHBuSmtPMXJzVzUxMTFoTG5hNm9WRHhISlVrbjRkCmNhODFDV3R1Yk44dkpSYlFwVmkySTJ5K3ljZ3lrNTMzR21GQXNVS3dkdm5rVjNqTVJVbFYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcGdJQkFBS0NBUUVBN25xMTJlN2VmNWdyWGZOOXg0N2RzbUVEOXUwZU9FRE9nV3cyZDl6RVh1OU5KMkRjCmd1c2w0eFVBV1dlM1ROUCtWbWs5NUlWUHVkdjlmbHZ3WFg0ZW5xNU8yZ2RCTnNZWjZ5VW1TOGtUYlREeHUyQzYKUzlKODIwMzM4enBCSmlMOHVJYkxxTENML0dBQlFvbENaU2FoK0ZnZXduWmdTYXNHa3MxTmViUEsrU0pNMUZoUAo5dnBFZ2JkczdJZFdZcXhiUUVJL2xWSXRHWC9YNTlMY1lGQVc5RGRhN3Q5U0t6V2dJakdXeGoxWjRoR01YMXNLCmFRbnErVTZsV1dLVTAvaWtwRW5MR0t3RHZYWGdJeGVRTnVnTTlhaUtyWXFlanIvS3ZyOHVuWXFWUlJHUkZvRWkKRzBqTEs2ODFZNmZ4c3lpMGdrSGx3M09UeEV0YzJkSWc1MG90UHdJREFRQUJBb0lCQVFDdTE5YldGbFNZdGNjdAoxYVJsRi9DZ3BKSlVpcHA2WWNGRmtFSUs5UmdnQmxESnl6RkE1d2hiQ2YyOGp0Y01BKzFZQzBidWNYTDNjRHZWClZiRFB5dlRHSUVQOWhBNGpDM0RiUHR4cCtkMDlWQUlYQUI3MkVqZXFUZXE1TC8rdDV6N2tSeWV2NE9oeE95NFIKU3pNYm1BeHVXS1VNcTkrQ2cxcUpiTzRkaVYwSjg5cUtidExsclFCeDFxcHNnUjNES1VhVGVNKzVpeFYyQ1Y1bApSNDV4aU43NWRrSkpaZlY2UUV5K3V2UVd0VHk4NUN3R1U2T2hjOXA4d2s0MmFrQS9qM05FTUZiTjdDaDFKbi9RCjRhNUJpMituRUE4dGVvV2FRSzdoeU5CRENWbTFsamFjaFFveGRSNGhCWVUxdkhTbkt4a0c4bDA1K1BpRTZmZFkKaUtyemhGR0JBb0dCQVBwOStKTExzZXJ6dFQ4a2VLU2FSMXBMOHB5MTQ3cmdjdEVhckxJL2ZqY1VMU3c3OUk3UAovWWhIWnhmdm9TZEZ2QTZwNy81eHFCRitaNTM5L1NKNDlLeWFOdGNJbW01UTZKSW9aRGgzWmVVS3lMKzA1YTdRCkNqMU1wZ2hKMlZDT2VPamNxd0NVQkFhcjNWSjd0cXRxRVFCQk9jMnlWU3dzbU5wclMyYmU1S3RCQW9HQkFQTzUKSG9ZVTBMK2tzdzJKUVM5ODF1ZWtrbDMzR1ZWQ2dPUFdGWThhR3VGRGt3Sm84WGk2TmhtKzh2TjlNaGg3WkYzeQpTU3E1U2RJd01pR0IvKzVJaWp1V25DbWszY2RPdGU0VFBsZHFvdjc3Q1FUUmxPNWJCekR0L1VqYVBBam5GS0FpClg4K0V6NUVXOXFSclN2ZXplZHFDRVRBVDhRWThqNk1WY0VCRW96aC9Bb0dCQUphcVRHZ25RdVdhSHF0VENZbWcKRGtqZW81Zmt3NHcwMG5xNWU2UmZFbENZdnk3N0JQY2RYVmFwOC9WdXVkVEFXZ1BMN1VGekpXOFlROFRBNzQvYgpodmVHYm5QYWhlRFNvNEM5OE1JUjl1VFVIcmxJV2xwU1ljWkxJeGFiTEs0S2MrbEVTVXE0dk04eWNwWFpPWjlTCjFkVDhab00xdjRzcGErcjhYRWNNekNmQkFvR0JBSXVuaXI4SDFHbk1CVEYvY1pPMWRDczkyUVR3MzFwRWhqaUgKWnNrZUMwTURCb3o5OTBmWFk4S3k4T0htM2pxN0VkTG5UMWVrM3BFTFB0NkdjRkZvelpUQmczQTFZVU9nYlkwagpCN2p0aU1LVXRDRkh1cEF1SnR1NXMwWDRqeWdHeVlITTBKdkhuV3lrL09WUCthQWYvblhmeTl1QndiMXlIRmcxCm82R2Y4dXNmQW9HQkFKeGlQcGdDODJPckoxazE3V3dyOFI2ZXpxR2VYb0JPRzFlOEN6ZG1UbWFrN3prWDJJelEKSTVjT3dGaTlnREhTbUVMa0dYZnRHZ01EcXF1VHVLdS9OdW9DQS94Z2FrdTQvVHplNktqbzRjc0NDTmFza3VrRQozYnhwSnU5cElYRU5tMXVuNXBZRy90QTF0V1Rtc3dnRjY1anc2RFpTQUFUTFZMSXg3RVRDR0RlOQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= \ No newline at end of file diff --git a/agent-operator/go.mod b/agent-operator/go.mod index e0968ab..1e961a8 100644 --- a/agent-operator/go.mod +++ b/agent-operator/go.mod @@ -5,7 +5,6 @@ go 1.22.1 require ( github.com/docker/docker v20.10.17+incompatible github.com/docker/go-units v0.4.0 - github.com/go-playground/validator/v10 v10.19.0 github.com/klauspost/pgzip v1.2.6 github.com/minio/minio-go v6.0.14+incompatible github.com/mittwald/goharbor-client/v5 v5.5.3 @@ -15,10 +14,13 @@ require ( k8s.io/apimachinery v0.29.1 k8s.io/client-go v0.29.1 wdd.io/agent-common v0.0.0 + wdd.io/agent-deploy v0.0.0 ) replace wdd.io/agent-common => ../agent-common +replace wdd.io/agent-deploy => ../agent-deploy + require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect @@ -43,6 +45,7 @@ require ( github.com/go-openapi/validate v0.22.1 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.21.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/goharbor/harbor/src v0.0.0-20230220075213-6015b3efa7d0 // indirect github.com/golang/protobuf v1.5.3 // indirect diff --git a/agent-operator/go.sum b/agent-operator/go.sum index fac40bd..1115a04 100644 --- a/agent-operator/go.sum +++ b/agent-operator/go.sum @@ -77,8 +77,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= -github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.21.0 h1:4fZA11ovvtkdgaeev9RGWPgc1uj3H8W+rNYyH/ySBb0= +github.com/go-playground/validator/v10 v10.21.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= diff --git a/agent-operator/image/CmiiImageSync.go b/agent-operator/image/CmiiImageOperator.go similarity index 94% rename from agent-operator/image/CmiiImageSync.go rename to agent-operator/image/CmiiImageOperator.go index 2ceb51e..e411332 100644 --- a/agent-operator/image/CmiiImageSync.go +++ b/agent-operator/image/CmiiImageOperator.go @@ -9,8 +9,10 @@ import ( "io" "io/fs" "os" + "regexp" "strconv" "strings" + "wdd.io/agent-operator/config" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" @@ -544,6 +546,31 @@ func FrontendBackendSrsImageMapFromCmiiImageMap(cmiiImageVersionMap map[string]s return frontendImageVersionMap, backendImageVersionMap, srsImageVersionMap } +// GenerateCmiiTagVersionImageMap 生成特定版本的ImageTagMap +func GenerateCmiiTagVersionImageMap(specificTag string) (backendMap, frontendMap, srsMap map[string]string) { + matched, _ := regexp.MatchString(`^\d+\.\d+\.\d+$`, specificTag) + if !matched { + log.ErrorF("srs tag is not match ! %s", specificTag) + + } + + backendMap = make(map[string]string, len(config.CmiiBackendAppMap)) + frontendMap = make(map[string]string, len(config.CmiiFrontendAppMap)) + srsMap = make(map[string]string, len(config.CmiiSrsAppMap)) + + for imageName, _ := range config.CmiiBackendAppMap { + backendMap[imageName] = specificTag + } + for imageName, _ := range config.CmiiFrontendAppMap { + frontendMap[imageName] = specificTag + } + for imageName, imageTag := range config.CmiiSrsAppMap { + srsMap[imageName] = imageTag + } + + return backendMap, frontendMap, srsMap +} + func loginToDockerHub(HarborFullHost string) { if HarborFullHost == "" { @@ -568,13 +595,13 @@ func WriteDependencyImageToFile() { middleFile := imageFilePrefix + "middle-image.txt" _ = os.Remove(middleFile) - for _, image := range MiddlewareAmd64 { + for _, image := range config.MiddlewareAmd64 { utils.AppendContentToFile(image+"\n", middleFile) } rkeFile := imageFilePrefix + "rke-image.txt" _ = os.Remove(rkeFile) - for _, image := range Rancher1204Amd64 { + for _, image := range config.Rancher1204Amd64 { utils.AppendContentToFile(image+"\n", rkeFile) } } diff --git a/agent-operator/image/CmiiImageSync_test.go b/agent-operator/image/CmiiImageOperator_test.go similarity index 98% rename from agent-operator/image/CmiiImageSync_test.go rename to agent-operator/image/CmiiImageOperator_test.go index ac2e0c0..91d9e33 100644 --- a/agent-operator/image/CmiiImageSync_test.go +++ b/agent-operator/image/CmiiImageOperator_test.go @@ -8,6 +8,7 @@ import ( "wdd.io/agent-common/assert" "wdd.io/agent-common/image" "wdd.io/agent-common/utils" + "wdd.io/agent-operator/config" "wdd.io/agent-operator/real_project/zjjt" ) @@ -128,7 +129,7 @@ func TestImageFullNameToGzipFileName(t *testing.T) { "busybox", } - test = append(test, MiddlewareAmd64...) + test = append(test, config.MiddlewareAmd64...) for _, s := range test { gzipFileName := image.ImageFullNameToGzipFileName(s) diff --git a/agent-operator/main.go b/agent-operator/main.go index a8c1887..7eab9ef 100644 --- a/agent-operator/main.go +++ b/agent-operator/main.go @@ -94,7 +94,7 @@ func main() { // //BuildDefaultK8sOperator() // - //BackupAllDeploymentFromEnv(mode) + //BackupAllDeploymentFromEnvToFile(mode) //解析命令行参数 var mode string diff --git a/agent-operator/mysql/MysqlOperator.go b/agent-operator/mysql/MysqlOperator.go new file mode 100644 index 0000000..e964dc5 --- /dev/null +++ b/agent-operator/mysql/MysqlOperator.go @@ -0,0 +1,38 @@ +package mysql + +import ( + "log" + "os" + "os/exec" +) + +var AllCmiiTableList = []string{} + +func main() { + cmd := exec.Command("/root/wdd/mysql/bin/mysqldump", + "-uroot", + "-pQzfXQhd3bQ", + "-h172.28.0.251", + "-P33306", + "-t", + "--set-gtid-purged=OFF", + "cmii_nacos_config", + "config_info", + "his_config_info", + "roles", + "users", + ) + + outputFile, err := os.Create("cmii_nacos_config.sql") + if err != nil { + log.Fatalf("Failed to create output file: %v", err) + } + defer outputFile.Close() + + cmd.Stdout = outputFile + cmd.Stderr = os.Stderr + + if err := cmd.Run(); err != nil { + log.Fatalf("Command execution failed: %v", err) + } +} diff --git a/agent-operator/mysql/cmii_mysql_dump.sh b/agent-operator/mysql/cmii_mysql_dump.sh new file mode 100644 index 0000000..a37e000 --- /dev/null +++ b/agent-operator/mysql/cmii_mysql_dump.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_airspace airport >uav_airspace.sql +sed -i '1s/^/use uav_airspace;\n/' uav_airspace.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_notice mail_provider_cfg msg_tpl msg_tpl_lang open_app >uav_notice.sql +sed -i '1s/^/use uav_notice;\n/' uav_notice.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_process uav_proc_cfg >uav_process.sql +sed -i '1s/^/use uav_process;\n/' uav_process.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF admin_user sys_weak_password sys_platform sys_platform_attr sys_resource sys_resource_api sys_resource_attr sys_action_api xxl_job_group xxl_job_info xxl_job_lock sys_resource_group sys_resource_group_template sys_tenant_config sys_group_resource_mapping >admin_user.sql +sed -i '1s/^/use admin_user;\n/' admin_user.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_user sys_weak_password sys_resource sys_resource_api sys_resource_attr sys_action_api sys_group_resource_mapping sys_resource_group sys_resource_group_template >uav_user.sql +sed -i '1s/^/use uav_user;\n/' uav_user.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_oauth oauth_client_details >uav_oauth.sql +sed -i '1s/^/use uav_oauth;\n/' uav_oauth.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_mission calendar num >uav_mission.sql +sed -i '1s/^/use uav_mission;\n/' uav_mission.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF admin_data sys_area_config sys_area_pinyin sys_dictionary sys_dictionary_attr sys_dictionary_type sys_language uav_dev_action_match uav_dev_type_match uav_hangar_model uav_load_cam_model uav_load_spk_model uav_plane_model >admin_data.sql +sed -i '1s/^/use admin_data;\n/' admin_data.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF cmii_material_warehouse mw_scr >cmii_material_warehouse.sql +sed -i '1s/^/use cmii_material_warehouse;\n/' cmii_material_warehouse.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_brain scene_category_config scene_type_config >uav_brain.sql +sed -i '1s/^/use uav_brain;\n/' uav_brain.sql + +#/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF nacos_config config_info his_config_info roles users > nacos_config.sql +#sed -i '1s/^/use nacos_config;\n/' nacos_config.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF cmii_live_srs_op live_hls_sync_hq live_hub >cmii_live_srs_op.sql +sed -i '1s/^/use cmii_live_srs_op;\n/' cmii_live_srs_op.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF suav_supervision airport sys_area_config sys_area_pinyin >suav_supervision.sql +sed -i '1s/^/use suav_supervision;\n/' suav_supervision.sql + +/root/wdd/mysql/bin/mysqldump --login-path=root13306 -t --set-gtid-purged=OFF uav_gis emergence >uav_gis.sql +sed -i '1s/^/use uav_gis;\n/' uav_gis.sql