Files
ProjectOctopus/agent-operator/CmiiDeployOperator.go
2024-07-11 16:06:10 +08:00

234 lines
6.4 KiB
Go
Executable File

package main
import (
"fmt"
"os"
"path/filepath"
"strings"
"wdd.io/agent-common/utils"
agentdeploy "wdd.io/agent-deploy"
"wdd.io/agent-deploy/z_dep"
"wdd.io/agent-operator/image"
)
func CmiiEnvDeploy(deployCommonEnv *z_dep.CommonEnvironmentConfig, shouldDoCompleteDeploy bool, backupFromEnv string) {
folderPrefix := "/home/wdd/IdeaProjects/ProjectOctopus/agent-deploy/" + deployCommonEnv.Namespace + "/"
tenantEnv := deployCommonEnv.Namespace
// uavcloud-devflight ==> devflight
// uavcloud-dev ==> dev
if strings.Contains(tenantEnv, "-") {
split := strings.Split(tenantEnv, "-")
tenantEnv = split[len(split)-1]
} else {
// demo ==> ""
// cqlyj ==> ""
tenantEnv = ""
}
// assign folder prefix
deployCommonEnv.ApplyFilePrefix = folderPrefix
var backendMap map[string]string
var frontendMap map[string]string
var srsMap map[string]string
// 输出特定版本的Tag
backendMap, frontendMap, srsMap = image.GenerateCmiiTagVersionImageMap(deployCommonEnv.TagVersion)
if backupFromEnv != "" {
// 从 backupFromEnv 环境拉取特定版本的所有Tag
backendMapFromEnv, frontendMapFromEnv, srsMapFromEnv := BackupAllCmiiDeploymentToMap(backupFromEnv)
backendMap = utils.MergeMap(backendMap, backendMapFromEnv)
frontendMap = utils.MergeMap(frontendMap, frontendMapFromEnv)
srsMap = utils.MergeMap(srsMap, srsMapFromEnv)
}
utils.BeautifulPrintWithTitle(backendMap, "backendMap")
utils.BeautifulPrintWithTitle(frontendMap, "frontendMap")
utils.BeautifulPrintWithTitle(srsMap, "srsMap")
// get the apply file path
deployCommonEnv.GenerateApplyFilePath()
// do generate all application files
// generate and get all old stuff
agentdeploy.CmiiEnvironmentDeploy(shouldDoCompleteDeploy, deployCommonEnv, backendMap, frontendMap)
// test
//GetNodeWideByKubectl(deployNamespace)
// clear old apply file
//clearOldApplyStuff(common, shouldDoCompleteDeploy)
// apply new app
//applyNewAppStuff(common, shouldDoCompleteDeploy)
fmt.Println()
fmt.Println("-------------------- all done ---------------------")
fmt.Println()
}
func CmiiNewAppDeploy(deployCommonEnv *z_dep.CommonEnvironmentConfig, isFrontEnd bool, newAppNamespace string) {
folderPrefix := "/home/wdd/IdeaProjects/ProjectOctopus/agent-deploy/" + deployCommonEnv.Namespace + "/"
tenantEnv := deployCommonEnv.Namespace
// uavcloud-devflight ==> devflight
// uavcloud-dev ==> dev
if strings.Contains(tenantEnv, "-") {
split := strings.Split(tenantEnv, "-")
tenantEnv = split[len(split)-1]
} else {
// demo ==> ""
// cqlyj ==> ""
tenantEnv = ""
}
// assign folder prefix
deployCommonEnv.ApplyFilePrefix = folderPrefix
var backendMap map[string]string
var frontendMap map[string]string
var srsMap map[string]string
// 输出特定版本的Tag
backendMap, frontendMap, srsMap = image.GenerateCmiiTagVersionImageMap(deployCommonEnv.TagVersion)
if newAppNamespace != "" {
// 从 backupFromEnv 环境拉取特定版本的所有Tag
backendMapFromEnv, frontendMapFromEnv, srsMapFromEnv := BackupAllCmiiDeploymentToMap(newAppNamespace)
backendMap = utils.MergeMap(backendMap, backendMapFromEnv)
frontendMap = utils.MergeMap(frontendMap, frontendMapFromEnv)
srsMap = utils.MergeMap(srsMap, srsMapFromEnv)
}
utils.BeautifulPrintWithTitle(backendMap, "backendMap")
utils.BeautifulPrintWithTitle(frontendMap, "frontendMap")
utils.BeautifulPrintWithTitle(srsMap, "srsMap")
// get the apply file path
deployCommonEnv.GenerateApplyFilePath()
// generate application file
agentdeploy.CmiiNewAppDeploy(deployCommonEnv, isFrontEnd, backendMap, frontendMap)
// apply file
applyNewAppStuff(deployCommonEnv, false)
}
func applyNewAppStuff(common *z_dep.CommonEnvironmentConfig, shouldDoCompleteDeploy bool) bool {
files, err := os.ReadDir(common.ApplyFilePrefix)
if err != nil {
log.ErrorF("failed to read directory: %v", err)
return false
}
if len(files) == 0 {
log.WarnF("no apply file found in %s", common.ApplyFilePrefix)
return false
}
namespace := common.Namespace
if shouldDoCompleteDeploy {
// pvc
ApplyByKubectl(z_dep.PVCApplyFilePath, namespace)
// mysql
ApplyByKubectl(z_dep.MySQLApplyFilePath, namespace)
if !DefaultCmiiOperator.PodStatusCheckTimeout("helm-mysql-0", namespace, 180) {
return false
}
// mongo
ApplyByKubectl(z_dep.MongoApplyFilePath, namespace)
if !DefaultCmiiOperator.PodStatusCheckTimeout("helm-mongo-0", namespace, 180) {
return false
}
// redis
ApplyByKubectl(z_dep.RedisApplyFilePath, namespace)
if !DefaultCmiiOperator.PodStatusCheckTimeout("helm-redis-master-0", namespace, 180) {
return false
}
if !DefaultCmiiOperator.PodStatusCheckTimeout("helm-redis-replicas-0", namespace, 180) {
return false
}
// rabbitmq
ApplyByKubectl(z_dep.RabbitMQApplyFilePath, namespace)
if !DefaultCmiiOperator.PodStatusCheckTimeout("helm-rabbitmq-0", namespace, 180) {
return false
}
// nacos
ApplyByKubectl(z_dep.NacosApplyFilePath, namespace)
if !DefaultCmiiOperator.PodStatusCheckTimeout("helm-nacos-0", namespace, 180) {
return false
}
}
// frontend
ApplyByKubectl(z_dep.IngresApplyFilePath, namespace)
ApplyByKubectl(z_dep.ConfigMapApplyFilePath, namespace)
ApplyByKubectl(z_dep.FrontendApplyFilePath, namespace)
// backend
ApplyByKubectl(z_dep.BackendApplyFilePath, namespace)
// srs
ApplyByKubectl(z_dep.SRSApplyFilePath, namespace)
return true
}
func clearOldApplyStuff(common *z_dep.CommonEnvironmentConfig, shouldDoCompleteDeploy bool) bool {
oldApplyFilePath := filepath.Join(common.ApplyFilePrefix, "old")
files, err := os.ReadDir(oldApplyFilePath)
if err != nil {
log.ErrorF("failed to read directory: %v", err)
return false
}
if len(files) == 0 {
log.WarnF("no apply file found in %s", common.ApplyFilePrefix)
return false
}
namespace := common.Namespace
for _, fileEntry := range files {
switch fileEntry.Name() {
case z_dep.PVCApplyFileName:
continue
case z_dep.MySQLApplyFileName:
continue
case z_dep.MongoApplyFileName:
continue
case z_dep.RedisApplyFileName:
continue
case z_dep.RabbitMQApplyFileName:
continue
case z_dep.EmqxApplyFileName:
continue
case z_dep.NacosApplyFileName:
continue
case z_dep.ConfigMapApplyFileName:
continue
case z_dep.IngresApplyFileName:
continue
default:
log.InfoF("[clearOldApplyStuff] - delete %s", fileEntry.Name())
DeleteByKubectl(filepath.Join(oldApplyFilePath, fileEntry.Name()), namespace)
}
}
return true
}