[ Agent ] [ CMII ] - 新增大量功能

This commit is contained in:
zeaslity
2024-01-10 15:11:41 +08:00
parent 22faf15665
commit 7ce838289b
10 changed files with 879 additions and 36 deletions

View File

@@ -23,6 +23,77 @@ var CmiiFrontendAppName = []string{
"cmii-uav-platform-visualization",
}
var CmiiBackendAppMap = map[string]int32{
"cmii-admin-data": 2,
"cmii-admin-gateway": 2,
"cmii-admin-user": 2,
"cmii-app-release": 2,
"cmii-open-gateway": 2,
"cmii-suav-supervision": 2,
"cmii-uav-airspace": 2,
"cmii-uav-alarm": 2,
"cmii-uav-autowaypoint": 1,
"cmii-uav-brain": 2,
"cmii-uav-cloud-live": 2,
"cmii-uav-clusters": 0,
"cmii-uav-cms": 2,
"cmii-uav-data-post-process": 2,
"cmii-uav-depotautoreturn": 1,
"cmii-uav-developer": 2,
"cmii-uav-device": 2,
"cmii-uav-emergency": 2,
"cmii-uav-gateway": 2,
"cmii-uav-gis-server": 1,
"cmii-uav-grid-datasource": 2,
"cmii-uav-grid-engine": 2,
"cmii-uav-grid-manage": 2,
"cmii-uav-industrial-portfolio": 2,
"cmii-uav-integration": 2,
"cmii-uav-kpi-monitor": 2,
"cmii-uav-logger": 2,
"cmii-uav-material-warehouse": 2,
"cmii-uav-mission": 2,
"cmii-uav-mqtthandler": 2,
"cmii-uav-notice": 2,
"cmii-uav-oauth": 2,
"cmii-uav-process": 2,
"cmii-uav-surveillance": 2,
"cmii-uav-threedsimulation": 2,
"cmii-uav-tower": 2,
"cmii-uav-user": 2,
"cmii-uav-waypoint": 2,
"helm-live-op-v2": 1,
}
var CmiiFrontendAppMap = map[string]int32{
"cmii-suav-platform-supervision": 1,
"cmii-suav-platform-supervisionh5": 1,
"cmii-uav-platform": 1,
"cmii-uav-platform-ai-brain": 1,
"cmii-uav-platform-armypeople": 1,
"cmii-uav-platform-base": 1,
"cmii-uav-platform-cms-portal": 1,
"cmii-uav-platform-detection": 1,
"cmii-uav-platform-emergency-rescue": 0,
"cmii-uav-platform-hljtt": 1,
"cmii-uav-platform-jiangsuwenlv": 1,
"cmii-uav-platform-logistics": 1,
"cmii-uav-platform-media": 1,
"cmii-uav-platform-multiterminal": 1,
"cmii-uav-platform-mws": 1,
"cmii-uav-platform-oms": 1,
"cmii-uav-platform-open": 1,
"cmii-uav-platform-qingdao": 1,
"cmii-uav-platform-qinghaitourism": 2,
"cmii-uav-platform-security": 1,
"cmii-uav-platform-securityh5": 1,
"cmii-uav-platform-seniclive": 0,
"cmii-uav-platform-share": 1,
"cmii-uav-platform-splice": 1,
"cmii-uav-platform-threedsimulation": 1,
"cmii-uav-platform-visualization": 0,
}
var CmiiBackendAppName = []string{
"cmii-uav-gateway",
"cmii-uav-oauth",

View File

@@ -8,6 +8,7 @@ import (
)
var CmiiOperator = CmiiK8sOperator{}
var updateLogPath = "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\agent-go\\k8s_exec\\log\\cmii-update-log.txt"
// FindDeploymentRestartCountGreaterThanN 重启次数大于N的所有Deployment
func FindDeploymentRestartCountGreaterThanN(cmiiEnv string, restartCount int32) []CmiiDeploymentInterface {
@@ -38,7 +39,7 @@ func FindDeploymentRestartCountGreaterThanN(cmiiEnv string, restartCount int32)
cmiiDeploymentInterface := CmiiDeploymentInterface{}
index := 0
//log.DebugF("[FindDeploymentRestartCountGreaterThanN] - restart map is => %v", restartMap)
log.DebugF("[FindDeploymentRestartCountGreaterThanN] - restart map is => %v", restartMap)
// find deployment convert to interface
for key, value := range restartMap {
deployment := CmiiOperator.DeploymentExist(cmiiEnv, key)
@@ -55,6 +56,22 @@ func FindDeploymentRestartCountGreaterThanN(cmiiEnv string, restartCount int32)
return result[:index]
}
func FindDeploymentReplicasSmallerThanN(cmiiEnv string, replicasMin int32) (deploymentList []CmiiDeploymentInterface) {
// get all deployments
cmiiDeploymentInterfaces := CmiiOperator.DeploymentAllInterface(cmiiEnv)
// filter
for _, deploymentInterface := range cmiiDeploymentInterfaces {
if deploymentInterface.Replicas <= replicasMin {
deploymentList = append(deploymentList, deploymentInterface)
}
}
// convert
return deploymentList
}
func RestartDeploymentFromList(deploymentList []CmiiDeploymentInterface) bool {
result := true
@@ -86,50 +103,147 @@ func RestartCmiiBackendDeployment(cmiiEnv string) {
}
// GetCmiiAllDeploymentFromDemo 从DEMO提取全部的CMII的应用
func GetCmiiAllDeploymentFromDemo() {
allInterface := CmiiOperator.DeploymentAllInterface("demo")
func UpdateCmiiDeploymentImageTag(cmiiEnv, appName, newTag string) bool {
filePath := "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\agent-go\\k8s_exec\\all-cmii-image.txt"
deployment := CmiiOperator.DeploymentExist(cmiiEnv, appName)
if deployment == nil {
log.ErrorF("[UpdateCmiiDeploymentImageTag] - [%s] [%s] not exists !", cmiiEnv, appName)
return false
}
deploymentInterface := CmiiDeploymentInterface{}
cmiiDeploymentInterface := deploymentInterface.Convert(*deployment)
// check if need to update
if cmiiDeploymentInterface.ImageTag == newTag {
log.DebugF("[UpdateCmiiDeploymentImageTag] - [%s] [%s] image tag are the same ! no need to update !", cmiiEnv, appName)
return true
}
content := executor.BasicWordSpaceCompletion(utils.TimeSplitFormatString()+" "+cmiiDeploymentInterface.Namespace, 45)
content = executor.BasicWordSpaceCompletion(content+cmiiDeploymentInterface.Name, 85)
content = executor.BasicWordSpaceCompletion(content+cmiiDeploymentInterface.ImageTag, 105)
content = content + newTag + "\n"
log.DebugF("[UpdateCmiiDeploymentImageTag] - prepare to update [%s]!", content)
// update
tag := CmiiOperator.DeploymentUpdateTag(cmiiEnv, appName, newTag)
if !tag {
log.ErrorF("[UpdateCmiiDeploymentImageTag] - [%s] update failed !", content)
return false
}
// append log
executor.BasicAppendContentToFile(content, updateLogPath)
// re-get from env
time.Sleep(time.Second)
deploy := CmiiOperator.DeploymentOneInterface(cmiiEnv, appName)
if deploy == nil {
log.ErrorF("[UpdateCmiiDeploymentImageTag] - unknown error happened ! [%s] [%s] not exists !", cmiiEnv, appName)
return false
}
// log
log.InfoF("[UpdateCmiiDeploymentImageTag] - [%s] success ! real image tag are [%s] ", content, deploy.Image)
return true
}
func RollBackCmiiDeploymentFromUpdateLog(updateLog string) bool {
if !executor.BasicFindContentInFile(updateLog, updateLogPath) {
log.ErrorF("[RollBackCmiiDeploymentFromUpdateLog] - [%s] no this update log ! use update instead ! => ", updateLog)
return false
}
split := strings.Split(updateLog, " ")
index := 0
cmiiEnv := ""
appName := ""
fromTag := ""
newTag := ""
for _, s := range split {
if s != "" {
if index == 1 {
cmiiEnv = s
} else if index == 2 {
appName = s
} else if index == 3 {
fromTag = s
} else if index == 4 {
newTag = s
}
index++
}
}
log.InfoF("[RollBackCmiiDeploymentFromUpdateLog] - rollback [%s] [%s] from [%s] to [%s]", cmiiEnv, appName, newTag, fromTag)
rollback := UpdateCmiiDeploymentImageTag(cmiiEnv, appName, fromTag)
return rollback
}
// BackupAllDeploymentFromEnv 从DEMO提取全部的CMII的应用
func BackupAllDeploymentFromEnv(cmiiEnv string) bool {
allInterface := CmiiOperator.DeploymentAllInterface(cmiiEnv)
filePath := "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\agent-go\\k8s_exec\\log\\all-" + CmiiOperator.CurrentNamespace + "-" + utils.TimeSplitFormatString() + ".txt"
log.InfoF("[BackupAllDeploymentFromEnv] - backup all image from %s => %s", CmiiOperator.CurrentNamespace, filePath)
firstCol := 0
secondCol := 0
thirdCol := 0
fourthCol := 0
for _, deploymentInterface := range allInterface {
if strings.Contains(deploymentInterface.Name, "proxy") {
continue
}
firstCol = utils.MaxInt(len(deploymentInterface.Name), firstCol)
for name, image := range deploymentInterface.ContainerImageMap {
secondCol = utils.MaxInt(len(name), secondCol)
thirdCol = utils.MaxInt(len(image), thirdCol)
}
secondCol = utils.MaxInt(len(deploymentInterface.ImageTag), secondCol)
thirdCol = utils.MaxInt(len(deploymentInterface.GitBranch), thirdCol)
fourthCol = utils.MaxInt(len(deploymentInterface.GitCommit), fourthCol)
}
firstCol += 4
secondCol += 4
firstCol += 2
secondCol += 2
secondCol += firstCol
thirdCol += 4
thirdCol += 2
thirdCol += secondCol
fourthCol += 2
fourthCol += thirdCol
for _, deploymentInterface := range allInterface {
if strings.Contains(deploymentInterface.Name, "proxy") {
continue
}
content := executor.BasicWordSpaceCompletion(deploymentInterface.Name, firstCol)
content = executor.BasicWordSpaceCompletion(content+deploymentInterface.ImageTag, secondCol)
content = executor.BasicWordSpaceCompletion(content+deploymentInterface.GitBranch, thirdCol)
content = executor.BasicWordSpaceCompletion(content+deploymentInterface.GitCommit, fourthCol)
content += "\n"
for name, image := range deploymentInterface.ContainerImageMap {
content = executor.BasicWordSpaceCompletion(content+name, secondCol)
content = executor.BasicWordSpaceCompletion(content+image, thirdCol)
content += "\n"
if !executor.BasicAppendContentToFile(content, filePath) {
log.ErrorF("[BackupAllDeploymentFromEnv] - write to file %s error with contend %s", filePath, content)
return false
}
if !executor.BasicAppendContentToFile(content, filePath) {
log.ErrorF("[GetCmiiAllDeploymentFromDemo] - write to file %s error with contend %s", filePath, content)
}
}
return true
}
func BackupAllCmiiDeploymentToMap(cmiiEnv string) (backendMap, frontendMap map[string]int32) {
allInterface := CmiiOperator.DeploymentAllInterface(cmiiEnv)
backendMap = make(map[string]int32, len(allInterface))
frontendMap = make(map[string]int32, len(allInterface))
for _, deploymentInterface := range allInterface {
if strings.Contains(deploymentInterface.Name, "platform") {
frontendMap[deploymentInterface.Name] = deploymentInterface.Replicas
} else {
backendMap[deploymentInterface.Name] = deploymentInterface.Replicas
}
}
return backendMap, frontendMap
}

View File

@@ -2,6 +2,7 @@ package k8s_exec
import (
"agent-go/utils"
"github.com/magiconair/properties/assert"
"testing"
)
@@ -17,7 +18,42 @@ func TestFindDeploymentRestartCountGreaterThanN(t *testing.T) {
}
func TestGetCmiiAllDeploymentFromDemo(t *testing.T) {
func TestFindDeploymentReplicasSmallerThanN(t *testing.T) {
deploymentReplicasSmallerThanN := FindDeploymentReplicasSmallerThanN("devflight", 0)
for _, deploymentInterface := range deploymentReplicasSmallerThanN {
println()
utils.BeautifulPrint(deploymentInterface)
println()
}
GetCmiiAllDeploymentFromDemo()
}
func TestGetCmiiAllDeploymentFromEnv(t *testing.T) {
BackupAllDeploymentFromEnv("uat")
}
func TestBackupAllCmiiDeploymentToMap(t *testing.T) {
backendMap, frontendMap := BackupAllCmiiDeploymentToMap("demo")
utils.BeautifulPrint(backendMap)
utils.BeautifulPrint(frontendMap)
}
func TestUpdateCmiiDeploymentImageTag(t *testing.T) {
//tag := UpdateCmiiDeploymentImageTag("devflight", "cmii-uav-depotautoreturn", "123sdsa45678")
tag := UpdateCmiiDeploymentImageTag("demo", "cmii-uav-platform", "5.2.0-011004")
assert.Equal(t, tag, true, "update image tag failed !")
}
func TestRollBackCmiiDeploymentFromUpdateLog(t *testing.T) {
updateLog := RollBackCmiiDeploymentFromUpdateLog("2024-01-10-14-37-07 uavcloud-devflight cmii-uav-depotautoreturn 12345678 123sdsa45678")
assert.Equal(t, updateLog, true, "roll back from update log failed !")
}

View File

@@ -3,6 +3,7 @@ package k8s_exec
import (
v1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"strings"
)
type CmiiInterfaceConvert interface {
@@ -17,6 +18,11 @@ type CmiiPodInterface struct {
HostIP string
NodeName string
RestartCountMap map[string]int32
ContainerName string
Image string
ImageTag string
GitBranch string
GitCommit string
}
type CmiiDeploymentInterface struct {
@@ -25,6 +31,11 @@ type CmiiDeploymentInterface struct {
AvailableReplicas int32
Replicas int32
ContainerImageMap map[string]string
ContainerName string
Image string
ImageTag string
GitBranch string
GitCommit string
StatusOk bool
}
@@ -33,8 +44,24 @@ func (deploy CmiiDeploymentInterface) Convert(deployment v1.Deployment) CmiiDepl
containers := deployment.Spec.Template.Spec.Containers
containerImageMap := make(map[string]string, len(containers))
if len(containers) > 1 {
log.WarnF("[CmiiDeploymentInterface Convert] - deployment [%s] [%s] container greater than one !", deployment.Namespace, deployment.Name)
}
for _, container := range containers {
containerImageMap[container.Name] = container.Image
deploy.Image = container.Image
deploy.ContainerName = container.Name
deploy.ImageTag = strings.Split(container.Image, ":")[1]
for _, envVar := range container.Env {
if strings.HasPrefix(envVar.Name, "GIT_BRANCH") {
deploy.GitBranch = envVar.Value
}
if strings.HasPrefix(envVar.Name, "GIT_COMMIT") {
deploy.GitCommit = envVar.Value
}
}
}
deploy.Name = deployment.Name
@@ -51,12 +78,30 @@ func (pod CmiiPodInterface) Convert(podDetail corev1.Pod) CmiiPodInterface {
containers := podDetail.Spec.Containers
containerImageMap := make(map[string]string, len(containers))
if len(containers) > 1 {
log.WarnF("[CmiiDeploymentInterface Convert] - pod [%s] [%s] container greater than one !", podDetail.Namespace, podDetail.Name)
}
for _, container := range containers {
containerImageMap[container.Name] = container.Image
pod.Image = container.Image
pod.ContainerName = container.Name
pod.ImageTag = strings.Split(container.Image, ":")[1]
for _, envVar := range container.Env {
if strings.HasPrefix(envVar.Name, "GIT_BRANCH") {
pod.GitBranch = envVar.Value
}
if strings.HasPrefix(envVar.Name, "GIT_COMMIT") {
pod.GitCommit = envVar.Value
}
}
}
containerStatuses := podDetail.Status.ContainerStatuses
containerStatusMap := make(map[string]int32, len(containerStatuses))
for _, containerStatus := range containerStatuses {
containerStatusMap[containerStatus.Name] = containerStatus.RestartCount
}

View File

@@ -31,6 +31,7 @@ const (
devOperation = "uavcloud-devoperation"
validation = "uavcloud-feature"
integration = "uavcloud-test"
uat = "uavcloud-uat"
demo = "uavcloud-demo"
workerThread = 4
)
@@ -96,6 +97,10 @@ func (op *CmiiK8sOperator) changeOperatorEnv(cmiiEnv string) {
op.CurrentNamespace = validation
}
if strings.Contains(cmiiEnv, "uat") {
op.CurrentNamespace = uat
}
if strings.Contains(cmiiEnv, "demo") {
op.CurrentNamespace = demo
}
@@ -236,11 +241,24 @@ func (op *CmiiK8sOperator) DeploymentAllInterface(cmiiEnv string) []CmiiDeployme
index := 0
for deployment := range ccc {
// 过滤所有非CMII的内容
if strings.Contains(deployment.Name, "proxy") {
continue
}
if strings.Contains(deployment.Name, "minio") {
continue
}
if strings.HasPrefix(deployment.Name, "helm-live-rtsp") {
continue
}
if strings.Contains(deployment.Name, "nfs") {
continue
}
results[index] = deployment
index++
}
return results
return results[:index]
}
func (op *CmiiK8sOperator) DeploymentFizz(cmiiEnv, appFizz string) (fizzDeployment []v1.Deployment) {
@@ -262,7 +280,7 @@ func (op *CmiiK8sOperator) DeploymentFizz(cmiiEnv, appFizz string) (fizzDeployme
}
func (op *CmiiK8sOperator) DeploymentExist(cmiiEnv, appName string) (exists *v1.Deployment) {
op.changeOperatorEnv(cmiiEnv)
client := op.CurrentClient
deployment, err := client.AppsV1().Deployments(op.CurrentNamespace).Get(context.TODO(), appName, metav1.GetOptions{})
@@ -273,6 +291,23 @@ func (op *CmiiK8sOperator) DeploymentExist(cmiiEnv, appName string) (exists *v1.
return deployment
}
func (op *CmiiK8sOperator) DeploymentOneInterface(cmiiEnv, appName string) (deploy *CmiiDeploymentInterface) {
op.changeOperatorEnv(cmiiEnv)
client := op.CurrentClient
deploymentInterface := CmiiDeploymentInterface{}
deployment, err := client.AppsV1().Deployments(op.CurrentNamespace).Get(context.TODO(), appName, metav1.GetOptions{})
if err != nil {
log.ErrorF("[DeploymentExist] - deployments [%s] [%s] not exists ! %s", cmiiEnv, appName, err.Error())
return nil
}
convert := deploymentInterface.Convert(*deployment)
return &convert
}
func (op *CmiiK8sOperator) DeploymentScale(cmiiEnv, appFizz string, scaleCount int32) bool {
deploymentFizz := op.DeploymentFizz(cmiiEnv, appFizz)
@@ -309,6 +344,41 @@ func (op *CmiiK8sOperator) DeploymentScale(cmiiEnv, appFizz string, scaleCount i
return true
}
func (op *CmiiK8sOperator) DeploymentUpdateTag(cmiiEnv, appName, newTag string) bool {
if newTag == "" {
log.WarnF("[DeploymentUpdateTag] - can not update image tag to null!")
return false
}
deployment := op.DeploymentExist(cmiiEnv, appName)
if deployment == nil {
return false
}
containers := deployment.Spec.Template.Spec.Containers
if len(containers) == 1 {
// only update this kind
container := containers[0]
split := strings.Split(container.Image, ":")
container.Image = split[0] + ":" + newTag
log.InfoF("[DeploymentUpdateTag] - update [%s] [%s] from [%s] to [%s]", op.CurrentNamespace, appName, split[1], container.Image)
// re assign
deployment.Spec.Template.Spec.Containers[0] = container
// update
_, err := op.CurrentClient.AppsV1().Deployments(deployment.Namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{})
if err != nil {
log.ErrorF("[DeploymentUpdateTag] - update [%s] [%s] from [%s] to [%s] error ! %s", op.CurrentNamespace, appName, split[1], container.Image, err.Error())
return false
}
}
return true
}
func (op *CmiiK8sOperator) ReplicaSet(cmiiEnv, replicaSetName string) *v1.ReplicaSet {
op.changeOperatorEnv(cmiiEnv)

View File

@@ -52,15 +52,17 @@ func TestCmiiK8sOperator_DeploymentAllInterface(t *testing.T) {
func TestCmiiK8sOperator_DeploymentFizz(t *testing.T) {
start := time.Now()
deploymentFizz := CmiiOperator.DeploymentFizz("devflight", "")
deploymentFizz := CmiiOperator.DeploymentFizz("demo", "cmii-uav-platform")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
t.Logf("deployment list lenght is => %d", len(deploymentFizz))
deploymentInterface := CmiiDeploymentInterface{}
cmiiDeploymentInterface := CmiiDeploymentInterface{}
for _, pod := range deploymentFizz {
convert := deploymentInterface.Convert(pod)
utils.BeautifulPrint(pod)
convert := cmiiDeploymentInterface.Convert(pod)
utils.BeautifulPrint(convert)
}
@@ -71,12 +73,29 @@ func TestCmiiK8sOperator_DeploymentFizz(t *testing.T) {
func TestCmiiK8sOperator_DeploymentScale(t *testing.T) {
start := time.Now()
CmiiOperator.DeploymentScale("devflight", "cmii-uav-gis-server", 0)
CmiiOperator.DeploymentScale("devflight", "cmii-uav-gis-server", 1)
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
}
func TestCmiiK8sOperator_DeploymentUpdateTag(t *testing.T) {
start := time.Now()
CmiiOperator.DeploymentUpdateTag("demo", "cmii-uav-platform", "5.2.0-011001")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
}
func TestCmiiK8sOperator_DeploymentOneInterface(t *testing.T) {
start := time.Now()
deploy := CmiiOperator.DeploymentOneInterface("devflight", "cmii-uav-depotautoreturn")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
utils.BeautifulPrint(*deploy)
}
func TestCmiiK8sOperator_PodAll(t *testing.T) {
start := time.Now()
podList := CmiiOperator.PodAll("devflight")
@@ -93,16 +112,18 @@ func TestCmiiK8sOperator_PodAll(t *testing.T) {
func TestCmiiK8sOperator_PodFizz(t *testing.T) {
start := time.Now()
podList := CmiiOperator.PodFizz("devflight", "notice")
podList := CmiiOperator.PodFizz("devflight", "cmii-uav-depotautoreturn")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
t.Logf("pod list lenght is => %d", len(podList))
cmiiPodInterface := CmiiPodInterface{}
for _, pod := range podList {
println()
utils.BeautifulPrint(pod)
println()
break
convert := cmiiPodInterface.Convert(pod)
utils.BeautifulPrint(convert)
}
}