初始化项目

This commit is contained in:
zeaslity
2025-03-27 16:09:20 +08:00
parent e09a32d1e8
commit fc2d585489
709 changed files with 516391 additions and 0 deletions

View File

@@ -0,0 +1,312 @@
package main
import (
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"wdd.io/agent-common/logger"
image2 "wdd.io/agent-common/image"
"wdd.io/agent-common/utils"
agentdeploy "wdd.io/agent-deploy"
"wdd.io/agent-deploy/z_dep"
"wdd.io/agent-operator/image"
)
var DeployFilePrefix = "/root/wddproject/ProjectOctopus/agent-common/real_project/"
var log = logger.Log
func init() {
switch runtime.GOOS {
case "linux":
DeployFilePrefix = "/root/wddproject/ProjectOctopus/agent-common/real_project/"
case "windows":
DeployFilePrefix = "C:\\Users\\wdd\\Documents\\IdeaProjects\\ProjectOctopus\\agent-common\\real_project\\"
//DeployFilePrefix = "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\agent-common\\real_project\\"
}
}
// CmiiEnvDeploy 根据特定的环境复制一份部署清单复制Cmii App的部署 shouldDoCompleteDeploy决定是否生成其他的应用
func CmiiEnvDeploy(
deployCommonEnv *z_dep.CommonEnvironmentConfig,
shouldDoCompleteDeploy bool,
backupFromEnv string,
) {
folderPrefix := DeployFilePrefix + 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
deployCommonEnv.TenantEnv = tenantEnv
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 CmiiEnvDeployOffline(deployCommonEnv *z_dep.CommonEnvironmentConfig, shouldDoCompleteDeploy bool, allCmiiImageList []string) {
folderPrefix := DeployFilePrefix + 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
deployCommonEnv.TenantEnv = tenantEnv
var backendMap map[string]string
var frontendMap map[string]string
var srsMap map[string]string
// 输出特定版本的Tag
cmiiImageVersionMap := image2.CmiiImageMapFromImageFullNameList(allCmiiImageList)
frontendMap, backendMap, srsMap = image2.FrontendBackendSrsImageMapFromCmiiImageMap(cmiiImageVersionMap)
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, newAppNamespace string) {
folderPrefix := DeployFilePrefix + 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
deployCommonEnv.TenantEnv = tenantEnv
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, 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
}

View File

@@ -0,0 +1,18 @@
# 新增应用的流程
---
## 前端
1. agent-deploy/d_app/CmiiImageConfig.go 新增应用名称CmiiFrontendAppMap
2. agent-deploy/d_app/FrontendConfigMap.go 新增 短名称FrontendShortNameMaps ClientId的内容FrontendClientIdMaps
## 后段
1. agent-deploy/d_app/CmiiImageConfig.go 新增应用名称CmiiBackendAppMap
---
# CmiiEnvDeploy
1.

View File

@@ -0,0 +1,486 @@
package main
import (
"testing"
"wdd.io/agent-operator/config"
image2 "wdd.io/agent-common/image"
"wdd.io/agent-common/real_project"
"wdd.io/agent-common/real_project/zhejianyidong_erjipingtai"
"wdd.io/agent-deploy/z_dep"
)
func TestCmiiEnvDeploy(t *testing.T) {
// dev
// devflight
// devoperation
deployNamespace := config.DevFlight
// deploy to cmii environment
cmiiDeployCommonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "lab.uavcmlc.com",
WebPort: "",
HarborIPOrCustomImagePrefix: image2.CmiiHarborPrefix,
HarborPort: "",
Namespace: deployNamespace,
TagVersion: "6.2.0",
TenantEnv: "devflight",
MinioPublicIP: "",
MinioInnerIP: "127.0.0.1",
NFSServerIP: "123.0.0.1",
ApplyFilePrefix: "",
}
CmiiEnvDeploy(cmiiDeployCommonEnv, false, deployNamespace)
}
func TestCmiiEnvDeploy_ChongQingSanHua(t *testing.T) {
// chongqing sanhua
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "36.133.115.164",
WebPort: "58888",
HarborIPOrCustomImagePrefix: "chongqingcis-9b4a3da9.ecis.chongqing-1.cmecloud.cn/cmii/",
HarborPort: "",
Namespace: "wrj",
TagVersion: "5.6.0",
}
CmiiEnvDeploy(commonEnv, true, config.Demo)
}
func TestCmiiEnvDeploy_JiangSuNanTongErJiPingTai(t *testing.T) {
// 江苏南通二级平台 2025-01
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "10.40.51.5",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "10.40.51.5",
HarborPort: "8033",
Namespace: "jsntejpt",
TagVersion: "6.1.0",
TenantEnv: "",
MinioPublicIP: "10.40.51.5",
MinioInnerIP: "10.40.51.5",
NFSServerIP: "10.40.51.5",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii611ImageList)
}
func TestCmiiEnvDeploy_ShenZhenGuiZiXiangMu(t *testing.T) {
// 深证规自项目 2025-02
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "172.31.2.7",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "172.31.2.7",
HarborPort: "8033/admin",
Namespace: "szgz",
TagVersion: "6.2.0",
TenantEnv: "",
MinioPublicIP: "172.31.2.9",
MinioInnerIP: "172.31.2.9",
NFSServerIP: "172.31.2.9",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii620ArmImageList)
}
func TestCmiiEnvDeploy_LiuXiTongGan(t *testing.T) {
// 刘喜通感
// 修改
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "10.250.0.200",
WebPort: "8888",
HarborIPOrCustomImagePrefix: "10.250.0.200",
HarborPort: "8033",
Namespace: "xmyd_6.0.0",
TagVersion: "5.6.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "",
NFSServerIP: "10.250.0.200",
ApplyFilePrefix: "",
}
CmiiEnvDeploy(commonEnv, true, config.Demo)
}
func TestCmiiEnvDeploy_ZheJiangYiDongErJiPingTai(t *testing.T) {
// 浙江移动二级平台
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "111.2.224.59",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "192.168.10.3",
HarborPort: "8033",
Namespace: "zjyd",
TagVersion: "5.7.0",
NFSServerIP: "192.168.10.3",
MinioInnerIP: "192.168.10.2",
}
CmiiEnvDeployOffline(commonEnv, true, zhejianyidong_erjipingtai.Cmii570ImageList)
}
func TestCmiiEnvDeploy_ZiyangTongGan(t *testing.T) {
// 资阳通感
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "80.192.1.46",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "80.192.1.46",
HarborPort: "8033",
Namespace: "zygajg",
TagVersion: "6.0.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "80.192.1.48",
NFSServerIP: "80.192.1.48",
ApplyFilePrefix: "/root/wddproject/ProjectOctopus/agent-common/real_project/zygajg",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii600ImageList)
}
func TestCmiiEnvDeploy_JiChengCeShiHuanJing(t *testing.T) {
// 2024上线测试-集成测试环境
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "integration.uavcmlc.com",
WebPort: "",
HarborIPOrCustomImagePrefix: image2.CmiiHarborPrefix,
HarborPort: "",
Namespace: "uavcloud-dev",
TagVersion: "6.0.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "minio.ig-dev.uavcmlc.com",
NFSServerIP: "10.40.51.5",
ApplyFilePrefix: "",
}
CmiiEnvDeploy(commonEnv, false, "")
}
func TestCmiiEnvDeploy_XinDEMO(t *testing.T) {
// 202501 新DEMO
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "www.demo.uavcmlc.com",
WebPort: "",
HarborIPOrCustomImagePrefix: image2.CmiiHarborPrefix,
HarborPort: "",
Namespace: "uavcloud-demo",
TagVersion: "6.2.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "192.168.118.15",
NFSServerIP: "192.168.118.15",
ApplyFilePrefix: "",
}
CmiiEnvDeploy(commonEnv, true, "")
}
func TestCmiiEnvDeploy_JiangXiOldShengJi(t *testing.T) {
// 江西 旧平台 升级
// 2025年2月20日
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "36.138.132.240",
WebPort: "30800",
HarborIPOrCustomImagePrefix: "10.20.1.130",
HarborPort: "8033",
Namespace: "jxyd",
TagVersion: "6.2.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "10.20.1.132",
NFSServerIP: "10.20.1.132",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii620ImageList)
}
func TestCmiiEnvDeploy_JiangXiTongGanErJiPingTai(t *testing.T) {
// 江西同感二级平台
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "36.138.111.244",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "10.20.1.135",
HarborPort: "8033",
Namespace: "jxejpt",
TagVersion: "6.0.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "10.20.1.139",
NFSServerIP: "10.20.1.135",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii600ImageList)
}
func TestCmiiEnvDeploy_ShangDongErJiPingTai(t *testing.T) {
// 山东二级平台
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "134.80.124.6",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "134.80.124.7",
HarborPort: "8033",
Namespace: "sdejpt",
TagVersion: "6.0.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "134.80.124.15",
NFSServerIP: "134.80.124.21",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii600ImageList)
}
func TestCmiiEnvDeploy_JiangSuNanTong(t *testing.T) {
// 江苏南通
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "10.40.51.5",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "10.40.51.5",
HarborPort: "8033",
Namespace: "jsntejpt",
TagVersion: "5.7.0",
NFSServerIP: "10.40.51.5",
MinioInnerIP: "10.40.51.5",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii570ImageList)
}
func TestCmiiEnvDeploy_ChongQingErJiPingTai(t *testing.T) {
// 江苏南通
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "36.133.115.174",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "chongqingshcis-a189ec98.ecis.chongqing-1.cmecloud.cn/cmii/",
HarborPort: "",
Namespace: "cqejpt",
TagVersion: "5.7.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "192.168.9.11",
NFSServerIP: "192.168.9.11",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii570ImageList)
}
func TestCmiiEnvDeploy_YunNanErJiPingTai(t *testing.T) {
// 江苏南通
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "36.147.6.78",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "192.168.118.14",
HarborPort: "8033",
Namespace: "ynejpt",
TagVersion: "5.7.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "192.168.118.15",
NFSServerIP: "192.168.118.15",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii570ImageList)
}
func TestCmiiEnvDeploy_LiaoNingYingJiPingTai(t *testing.T) {
// 辽宁应急
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "120.201.112.20",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "192.168.40.42",
HarborPort: "8033",
Namespace: "lnydyj",
TagVersion: "6.2.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "192.168.40.193",
NFSServerIP: "192.168.40.193",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii620ImageList)
}
func TestCmiiEnvDeploy_NeiMengGuEErDuoSiJiChang(t *testing.T) {
// 内蒙古鄂尔多斯
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "172.16.100.55",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "172.16.100.55",
HarborPort: "8033",
Namespace: "eedsjc-uavms",
TagVersion: "6.2.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "172.16.100.61",
NFSServerIP: "172.16.100.61",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii620ImageList)
}
func TestCmiiEnvDeploy_ZhuHaiHengQing(t *testing.T) {
// 珠海横琴
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "10.129.80.218",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "10.129.80.218",
HarborPort: "8033",
Namespace: "zhhq",
TagVersion: "6.0.0",
TenantEnv: "",
MinioPublicIP: "10.129.80.223",
MinioInnerIP: "10.129.80.223",
NFSServerIP: "10.129.80.217",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii600ImageList)
}
func TestCmiiEnvDeploy_ZheJiangErJiPingTai(t *testing.T) {
// 浙江二级平台扩容
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "111.2.224.59",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "192.168.10.3",
HarborPort: "8033",
Namespace: "zjejpt",
TagVersion: "6.1.0",
TenantEnv: "",
MinioPublicIP: "192.168.10.2",
MinioInnerIP: "192.168.10.2",
NFSServerIP: "192.168.10.2",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii611ImageList)
}
func TestCmiiEnvDeploy_JiLinYiDong(t *testing.T) {
// 吉林移动
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "36.135.17.162",
WebPort: "8888",
HarborIPOrCustomImagePrefix: "172.18.10.251",
HarborPort: "8033",
Namespace: "jlyd",
TagVersion: "5.8.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "192.168.118.15",
NFSServerIP: "192.168.118.15",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii580ImageList)
}
func TestCmiiEnvDeploy_GanSuErJiPingTai(t *testing.T) {
// 甘肃二级平台
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "117.156.17.88",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "10.215.66.85",
HarborPort: "8033",
Namespace: "gsyd-app",
TagVersion: "6.1.1",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "10.215.66.89",
NFSServerIP: "10.215.66.89",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii611ImageList)
}
func TestCmiiEnvDeploy_YunNanErJiXin(t *testing.T) {
// 云南二级平台-新
commonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "39.129.174.66",
WebPort: "8088",
HarborIPOrCustomImagePrefix: "192.168.186.11",
HarborPort: "8033",
Namespace: "ynydapp",
TagVersion: "6.1.0",
TenantEnv: "",
MinioPublicIP: "",
MinioInnerIP: "192.168.186.15",
NFSServerIP: "192.168.186.15",
ApplyFilePrefix: "",
}
CmiiEnvDeployOffline(commonEnv, true, real_project.Cmii611ImageList)
}
func TestCmiiNewAppDeploy(t *testing.T) {
deployNamespace := config.DevOperation
// deploy to cmii environment
cmiiDeployCommonEnv := &z_dep.CommonEnvironmentConfig{
WebIP: "lab.uavcmlc.com",
WebPort: "",
HarborIPOrCustomImagePrefix: image2.CmiiHarborPrefix,
HarborPort: "",
Namespace: deployNamespace,
TagVersion: "5.6.0",
}
CmiiNewAppDeploy(cmiiDeployCommonEnv, deployNamespace)
}

View File

@@ -0,0 +1,719 @@
package main
import (
"errors"
"os"
"path/filepath"
"slices"
"strings"
image2 "wdd.io/agent-common/image"
"wdd.io/agent-common/utils"
"wdd.io/agent-deploy/d_app"
"wdd.io/agent-operator/config"
"wdd.io/agent-operator/image"
"wdd.io/agent-operator/minio"
)
const (
OfflineDeployHarborHost = "harbor.wdd.io"
PublicDeployHarborHost = "42.192.52.227"
DirectPushDeployHarborHost = "chongqingcis-9b4a3da9.ecis.chongqing-1.cmecloud.cn"
AllCmiiImageListLocalFileName = "all-cmii-image-list.txt"
AllGzipImageLocalFileName = "all-gzip-image-list.txt"
)
type ImageSyncEntity struct {
DownloadCondition *DownloadEntity // D的条件
CompressCondition *CompressEntity // C的条件
UploadCondition *UploadEntity // U的条件
ShouldDownloadFromOss bool // 下载镜像 DLTU中的D
ShouldUpdateImageTag bool // 更新镜像 DLTU中的U
ShouldDirectPushToHarbor bool // 直接推送到对方的主机 || 离线部署机
DirectHarborHost string // IP:Port or 域名:PORT 不带http前缀
}
// DownloadEntity DCU中的D的条件
type DownloadEntity struct {
ShouldDownloadImage bool // 下载镜像 DCU中的D 实际无用
ProjectName string // 优先级3 优先级最低 从DEMO拉取镜像
ProjectVersion string // 优先级2 高于ProjectName 优先拉取特定版本的镜像
CmiiNameTagList []string // 优先级1 appName:tag 会被转换为FullNameImageList
FullNameImageList []string // 优先级1 优先下载此类型
DownloadAuthUserName string // 下载需要认证的用户名
DownloadAuthPassword string // 下载需要认证的密码
}
// CompressEntity DCU中的C的条件
type CompressEntity struct {
ShouldCompressImageToGzip bool // 压缩镜像 DCU中的C
ShouldGzipSplit bool // 压缩镜像 是否应该分割存储 true=独立存储 false=整个存储
GzipLocalFolder string // 压缩镜像 保存压缩镜像文件的本地目录
}
// UploadEntity DCU中的U的条件
type UploadEntity struct {
ShouldUploadToDemoMinio bool // 上传镜像 DCU中的U
}
type DirectPushResultEntity struct {
ErrorPushedImageList []string
}
type ImageSyncResult struct {
ProcedureSuccessImageList []string // 经过特定步骤之后成功的镜像
DownloadResult *DownloadResultEntity
CompressResult *CompressResultEntity
UploadResult *UploadResultEntity
DirectPushResult *DirectPushResultEntity
}
type DownloadResultEntity struct {
ErrorPullImageList []string // 下载镜像 DCU中的D 下载失败的镜像
SuccessPullImageList []string // 下载镜像 DCU中的D 下载成功的镜像
SuccessPullTxtFileLocalFullPath string // 下载镜像 DCU中的D 下载成功的镜像保存的文件地址 GzipLocalFolder + all
}
type CompressResultEntity struct {
ErrorGzipImageList []string // 压缩镜像 DCU中的C 压缩失败的镜像
SuccessGzipImageList []string // 压缩镜像 DCU中的C 压缩成功的镜像
GzipTxtFileLocalFullPath string // 压缩镜像 DCU中的C 压缩镜像保存的目录
}
type UploadResultEntity struct {
ErrorUploadImageList []string // 上传镜像 DCU中的U 上传失败的镜像
AllDownloadUrl []string // 上传镜像 DCU中的U 正式的下载地址列表i
}
// PullFromEntityAndSyncConditionally 根据ImageSyncEntity拉取特定的镜像然后上传到特定的目标机器(或者上传的minio中)
func (syncCondition *ImageSyncEntity) PullFromEntityAndSyncConditionally() (imageSyncResult *ImageSyncResult) {
// 初始化 imageSync
imageSyncResult = &ImageSyncResult{
ProcedureSuccessImageList: nil,
DownloadResult: &DownloadResultEntity{
ErrorPullImageList: nil,
SuccessPullImageList: nil,
SuccessPullTxtFileLocalFullPath: "",
},
CompressResult: &CompressResultEntity{
ErrorGzipImageList: nil,
SuccessGzipImageList: nil,
GzipTxtFileLocalFullPath: "",
},
UploadResult: &UploadResultEntity{
ErrorUploadImageList: nil,
AllDownloadUrl: nil,
},
DirectPushResult: &DirectPushResultEntity{
ErrorPushedImageList: nil,
},
}
if (syncCondition.DownloadCondition.CmiiNameTagList == nil && syncCondition.DownloadCondition.FullNameImageList == nil) || (len(syncCondition.DownloadCondition.CmiiNameTagList) == 0 && len(syncCondition.DownloadCondition.FullNameImageList) == 0) {
// 没有指定特定的镜像,那么根据 ProjectVersion 或者从DEMO拉取镜像
// pull images
// compress
if syncCondition.DownloadCondition.ProjectVersion != "" {
// 获取特定版本的镜像
C_DownloadCompressUploadFromVersion(syncCondition, imageSyncResult)
} else {
// 获取DEMO的镜像
C_DownloadCompressUploadFromDemo(syncCondition, imageSyncResult)
}
} else {
// 根据列表拉取镜像
// 组装镜像名称
syncCondition.DownloadCondition.FullNameImageList = concatAndUniformCmiiImage(syncCondition.DownloadCondition.FullNameImageList, syncCondition.DownloadCondition.CmiiNameTagList)
// gzip file folder path
syncCondition.CompressCondition.GzipLocalFolder = filepath.Join(image.OfflineImageGzipFolderPrefix, "tmp")
// DCU
A_DownloadCompressUpload(syncCondition, imageSyncResult)
}
// 直接传输到目标Harbor仓库
if syncCondition.ShouldDirectPushToHarbor {
if syncCondition.DirectHarborHost == "" {
log.ErrorF("DirectHarborHost is null ! can't push to target harbor !")
}
// push to
imageSyncResult.DirectPushResult.ErrorPushedImageList = image.TagFromListAndPushToCHarbor(imageSyncResult.ProcedureSuccessImageList, syncCondition.DirectHarborHost)
}
// build result
return imageSyncResult
}
func concatAndUniformCmiiImage(fullImageList []string, cmiiImageList []string) []string {
if cmiiImageList != nil || len(cmiiImageList) > 0 {
// cmiiImageList has content
if fullImageList == nil {
fullImageList = []string{}
}
for _, cmiiImage := range cmiiImageList {
fullImageList = append(fullImageList, image2.CmiiHarborPrefix+cmiiImage)
}
}
return fullImageList
}
// A_DownloadCompressUpload DCU 镜像同步的前半部分通常在35.71 LapPro执行无需Bastion Mode
func A_DownloadCompressUpload(syncEntity *ImageSyncEntity, syncResult *ImageSyncResult) {
// all image full name list need to download
fullNameList := syncEntity.DownloadCondition.FullNameImageList
// Download
log.Info("[DCU] - DOWNLOAD START !")
if syncEntity.DownloadCondition.ShouldDownloadImage && fullNameList != nil && len(fullNameList) > 0 {
syncResult.DownloadResult.ErrorPullImageList = image.PullFromFullNameList(fullNameList)
// remove failed download image from full name list
fullNameList = slices.DeleteFunc(fullNameList, func(imageName string) bool {
return slices.Contains(syncResult.DownloadResult.ErrorPullImageList, imageName)
})
} else {
log.Info("[DCU] - No Need To Download !")
}
syncResult.ProcedureSuccessImageList = fullNameList
gzipLocalFolderPath := syncEntity.CompressCondition.GzipLocalFolder
localGzipFileListTxt := filepath.Join(gzipLocalFolderPath, AllGzipImageLocalFileName)
// Compress
if syncEntity.CompressCondition.ShouldCompressImageToGzip {
// 移除Gzip的txt
_ = os.Remove(localGzipFileListTxt)
// 找到已经存在的压缩文件,跳过
gzipFileAlready := make(map[string]bool)
if utils.FileOrFolderExists(gzipLocalFolderPath) {
dir, _ := os.ReadDir(gzipLocalFolderPath)
for _, entry := range dir {
if entry.IsDir() {
continue
}
gzipFileAlready[strings.TrimPrefix(entry.Name(), gzipLocalFolderPath)] = true
}
}
// mkdir folder
err := os.MkdirAll(gzipLocalFolderPath, os.ModeDir)
if err != nil {
if !errors.Is(err, os.ErrExist) {
log.ErrorF("create folder error of %s", gzipLocalFolderPath)
panic(err)
}
}
// 循环遍历压缩
log.Info("[DCU] - COMPRESS START")
var errorGzipImageList []string
var allGzipFileFullNameList []string
if syncEntity.CompressCondition.ShouldGzipSplit {
// 独立压缩
for _, imageFullName := range fullNameList {
// gzip image file already exists
gzipFileName := image2.ImageFullNameToGzipFileName(imageFullName)
gzipImageFileFullPath := gzipLocalFolderPath + gzipFileName
_, ok := gzipFileAlready[gzipFileName]
if len(gzipFileAlready) > 0 && ok {
log.DebugF("gzip file %s already exists !", gzipFileName)
} else {
ok, gzipImageFileFullPath = image.SaveToGzipFile(imageFullName, gzipLocalFolderPath)
if !ok {
errorGzipImageList = append(errorGzipImageList, imageFullName)
continue
}
}
// 压缩成功
allGzipFileFullNameList = append(allGzipFileFullNameList, gzipImageFileFullPath)
}
syncResult.CompressResult.SuccessGzipImageList = allGzipFileFullNameList
syncResult.CompressResult.ErrorGzipImageList = errorGzipImageList
// remove failed
fullNameList = slices.DeleteFunc(fullNameList, func(imageName string) bool {
return slices.Contains(errorGzipImageList, imageName)
})
// write all gzipped file name to file
for _, gzipFileFullName := range allGzipFileFullNameList {
utils.AppendContentToFile(
strings.TrimPrefix(strings.TrimPrefix(gzipFileFullName, gzipLocalFolderPath), "/")+"\n",
localGzipFileListTxt,
)
}
} else {
// 压缩为一个大的压缩包
gzipFileName := generateMonolithicGzipFileName(syncEntity)
ok, gzipFileFullPath, errorGzipImageListTmp := image.SaveImageListToGzipFile(fullNameList, gzipLocalFolderPath, gzipFileName)
if !ok {
panic("[DCU] - gzip error to a monolithic file !")
}
// write all gzipped file name to file
utils.AppendOverwriteListContentToFile(fullNameList, localGzipFileListTxt)
// remove failed
fullNameList = slices.DeleteFunc(fullNameList, func(imageName string) bool {
return slices.Contains(errorGzipImageListTmp, imageName)
})
syncResult.CompressResult.SuccessGzipImageList = fullNameList
syncResult.CompressResult.ErrorGzipImageList = errorGzipImageListTmp
log.InfoF("[DCU] - gzip all image from list to monolithic file %s", gzipFileFullPath)
}
syncResult.CompressResult.GzipTxtFileLocalFullPath = localGzipFileListTxt
log.InfoF("[DCU] - all gzip file name list is %s", localGzipFileListTxt)
}
syncResult.ProcedureSuccessImageList = fullNameList
// Upload
if syncEntity.UploadCondition.ShouldUploadToDemoMinio {
//uploadGzipFileToDemoMinio()
// get gzip file name list
log.Info("[DCU] - UPLOAD OSS START !")
if !syncEntity.CompressCondition.ShouldCompressImageToGzip {
// 没有压缩指令 直接上传已有的内容
allFileInGzipFile, err := utils.ListAllFileInFolderWithFullPath(gzipLocalFolderPath)
if err != nil {
log.ErrorF("[DCU] - list all gzip file error !")
return
}
for _, f := range allFileInGzipFile {
if strings.HasSuffix(f, "tar.gz") {
syncResult.CompressResult.SuccessGzipImageList = append(syncResult.CompressResult.SuccessGzipImageList, f)
}
}
}
var errorUploadOssGzipNameList []string
var allDownloadUrl []string
// start to upload
// extract demo oss location suffix from gzipFolderFullPath
// 根据本地保存Gzip的目录路径提取到 相应的后缀 项目代码
// projectName / projectVersion
projectUniqueName := strings.TrimPrefix(gzipLocalFolderPath, image.OfflineImageGzipFolderPrefix)
projectUniqueName = strings.TrimSuffix(projectUniqueName, "/")
bucketNameWithPrefix := "cmlc-installation/" + projectUniqueName
log.InfoF("gzip file location in demo oss is %s", minio.DefaultDemoEndpoint+"/"+bucketNameWithPrefix)
// 上传所有的压缩文件名称
if !minio.DefaultCmiiMinioOperator.UploadToDemo(bucketNameWithPrefix, gzipLocalFolderPath, AllGzipImageLocalFileName) {
log.ErrorF("upload of %s to demo oss error !", AllGzipImageLocalFileName)
}
// 上传所有的镜像名称
if !minio.DefaultCmiiMinioOperator.UploadToDemo(bucketNameWithPrefix, gzipLocalFolderPath, AllCmiiImageListLocalFileName) {
log.ErrorF("upload of %s to demo oss error !", AllCmiiImageListLocalFileName)
}
log.InfoF("upload all gzip file to demo oss !")
for _, gzipFileFullName := range syncResult.CompressResult.SuccessGzipImageList {
// SaveToGzipFile 返回的是全路径 归一化处理 gzip file name
gzipFileName := strings.TrimPrefix(gzipFileFullName, gzipLocalFolderPath)
gzipFileName = strings.TrimPrefix(gzipFileName, "/")
if !minio.DefaultCmiiMinioOperator.UploadToDemo(bucketNameWithPrefix, gzipLocalFolderPath, gzipFileName) {
log.ErrorF("upload of %s to demo oss error !", gzipFileName)
errorUploadOssGzipNameList = append(errorUploadOssGzipNameList, gzipFileName)
} else {
allDownloadUrl = append(allDownloadUrl, minio.DefaultDemoEndpoint+"/"+bucketNameWithPrefix+"/"+gzipFileName)
}
}
syncResult.UploadResult.AllDownloadUrl = allDownloadUrl
syncResult.UploadResult.ErrorUploadImageList = errorUploadOssGzipNameList
}
utils.AppendContentToFile(utils.BeautifulPrintToString(syncResult), filepath.Join(gzipLocalFolderPath, utils.TimeSplitFormatString()+".json"))
}
func generateMonolithicGzipFileName(syncEntity *ImageSyncEntity) string {
return strings.TrimPrefix(syncEntity.CompressCondition.GzipLocalFolder, image.OfflineImageGzipFolderPrefix) + ".tar.gz"
}
// A_DownloadLoadTagUpload DLTU procedure ImageSync的另外一般流程需要支持 堡垒机(纯离线)的模式
// 2. Gzip文件目录RKE MIDDLE CMII三个文件目录 - 约定目录
// 约定目录 /root/wdd/image/rke/ /root/wdd/image/middle/ /root/wdd/image/cmii/
// 3. 读取本机的IP地址 - 参数传递
// 4. OSS地址 - ossUrlPrefix传空 则使用默认值
// 5. ossFileName - 如果结尾为txt则为文件的形式如果为tar.gz则为gzip文件夹的形式
func A_DownloadLoadTagUpload(downloadFromOss bool, ossUrlPrefix, ossFileNameOrGzipFileListTxt, localGzipFolderOrGzipFile string, targetHarborFullName string) (targetImageFullNameList []string) {
// 支持单文件的形式
if !utils.IsDirOrFile(localGzipFolderOrGzipFile) {
// 单个压缩文件 肯定是离线的形式
if !strings.HasSuffix(localGzipFolderOrGzipFile, ".tar.gz") {
log.ErrorF("local gzip file %s is not a .tar.gz file !", localGzipFolderOrGzipFile)
return nil
}
// load
image.LoadFromGzipFilePath(localGzipFolderOrGzipFile)
} else {
separator := os.PathSeparator
if !strings.HasSuffix(localGzipFolderOrGzipFile, string(separator)) {
localGzipFolderOrGzipFile += string(separator)
}
// download
if downloadFromOss {
if !parseAndDownloadFromOss(ossUrlPrefix, ossFileNameOrGzipFileListTxt, localGzipFolderOrGzipFile) {
log.ErrorF("download from oss error !")
return nil
}
}
// load
loadAllGzipImageFromLocalFolder(localGzipFolderOrGzipFile)
}
// tag
// push
allFileInFolder, err := utils.ListAllFileInFolder(localGzipFolderOrGzipFile)
if err != nil {
return nil
}
for _, gzipFileName := range allFileInFolder {
// 过滤非.tar.gz结尾的文件
if !strings.HasSuffix(gzipFileName, ".tar.gz") {
continue
}
log.DebugF("gzip file name is %s", gzipFileName)
// gzip to image full name 拿到镜像的原始名称
imageFullName := image2.GzipFileNameToImageFullName(gzipFileName)
if imageFullName == "" {
log.ErrorF("gzip file %s to image full name error !", gzipFileName)
continue
}
// tag 拿到目标名称 然后重新Tag
targetImageFullName := image2.ImageNameToTargetImageFullName(imageFullName, targetHarborFullName)
image.TagFromSourceToTarget(imageFullName, targetImageFullName)
// uploadToHarbor 上传到目标Harbor
if image.UploadToHarbor(targetImageFullName) {
targetImageFullNameList = append(targetImageFullNameList, targetImageFullName)
} else {
log.ErrorF("upload to harbor error of %s", targetImageFullName)
}
}
return targetImageFullNameList
}
func loadAllGzipImageFromLocalFolder(localGzipFolder string) {
image.LoadFromFolderPath(localGzipFolder)
}
func parseAndDownloadFromOss(ossUrlPrefix, ossFileName, localGzipFolder string) bool {
if ossUrlPrefix == "" {
ossUrlPrefix = minio.DefaultOssUrlPrefix
}
if !strings.HasSuffix(ossUrlPrefix, "/") {
ossUrlPrefix += "/"
}
log.InfoF("prepare to download from %s%s", ossUrlPrefix, ossFileName)
if !minio.DefaultCmiiMinioOperator.DemoMinioOperator.DownloadFileFromOssFullUrl(ossUrlPrefix+ossFileName, localGzipFolder) {
log.ErrorF("download %s from oss error !", ossUrlPrefix+ossFileName)
return false
}
if strings.HasSuffix(ossFileName, ".txt") {
// download from gzip file list txt
// download all files in the txt file
result := utils.ReadAllContentFromFile(localGzipFolder + ossFileName)
for _, gzipFileName := range result {
minio.DefaultCmiiMinioOperator.DemoMinioOperator.DownloadFileFromOssFullUrl(ossUrlPrefix+gzipFileName, localGzipFolder)
}
}
// 解析
return true
}
// C_DownloadCompressUploadFromDemo 获取DEMO环境的全部镜像
func C_DownloadCompressUploadFromDemo(syncEntity *ImageSyncEntity, syncResult *ImageSyncResult) {
// generate a project folder
projectName := syncEntity.DownloadCondition.ProjectName
gzipFolderLocalPath := filepath.Join(image.OfflineImageGzipFolderPrefix, projectName)
err := os.MkdirAll(gzipFolderLocalPath, os.ModeDir)
if err != nil {
if !errors.Is(err, os.ErrExist) {
log.ErrorF("[Download_Compress_Upload_From_Demo] - create folder of %s error %s", gzipFolderLocalPath, err.Error())
}
}
// get demo image version map
allCmiiImageFullNameList := buildAllCmiiImageNameListFromDemo(projectName)
// save all cmii image to file
allPullImageNameTxtFileName := filepath.Join(gzipFolderLocalPath, AllCmiiImageListLocalFileName)
utils.AppendOverwriteListContentToFile(allCmiiImageFullNameList, allPullImageNameTxtFileName)
syncEntity.CompressCondition.GzipLocalFolder = gzipFolderLocalPath
syncEntity.DownloadCondition.FullNameImageList = allCmiiImageFullNameList
// save to result
syncResult.DownloadResult.SuccessPullTxtFileLocalFullPath = allPullImageNameTxtFileName
// do work
// DCU
A_DownloadCompressUpload(syncEntity, syncResult)
}
func buildAllCmiiImageNameListFromDemo(projectName string) []string {
var realCmiiImageName []string
backendMap, frontendMap, srsMap := BackupAllCmiiDeploymentToMap(config.Demo)
// save map to file
backendMapFile := image.OfflineImageGzipFolderPrefix + projectName + "-backend-app.json"
frontendMapFile := image.OfflineImageGzipFolderPrefix + projectName + "-frontend-app.json"
srsMapFile := image.OfflineImageGzipFolderPrefix + projectName + "-srs-app.json"
_ = os.Remove(backendMapFile)
_ = os.Remove(frontendMapFile)
_ = os.Remove(srsMapFile)
//utils.AppendContentToFile(
// utils.BeautifulPrintToString(backendMap),
// backendMapFile,
//)
//utils.AppendContentToFile(
// utils.BeautifulPrintToString(frontendMap),
// frontendMapFile,
//)
//utils.AppendContentToFile(
// utils.BeautifulPrintToString(srsMapFile),
// srsMapFile,
//)
realCmiiImageName = append(realCmiiImageName, image.CmiiImageMapToFullNameList(backendMap)...)
realCmiiImageName = append(realCmiiImageName, image.CmiiImageMapToFullNameList(frontendMap)...)
realCmiiImageName = append(realCmiiImageName, image.CmiiImageMapToFullNameList(srsMap)...)
utils.BeautifulPrintListWithTitle(realCmiiImageName, "Cmii Project Image => "+projectName)
return realCmiiImageName
}
// C_DownloadCompressUploadFromVersion 根据版本下载全部的CMII镜像
func C_DownloadCompressUploadFromVersion(syncEntity *ImageSyncEntity, syncResult *ImageSyncResult) {
// generate a project folder
projectCmiiVersion := syncEntity.DownloadCondition.ProjectVersion
// gzip local path
gzipFolderLocalPath := filepath.Join(image.OfflineImageGzipFolderPrefix, projectCmiiVersion)
err := os.MkdirAll(gzipFolderLocalPath, os.ModeDir)
if err != nil {
if !errors.Is(err, os.ErrExist) {
log.ErrorF("[Download_Compress_Upload_From_Demo] - create folder of %s error %s", gzipFolderLocalPath, err.Error())
}
}
syncEntity.CompressCondition.GzipLocalFolder = gzipFolderLocalPath
// build all cmii image name list
allCmiiImageFullNameList := buildAllCmiiImageNameListFromVersion(projectCmiiVersion)
// assign
syncEntity.DownloadCondition.FullNameImageList = allCmiiImageFullNameList
// save all cmii image to file
allImageListTxtFileFullName := filepath.Join(gzipFolderLocalPath, AllCmiiImageListLocalFileName)
utils.AppendOverwriteContentToFile(utils.BeautifulPrintToString(allCmiiImageFullNameList), allImageListTxtFileFullName)
// save to result
syncResult.DownloadResult.SuccessPullTxtFileLocalFullPath = allImageListTxtFileFullName
// do work
// DCU procedure
A_DownloadCompressUpload(syncEntity, syncResult)
}
// buildAllCmiiImageNameListFromVersion 根据VersionTag构建完整的应用名称列表
func buildAllCmiiImageNameListFromVersion(cmiiVersion string) []string {
var realCmiiImageName []string
backendMap := d_app.CmiiBackendAppMap
frontendMap := d_app.CmiiFrontendAppMap
for app := range backendMap {
backendMap[app] = cmiiVersion
}
for app := range frontendMap {
frontendMap[app] = cmiiVersion
}
realCmiiImageName = append(realCmiiImageName, image.CmiiImageMapToFullNameList(backendMap)...)
realCmiiImageName = append(realCmiiImageName, image.CmiiImageMapToFullNameList(frontendMap)...)
for key, value := range d_app.CmiiSrsAppMap {
var app *config.CmiiDeploymentInterface
if strings.Contains(value, "deployment") {
app = DefaultCmiiOperator.DeploymentOneInterface(config.Demo, key)
if app != nil {
realCmiiImageName = append(realCmiiImageName, app.Image)
}
} else if strings.Contains(value, "state") {
app = DefaultCmiiOperator.StatefulSetOneInterface(config.Demo, key)
if app != nil {
for _, imageName := range app.ContainerImageMap {
realCmiiImageName = append(realCmiiImageName, imageName)
}
}
}
}
utils.BeautifulPrintListWithTitle(realCmiiImageName, "Cmii Version Image => "+cmiiVersion)
return realCmiiImageName
}
// C_DownloadCompressUploadDependency DCU所有的依赖镜像
func C_DownloadCompressUploadDependency(shouldGzip bool, shouldOss bool, isRKE bool) (errorPullImageList, errorGzipImageList, realCmiiImageName, allGzipFileNameList []string) {
log.Info("DCU for middle and rke!")
err := os.MkdirAll(image.OfflineImageGzipFolderPrefix, os.ModeDir)
if err != nil {
if !errors.Is(err, os.ErrExist) {
log.ErrorF("[FetchDependencyRepos] - create folder of %s error %s", image.OfflineImageGzipFolderPrefix, err.Error())
}
}
var fullImageNameList []string
var gzipFolderPrefix string
if isRKE {
log.Info("DCU for rke!")
fullImageNameList = d_app.Rancher1204Amd64
gzipFolderPrefix = image.OfflineImageGzipFolderPrefix + "rke/"
} else {
log.Info("DCU for middle!")
fullImageNameList = d_app.MiddlewareAmd64
gzipFolderPrefix = image.OfflineImageGzipFolderPrefix + "middle/"
}
syncEntity := &ImageSyncEntity{
DownloadCondition: &DownloadEntity{
ShouldDownloadImage: true,
ProjectName: "",
ProjectVersion: "",
CmiiNameTagList: nil,
FullNameImageList: fullImageNameList,
DownloadAuthUserName: "",
DownloadAuthPassword: "",
},
CompressCondition: &CompressEntity{
ShouldCompressImageToGzip: shouldGzip,
ShouldGzipSplit: true,
GzipLocalFolder: gzipFolderPrefix,
},
UploadCondition: &UploadEntity{ShouldUploadToDemoMinio: shouldOss},
ShouldDownloadFromOss: false,
ShouldUpdateImageTag: false,
ShouldDirectPushToHarbor: false,
DirectHarborHost: "",
}
syncResult := &ImageSyncResult{
ProcedureSuccessImageList: nil,
DownloadResult: &DownloadResultEntity{
ErrorPullImageList: nil,
SuccessPullImageList: nil,
SuccessPullTxtFileLocalFullPath: "",
},
CompressResult: &CompressResultEntity{
ErrorGzipImageList: nil,
SuccessGzipImageList: nil,
GzipTxtFileLocalFullPath: "",
},
UploadResult: &UploadResultEntity{
ErrorUploadImageList: nil,
AllDownloadUrl: nil,
},
}
utils.AppendOverwriteListContentToFile(fullImageNameList, filepath.Join(gzipFolderPrefix, AllCmiiImageListLocalFileName))
A_DownloadCompressUpload(syncEntity, syncResult)
return syncResult.DownloadResult.ErrorPullImageList, syncResult.CompressResult.ErrorGzipImageList, syncResult.ProcedureSuccessImageList, syncResult.CompressResult.SuccessGzipImageList
}
func LoadSplitCmiiGzipImageToTargetHarbor(projectName, targetHarborHost string) (errorLoadImageNameList, errorPushImageNameList []string) {
// list folder
projectGzipFolder := image.OfflineImageGzipFolderPrefix + projectName
errorLoadImageNameList = append(errorLoadImageNameList, image.LoadFromFolderPath(projectGzipFolder)...)
// read from json
errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(d_app.Cmii520DemoImageList, targetHarborHost)...)
// re-tag
// push
// todo clean host and harbor
// check harbor exits
return errorLoadImageNameList, errorPushImageNameList
}
func LoadSplitDepGzipImageToTargetHarbor(targetHarborHost string) (errorLoadImageNameList []string, errorPushImageNameList []string) {
errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(d_app.MiddlewareAmd64, targetHarborHost)...)
//errorPushImageNameList = append(errorPushImageNameList, image.TagFromListAndPushToCHarbor(d_app.Rancher1204Amd64, targetHarborHost)...)
return errorLoadImageNameList, errorPushImageNameList
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -0,0 +1,236 @@
package main
import (
"testing"
image2 "wdd.io/agent-common/image"
"wdd.io/agent-common/utils"
)
/* 拉取
*/
func TestFetchDependencyRepos_Middle(t *testing.T) {
errorPullImageList, errorGzipImageList, realCmiiImageName, allGzipFileNameList := C_DownloadCompressUploadDependency(true, true, false)
utils.BeautifulPrintListWithTitle(errorPullImageList, "errorPullImageList")
utils.BeautifulPrintListWithTitle(errorGzipImageList, "errorGzipImageList")
utils.BeautifulPrintListWithTitle(realCmiiImageName, "realCmiiImageName")
utils.BeautifulPrintListWithTitle(allGzipFileNameList, "allGzipFileNameList")
}
func TestFetchDependencyRepos_RKE(t *testing.T) {
errorPullImageList, errorGzipImageList, realCmiiImageName, allGzipFileNameList := C_DownloadCompressUploadDependency(true, false, true)
utils.BeautifulPrintListWithTitle(errorPullImageList, "errorPullImageList")
utils.BeautifulPrintListWithTitle(errorGzipImageList, "errorGzipImageList")
utils.BeautifulPrintListWithTitle(realCmiiImageName, "realCmiiImageName")
utils.BeautifulPrintListWithTitle(allGzipFileNameList, "allGzipFileNameList")
}
func TestLoadSplitGzipImageToTargetHarbor(t *testing.T) {
errorLoadImageNameList, errorPushImageNameList := LoadSplitCmiiGzipImageToTargetHarbor("xmyd", DirectPushDeployHarborHost)
utils.BeautifulPrintListWithTitle(errorLoadImageNameList, "errorLoadImageNameList")
utils.BeautifulPrintListWithTitle(errorPushImageNameList, "errorPushImageNameList")
}
func TestLoadSplitDepGzipImageToTargetHarbor(t *testing.T) {
errorLoadImageNameList, errorPushImageNameList := LoadSplitDepGzipImageToTargetHarbor(DirectPushDeployHarborHost)
utils.BeautifulPrintListWithTitle(errorLoadImageNameList, "errorLoadImageNameList")
utils.BeautifulPrintListWithTitle(errorPushImageNameList, "errorPushImageNameList")
}
func TestPullFromEntityAndSyncConditionally(t *testing.T) {
// 下载镜像的核心函数
sync := ImageSyncEntity{
DownloadCondition: &DownloadEntity{
ShouldDownloadImage: true,
ProjectName: "6.2.0_demo",
ProjectVersion: "6.2.0-demo",
CmiiNameTagList: []string{
//"cmii-uav-mqtthandler:5.4.0-bjdyt-052102",
},
FullNameImageList: []string{},
DownloadAuthUserName: "",
DownloadAuthPassword: "",
},
CompressCondition: &CompressEntity{
ShouldCompressImageToGzip: true,
ShouldGzipSplit: true,
GzipLocalFolder: "",
},
UploadCondition: &UploadEntity{
ShouldUploadToDemoMinio: true,
},
DirectHarborHost: "harbor.wdd.io:8033",
ShouldDirectPushToHarbor: false,
}
// 调用函数并获取结果。这里需要根据你的实际需求来验证返回的结果是否符合预期。
result := sync.PullFromEntityAndSyncConditionally()
utils.BeautifulPrint(result)
// 添加断言以检查函数的输出,例如:
// ...其他验证逻辑...
}
func TestPullFromEntityAndSyncConditionally_ChongQingErJiPingTai(t *testing.T) {
// 创建一个模拟的sync对象用于测试函数的行为。这里需要根据你的实际需求来设置mock数据和预期结果。
sync := ImageSyncEntity{
DownloadCondition: &DownloadEntity{
ShouldDownloadImage: true,
ProjectName: "cqejpt",
ProjectVersion: "",
CmiiNameTagList: []string{
//"cmii-uav-mqtthandler:5.4.0-bjdyt-052102",
},
FullNameImageList: []string{
"docker.107421.xyz/rancher/backup-restore-operator:v1.0.3",
"docker.107421.xyz/rancher/calico-cni:v3.17.2",
"docker.107421.xyz/rancher/calico-ctl:v3.17.2",
"docker.107421.xyz/rancher/calico-kube-controllers:v3.17.2",
"docker.107421.xyz/rancher/calico-node:v3.17.2",
"docker.107421.xyz/rancher/calico-pod2daemon-flexvol:v3.17.2",
"docker.107421.xyz/rancher/cis-operator:v1.0.3",
"docker.107421.xyz/rancher/cluster-proportional-autoscaler:1.7.1",
"docker.107421.xyz/rancher/coredns-coredns:1.8.0",
"docker.107421.xyz/rancher/coreos-etcd:v3.4.14-rancher1",
"docker.107421.xyz/rancher/coreos-kube-state-metrics:v1.9.7",
"docker.107421.xyz/rancher/coreos-prometheus-config-reloader:v0.39.0",
"docker.107421.xyz/rancher/coreos-prometheus-operator:v0.39.0",
"docker.107421.xyz/rancher/externalip-webhook:v0.1.6",
"docker.107421.xyz/rancher/flannel-cni:v0.3.0-rancher6",
"docker.107421.xyz/rancher/coreos-flannel:v0.13.0-rancher1",
"docker.107421.xyz/rancher/fleet-agent:v0.3.4",
"docker.107421.xyz/rancher/fleet:v0.3.4",
"docker.107421.xyz/rancher/fluentd:v0.1.24",
"docker.107421.xyz/rancher/grafana-grafana:7.1.5",
"docker.107421.xyz/rancher/hyperkube:v1.20.4-rancher1",
"docker.107421.xyz/rancher/jimmidyson-configmap-reload:v0.3.0",
"docker.107421.xyz/rancher/k8s-dns-dnsmasq-nanny:1.15.2",
"docker.107421.xyz/rancher/k8s-dns-kube-dns:1.15.2",
"docker.107421.xyz/rancher/k8s-dns-node-cache:1.15.13",
"docker.107421.xyz/rancher/k8s-dns-sidecar:1.15.2",
"docker.107421.xyz/rancher/klipper-lb:v0.1.2",
"docker.107421.xyz/rancher/kube-api-auth:v0.1.4",
"docker.107421.xyz/rancher/kubectl:v1.20.4",
"docker.107421.xyz/rancher/kubernetes-external-dns:v0.7.3",
"docker.107421.xyz/rancher/cluster-proportional-autoscaler:1.8.1",
"docker.107421.xyz/rancher/library-busybox:1.31.1",
"docker.107421.xyz/rancher/library-busybox:1.32.1",
"docker.107421.xyz/rancher/library-nginx:1.19.2-alpine",
"docker.107421.xyz/rancher/library-traefik:1.7.19",
"docker.107421.xyz/rancher/local-path-provisioner:v0.0.11",
"docker.107421.xyz/rancher/local-path-provisioner:v0.0.14",
"docker.107421.xyz/rancher/local-path-provisioner:v0.0.19",
"docker.107421.xyz/rancher/log-aggregator:v0.1.7",
"docker.107421.xyz/rancher/istio-kubectl:1.5.10",
"docker.107421.xyz/rancher/metrics-server:v0.4.1",
"docker.107421.xyz/rancher/configmap-reload:v0.3.0-rancher4",
"docker.107421.xyz/rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1",
"docker.107421.xyz/rancher/nginx-ingress-controller:nginx-0.43.0-rancher1",
"docker.107421.xyz/rancher/opa-gatekeeper:v3.1.0-beta.7",
"docker.107421.xyz/rancher/openzipkin-zipkin:2.14.2",
"docker.107421.xyz/rancher/pause:3.2",
"docker.107421.xyz/rancher/plugins-docker:18.09",
"docker.107421.xyz/rancher/prom-alertmanager:v0.21.0",
"docker.107421.xyz/rancher/prom-node-exporter:v1.0.1",
"docker.107421.xyz/rancher/prom-prometheus:v2.18.2",
"docker.107421.xyz/rancher/prometheus-auth:v0.2.1",
"docker.107421.xyz/rancher/rancher-agent:v2.5.7",
"docker.107421.xyz/rancher/rancher-webhook:v0.1.0-beta9",
"docker.107421.xyz/rancher/rancher:v2.5.7",
"docker.107421.xyz/rancher/rke-tools:v0.1.72",
"docker.107421.xyz/rancher/security-scan:v0.1.14",
"docker.107421.xyz/rancher/security-scan:v0.2.2",
"docker.107421.xyz/rancher/shell:v0.1.6",
"docker.107421.xyz/rancher/sonobuoy-sonobuoy:v0.16.3",
"docker.107421.xyz/rancher/system-upgrade-controller:v0.6.2",
},
DownloadAuthUserName: "",
DownloadAuthPassword: "",
},
CompressCondition: &CompressEntity{
ShouldCompressImageToGzip: false,
ShouldGzipSplit: true,
GzipLocalFolder: "",
},
UploadCondition: &UploadEntity{
ShouldUploadToDemoMinio: false,
},
DirectHarborHost: "chongqingshcis-a189ec98.ecis.chongqing-1.cmecloud.cn",
ShouldDirectPushToHarbor: true,
}
// 调用函数并获取结果。这里需要根据你的实际需求来验证返回的结果是否符合预期。
result := sync.PullFromEntityAndSyncConditionally()
utils.BeautifulPrint(result)
// 添加断言以检查函数的输出,例如:
// ...其他验证逻辑...
}
func TestDownloadLoadTagUpload(t *testing.T) {
localGzipFileList := []string{
"/root/octopus_image/middle",
"/root/octopus_image/rke",
"/root/octopus_image/xjyd",
}
for _, s := range localGzipFileList {
log.InfoF("start to sync => %s", s)
targetImageFullNameList := A_DownloadLoadTagUpload(false, "", "", s, "172.28.0.251:8033")
utils.BeautifulPrintListWithTitle(targetImageFullNameList, "targetImageFullNameList")
}
}
func TestConcatAndUniformCmiiImage(t *testing.T) {
// 创建一个模拟的fullImageList和cmiiImageList用于测试函数的行为。这里需要根据你的实际需求来设置mock数据和预期结果。
fullImageList := []string{"image3", "image4"}
cmiiImageList := []string{"image1", "image2"}
// 调用函数并获取结果。这里需要根据你的实际需求来验证返回的结果是否符合预期。
result := concatAndUniformCmiiImage(fullImageList, cmiiImageList)
// 添加断言以检查函数的输出,例如:
expectedResult := []string{"image3", "image4", image2.CmiiHarborPrefix + "image1", image2.CmiiHarborPrefix + "image2"}
if len(result) != len(expectedResult) {
t.Errorf("Expected %v, got %v", expectedResult, result)
}
// ...其他验证逻辑...
}
func TestImageSyncEntity_PullFromEntityAndSyncConditionally(t *testing.T) {
imageSyncEntity := ImageSyncEntity{
DownloadCondition: &DownloadEntity{
ShouldDownloadImage: true,
ProjectName: "",
ProjectVersion: "5.4.0",
CmiiNameTagList: nil,
FullNameImageList: nil,
DownloadAuthUserName: "",
DownloadAuthPassword: "",
},
DirectHarborHost: "36.134.71.138",
}
imageSyncResult := imageSyncEntity.PullFromEntityAndSyncConditionally()
utils.BeautifulPrint(imageSyncResult)
}

View File

@@ -0,0 +1,759 @@
package main
import (
"bufio"
"runtime"
"strings"
"time"
image2 "wdd.io/agent-common/image"
"wdd.io/agent-common/utils"
"wdd.io/agent-deploy/d_app"
"wdd.io/agent-operator/config"
)
var DefaultCmiiOperator = CmiiK8sOperator{}
var UpdateLogPath = "/home/wdd/IdeaProjects/ProjectOctopus/agent-operator/log/cmii-update-log.txt"
func init() {
switch runtime.GOOS {
case "linux":
UpdateLogPath = "/home/wdd/IdeaProjects/ProjectOctopus/agent-operator/log/cmii-update-log.txt"
case "windows":
UpdateLogPath = "C:\\Users\\wdd\\IdeaProjects\\ProjectOctopus\\agent-operator\\log\\cmii-update-log.txt"
}
}
// FindAppNotHealthyOrRestartCountGreaterThanN 重启次数大于N的所有Deployment
func FindAppNotHealthyOrRestartCountGreaterThanN(cmiiEnv string, restartCount int32) []config.CmiiDeploymentInterface {
//podInterface := CmiiPodInterface{}
// get all pods
podAll := DefaultCmiiOperator.PodAllInterface(cmiiEnv)
// restart map
restartMap := make(map[string]int32, len(podAll))
// restart count
for _, pod := range podAll {
if pod.RestartCount > restartCount {
restart, exists := restartMap[pod.ContainerName]
if exists {
restartMap[pod.ContainerName] = utils.MaxInt32(pod.RestartCount, restart)
} else {
restartMap[pod.ContainerName] = pod.RestartCount
}
}
// unhealthy
if !pod.PodStatus {
restartMap[pod.ContainerName] = pod.RestartCount
}
}
result := make([]config.CmiiDeploymentInterface, len(restartMap))
index := 0
log.DebugF("[FindAppNotHealthyOrRestartCountGreaterThanN] - restart map is => %v", restartMap)
// find deployment convert to interface
for key, value := range restartMap {
// container Name must equals deployment name
deployment := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key)
if deployment != nil {
// deployment exists
log.DebugF("[FindAppNotHealthyOrRestartCountGreaterThanN] - restart [%s] [%s] is [%d]", cmiiEnv, key, value)
result[index] = *deployment
index++
}
}
return result[:index]
}
func FindDeploymentReplicasSmallerThanN(cmiiEnv string, replicasMin int32) (deploymentList []config.CmiiDeploymentInterface) {
// get all deployments
cmiiDeploymentInterfaces := DefaultCmiiOperator.DeploymentAllInterface(cmiiEnv)
cmiiDeploymentInterfaces = FilterAllCmiiAppSoft(cmiiDeploymentInterfaces)
// filter
for _, deploymentInterface := range cmiiDeploymentInterfaces {
if deploymentInterface.Replicas <= replicasMin {
deploymentList = append(deploymentList, deploymentInterface)
}
}
// convert
return deploymentList
}
func FindDeploymentNotHealthy(cmiiEnv string) (deploymentList []config.CmiiDeploymentInterface) {
// all unhealthy pods
allInterface := DefaultCmiiOperator.PodAllInterface(cmiiEnv)
// find the deployments
for _, podInterface := range allInterface {
if !podInterface.PodStatus {
// unhealthy pod
deploymentInterface := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, podInterface.ContainerName)
if deploymentInterface != nil {
deploymentList = append(deploymentList, *deploymentInterface)
}
}
}
return deploymentList
}
func FindAllNodeNotHealthy() (nodeList []config.CmiiNodeInterface) {
// dev-cluster
devNodeList := DefaultCmiiOperator.NodeAllInterface("dev")
// core-cluster
coreNodeList := DefaultCmiiOperator.NodeAllInterface("uat")
// append
coreNodeList = append(coreNodeList, devNodeList...)
// filter
for _, node := range coreNodeList {
if node.Unschedulable {
nodeList = append(nodeList, node)
continue
}
if !node.NodeStatus {
nodeList = append(nodeList, node)
continue
}
if node.MemoryPressure || node.PIDPressure || node.NetworkUnavailable || node.DiskPressure {
nodeList = append(nodeList, node)
continue
}
}
return nodeList
}
func FindPodNotHealthy(cmiiEnv string) (podList []config.CmiiPodInterface) {
// all unhealthy pods
allInterface := DefaultCmiiOperator.PodAllInterface(cmiiEnv)
// find the deployments
for _, podInterface := range allInterface {
if !podInterface.PodStatus {
// unhealthy pod
podList = append(podList, podInterface)
}
}
return podList
}
func GetDeploymentGitInfoFromInnerEnv(cmiiEnv, appName string) (gitBranch, gitCommit string) {
// get app
podList := DefaultCmiiOperator.PodByAppName(cmiiEnv, appName)
// get pod
if podList == nil || len(podList) == 0 {
log.ErrorF("[GetDeploymentGitInfoFromInnerEnv] - get app pod error [%s] [%s]", cmiiEnv, appName)
return "", ""
}
// exec env
stdout, stderr := DefaultCmiiOperator.PodExec(cmiiEnv, podList[0], []string{"env"})
errLog := stderr.String()
if errLog != "" {
log.ErrorF("[GetDeploymentGitInfoFromInnerEnv] - pod Exec error %s", errLog)
return "", ""
}
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
// Get the current line
line := scanner.Text()
// Check if the current line contains the search term
if strings.HasPrefix(line, "GIT_BRANCH") {
gitBranch = strings.Split(line, "=")[1]
}
if strings.HasPrefix(line, "GIT_COMMIT") {
gitCommit = strings.Split(line, "=")[1]
}
}
// get out git info
return gitBranch, gitCommit
}
func FindCmiiMiddlewarePodInterface(cmiiEnv string) (podList []config.CmiiPodInterface) {
cmiiPodInterfaces := DefaultCmiiOperator.PodAllInterface(cmiiEnv)
for _, podInterface := range cmiiPodInterfaces {
for key := range d_app.CmiiMiddlewareNameMap {
if strings.Contains(podInterface.Name, key) {
podList = append(podList, podInterface)
}
}
}
return podList
}
func ScaleCmiiFrontendDeploymentToDesiredReplicas(cmiiEnv string, desiredReplicas int32) (errorUpdateMap map[string]int32) {
frontMap := make(map[string]int32, len(d_app.CmiiFrontendAppMap))
for aooName := range d_app.CmiiFrontendAppMap {
frontMap[aooName] = desiredReplicas
}
return ScaleDeploymentToDesiredReplicasFromMap(cmiiEnv, frontMap)
}
func ScaleCmiiBackendDeploymentToDesiredReplicas(cmiiEnv string, desiredReplicas int32) (errorUpdateMap map[string]int32) {
backMap := make(map[string]int32, len(d_app.CmiiBackendAppMap))
for aooName := range d_app.CmiiBackendAppMap {
backMap[aooName] = desiredReplicas
}
return ScaleDeploymentToDesiredReplicasFromMap(cmiiEnv, backMap)
}
func ScaleDeploymentToDesiredReplicasFromMap(cmiiEnv string, nameReplicasMap map[string]int32) map[string]int32 {
errorUpdateMap := make(map[string]int32, len(nameReplicasMap))
// 遍历
for appName, replica := range nameReplicasMap {
exists := DefaultCmiiOperator.DeploymentExist(cmiiEnv, appName)
if exists != nil {
scale := DefaultCmiiOperator.DeploymentScale(cmiiEnv, appName, replica)
if !scale {
errorUpdateMap[appName] = replica
}
} else {
errorUpdateMap[appName] = replica
}
}
return errorUpdateMap
}
func RestartDeploymentFromList(deploymentList []config.CmiiDeploymentInterface) bool {
result := true
for _, deployment := range deploymentList {
result = DefaultCmiiOperator.DeploymentScale(deployment.Namespace, deployment.Name, 0)
if !result {
return result
}
time.Sleep(time.Second)
result = DefaultCmiiOperator.DeploymentScale(deployment.Namespace, deployment.Name, deployment.Replicas)
if !result {
return result
}
}
return result
}
func RestartCmiiBackendDeployment(cmiiEnv string) {
cmiiDeploymentInterfaces := DefaultCmiiOperator.DeploymentAllInterface(cmiiEnv)
for _, deploymentInterface := range cmiiDeploymentInterfaces {
if AppNameBelongsToCmiiImage(deploymentInterface.Name) {
if !DefaultCmiiOperator.DeploymentRestart(deploymentInterface.Namespace, deploymentInterface.Name) {
log.ErrorF("[RestartCmiiBackendDeployment] - restart of [%s] [%s] failed !", deploymentInterface.Namespace, deploymentInterface.Name)
} else {
log.DebugF("[RestartCmiiBackendDeployment] - restart of [%s] [%s] success !", deploymentInterface.Namespace, deploymentInterface.Name)
}
}
}
log.InfoF("[RestartCmiiBackendDeployment] - restart of all backend app in [%s] success !", DefaultCmiiOperator.CurrentNamespace)
}
func RestartCmiiFrontendDeployment(cmiiEnv string) {
cmiiDeploymentInterfaces := DefaultCmiiOperator.DeploymentAllInterface(cmiiEnv)
for _, deploymentInterface := range cmiiDeploymentInterfaces {
_, ok := d_app.CmiiFrontendAppMap[deploymentInterface.Name]
if ok {
if !DefaultCmiiOperator.DeploymentRestart(deploymentInterface.Namespace, deploymentInterface.Name) {
log.ErrorF("[RestartCmiiFrontendDeployment] - restart of [%s] [%s] failed !", deploymentInterface.Namespace, deploymentInterface.Name)
} else {
log.DebugF("[RestartCmiiFrontendDeployment] - restart of [%s] [%s] success !", deploymentInterface.Namespace, deploymentInterface.Name)
}
}
}
log.InfoF("[RestartCmiiFrontendDeployment] - restart of all backend app in [%s] success !", DefaultCmiiOperator.CurrentNamespace)
}
// UpdateCmiiDeploymentImageTag 更新CMII的Deployment的Tag号
func UpdateCmiiDeploymentImageTag(cmiiEnv, appName, newTag string) (updateOK bool, oldImageTag, newImageTag string) {
// trim space
newTag = strings.TrimSpace(newTag)
cmiiDeploymentInterface := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, appName)
if cmiiDeploymentInterface == nil {
return updateOK, oldImageTag, newImageTag
}
// check if need to update
oldImageTag = cmiiDeploymentInterface.ImageTag
if oldImageTag == newTag {
log.DebugF("[UpdateCmiiDeploymentImageTag] - [%s] [%s] image tag are the same ! no need to update !", cmiiEnv, appName)
// restart deployment
if DefaultCmiiOperator.DeploymentRestart(cmiiEnv, appName) {
return true, oldImageTag, oldImageTag
} else {
return false, oldImageTag, oldImageTag
}
}
content := utils.WordSpaceCompletion(utils.TimeSplitFormatString()+" "+cmiiDeploymentInterface.Namespace, 35)
content = utils.WordSpaceCompletion(content+cmiiDeploymentInterface.Name, 75)
content = utils.WordSpaceCompletion(content+oldImageTag, 105)
content = content + newTag + "\n"
log.DebugF("[UpdateCmiiDeploymentImageTag] - prepare to update [%s]!", content)
// update
tag := DefaultCmiiOperator.DeploymentUpdateTag(cmiiDeploymentInterface.Namespace, cmiiDeploymentInterface.Name, newTag)
if !tag {
log.ErrorF("[UpdateCmiiDeploymentImageTag] - [%s] update failed !", content)
return false, oldImageTag, newImageTag
}
// append update log
utils.AppendContentToFile(content, UpdateLogPath)
// re-get from env
time.Sleep(time.Second)
deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, appName)
if deploy == nil {
log.ErrorF("[UpdateCmiiDeploymentImageTag] - unknown error happened ! [%s] [%s] not exists !", cmiiEnv, appName)
return false, oldImageTag, newImageTag
}
// result
return true, oldImageTag, deploy.ImageTag
}
func UpdateCmiiImageTagFromNameTagMap(cmiiEnv string, nameTagMap map[string]string) (result map[string]string) {
result = make(map[string]string, len(nameTagMap))
for appName, newTag := range nameTagMap {
if AppNameBelongsToCmiiImage(appName) {
ok, oldImageTag, newImageTag := UpdateCmiiDeploymentImageTag(cmiiEnv, appName, newTag)
if ok {
log.InfoF("[UpdateCmiiImageTagFromNameTagMap] - %s %s to %s", cmiiEnv, appName, newTag)
result[appName] = newImageTag
} else {
result[appName] = oldImageTag
}
}
}
return result
}
func UpdateCmiiImageTagFromNameTagList(cmiiEnv string, nameTagList []string) (result map[string]string) {
nameTagMap := make(map[string]string, len(nameTagList))
for _, nameTag := range nameTagList {
if strings.HasPrefix(nameTag, image2.CmiiHarborPrefix) {
nameTag = strings.TrimPrefix(nameTag, image2.CmiiHarborPrefix)
}
split := strings.Split(nameTag, ":")
nameTagMap[split[0]] = split[1]
}
return UpdateCmiiImageTagFromNameTagMap(cmiiEnv, nameTagMap)
}
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)
ok, _, _ := UpdateCmiiDeploymentImageTag(cmiiEnv, appName, fromTag)
return ok
}
// BackupAllDeploymentFromEnvToFile 从DEMO提取全部的CMII的应用
func BackupAllDeploymentFromEnvToFile(cmiiEnv string) bool {
allInterface := DefaultCmiiOperator.DeploymentAllInterface(cmiiEnv)
// must filter
allInterface = FilterAllCmiiAppSoft(allInterface)
//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("[BackupAllDeploymentFromEnvToFile] - backup all image from %s => %s", DefaultCmiiOperator.CurrentNamespace, filePath)
firstCol := 0
secondCol := 0
thirdCol := 0
fourthCol := 0
for _, deploymentInterface := range allInterface {
firstCol = utils.MaxInt(len(deploymentInterface.Name), firstCol)
secondCol = utils.MaxInt(len(deploymentInterface.ImageTag), secondCol)
thirdCol = utils.MaxInt(len(deploymentInterface.GitBranch), thirdCol)
fourthCol = utils.MaxInt(len(deploymentInterface.GitCommit), fourthCol)
}
firstCol += 2
secondCol += 2
secondCol += firstCol
thirdCol += 2
thirdCol += secondCol
fourthCol += 2
fourthCol += thirdCol
for _, deploymentInterface := range allInterface {
if deploymentInterface.GitBranch == "" {
branch, commit := GetDeploymentGitInfoFromInnerEnv(deploymentInterface.Namespace, deploymentInterface.Name)
deploymentInterface.GitBranch = branch
deploymentInterface.GitCommit = commit
}
content := utils.WordSpaceCompletion(deploymentInterface.Name, firstCol)
content = utils.WordSpaceCompletion(content+deploymentInterface.ImageTag, secondCol)
content = utils.WordSpaceCompletion(content+deploymentInterface.GitBranch, thirdCol)
content = utils.WordSpaceCompletion(content+deploymentInterface.GitCommit, fourthCol)
content += "\n"
if !utils.AppendContentToFile(content, filePath) {
log.ErrorF("[BackupAllDeploymentFromEnvToFile] - write to file %s error with contend %s", filePath, content)
return false
}
}
return true
}
// BackupAllCmiiDeploymentToMap 备份DEMO环境全部的镜像名称为Map 包括SRS 前端 后端
func BackupAllCmiiDeploymentToMap(cmiiEnv string) (backendMap, frontendMap, srsMap map[string]string) {
allInterface := DefaultCmiiOperator.DeploymentAllInterface(cmiiEnv)
allInterface = FilterAllCmiiAppSoft(allInterface)
backendMap = make(map[string]string, len(allInterface))
frontendMap = make(map[string]string, len(allInterface))
srsMap = make(map[string]string, len(allInterface))
for _, deploymentInterface := range allInterface {
if strings.Contains(deploymentInterface.Name, "platform") {
frontendMap[deploymentInterface.Name] = deploymentInterface.ImageTag
} else {
backendMap[deploymentInterface.Name] = deploymentInterface.ImageTag
}
}
// add srs part
for key, value := range d_app.CmiiSrsAppMap {
var app *config.CmiiDeploymentInterface
if strings.Contains(value, "deployment") {
app = DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key)
if app != nil {
for _, imageName := range app.ContainerImageMap {
split := strings.Split(imageName, ":")
if strings.Contains(split[0], image2.CmiiHarborPrefix) {
split[0] = strings.Split(split[0], image2.CmiiHarborPrefix)[1]
}
srsMap[split[0]] = split[1]
}
}
} else if strings.Contains(value, "state") {
app = DefaultCmiiOperator.StatefulSetOneInterface(cmiiEnv, key)
if app != nil {
for _, imageName := range app.ContainerImageMap {
split := strings.Split(imageName, ":")
split[0], _ = strings.CutPrefix(split[0], image2.CmiiHarborPrefix)
srsMap[split[0]] = split[1]
}
}
}
}
return backendMap, frontendMap, srsMap
}
func BackupAllCmiiDeploymentToList(cmiiEnv string, completePrefix bool) (allCmiiImageList []string) {
backendMap, frontendMap, srsMap := BackupAllCmiiDeploymentToMap(cmiiEnv)
allImageMap := make(map[string]string, len(backendMap)+len(frontendMap)+len(srsMap))
for name, tag := range backendMap {
allImageMap[name] = tag
}
for name, tag := range frontendMap {
allImageMap[name] = tag
}
for name, tag := range srsMap {
allImageMap[name] = tag
}
for name, tag := range allImageMap {
if completePrefix {
allCmiiImageList = append(allCmiiImageList, image2.CmiiHarborPrefix+name+":"+tag)
} else {
allCmiiImageList = append(allCmiiImageList, name+":"+tag)
}
}
return allCmiiImageList
}
func BackUpAllCmiiAppImageNameFromEnv(cmiiEnv string) {
DefaultCmiiOperator.changeOperatorEnv(cmiiEnv)
//filePath := "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\cmii_operator\\log\\images-" + DefaultCmiiOperator.CurrentNamespace + "-" + utils.TimeSplitFormatString() + ".txt"
filePath := "/home/wdd/IdeaProjects/ProjectOctopus/agent-operator/log/images-" + DefaultCmiiOperator.CurrentNamespace + "-" + utils.TimeSplitFormatString() + ".txt"
only := make(map[string]string, 150)
// front
utils.AppendContentToFile("---\n", filePath)
for key, value := range d_app.CmiiFrontendAppMap {
_, ok := only[key]
if !ok {
deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key)
if deploy != nil {
only[key] = value
utils.AppendContentToFile(deploy.Image+"\n", filePath)
}
}
}
utils.AppendContentToFile("---\n", filePath)
for key, value := range d_app.CmiiBackendAppMap {
_, ok := only[key]
if !ok {
deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key)
if deploy != nil {
only[key] = value
utils.AppendContentToFile(deploy.Image+"\n", filePath)
}
}
}
// backend
utils.AppendContentToFile("---\n", filePath)
// gis server
for key, value := range d_app.CmiiGISAppMap {
_, ok := only[key]
if !ok {
deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key)
if deploy != nil {
only[key] = value
utils.AppendContentToFile(deploy.Image+"\n", filePath)
}
}
}
// srs
utils.AppendContentToFile("---\n", filePath)
for key, value := range d_app.CmiiSrsAppMap {
_, ok := only[key]
if !ok {
var app *config.CmiiDeploymentInterface
if strings.Contains(value, "deployment") {
app = DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, key)
if app != nil {
only[key] = value
utils.AppendContentToFile(app.Image+"\n", filePath)
}
} else if strings.Contains(value, "state") {
app = DefaultCmiiOperator.StatefulSetOneInterface(cmiiEnv, key)
if app != nil {
only[key] = value
for _, imageName := range app.ContainerImageMap {
utils.AppendContentToFile(imageName+"\n", filePath)
}
}
}
}
}
utils.AppendContentToFile("---\n", filePath)
}
func FilterAllCmiiAppStrict(source []config.CmiiDeploymentInterface) (result []config.CmiiDeploymentInterface) {
for _, c := range source {
_, ok := d_app.CmiiBackendAppMap[c.ContainerName]
if !ok {
_, ok = d_app.CmiiFrontendAppMap[c.ContainerName]
if !ok {
log.WarnF("[FilterAllCmiiAppStrict] - [%s] not cmii pod ", c.ContainerName)
continue
}
}
result = append(result, c)
}
return result
}
func FilterAllCmiiAppSoft(source []config.CmiiDeploymentInterface) (result []config.CmiiDeploymentInterface) {
for _, c := range source {
if strings.Contains(c.ContainerName, "redis") {
continue
}
if strings.Contains(c.ContainerName, "emqxs") {
continue
}
if strings.Contains(c.ContainerName, "rabbitmq") {
continue
}
if strings.Contains(c.ContainerName, "nacos") {
continue
}
if strings.Contains(c.ContainerName, "oss") {
continue
}
if strings.Contains(c.ContainerName, "minio") {
continue
}
if strings.HasPrefix(c.ContainerName, "nfs") {
continue
}
if strings.HasPrefix(c.ContainerName, "operator") {
continue
}
if strings.HasPrefix(c.ContainerName, "proxy") {
continue
}
result = append(result, c)
}
return result
}
func FilterAllCmiiPodStrict(podList []config.CmiiPodInterface) (result []config.CmiiPodInterface) {
for _, c := range podList {
_, ok := d_app.CmiiBackendAppMap[c.ContainerName]
if !ok {
_, ok = d_app.CmiiFrontendAppMap[c.ContainerName]
if !ok {
log.WarnF("[FilterAllCmiiPodStrict] - [%s] not cmii pod ", c.ContainerName)
continue
}
}
result = append(result, c)
}
return result
}
func FilterAllCmiiPodSoft(podList []config.CmiiPodInterface) (result []config.CmiiPodInterface) {
for _, c := range podList {
if strings.Contains(c.ContainerName, "redis") {
continue
}
if strings.Contains(c.ContainerName, "emqxs") {
continue
}
if strings.Contains(c.ContainerName, "rabbitmq") {
continue
}
if strings.Contains(c.ContainerName, "nacos") {
continue
}
if strings.Contains(c.ContainerName, "oss") {
continue
}
if strings.Contains(c.ContainerName, "minio") {
continue
}
if strings.HasPrefix(c.ContainerName, "nfs") {
continue
}
if strings.HasPrefix(c.ContainerName, "operator") {
continue
}
if strings.HasPrefix(c.ContainerName, "proxy") {
continue
}
if strings.HasPrefix(c.ContainerName, "cleanlog") {
continue
}
result = append(result, c)
}
return result
}
func FilterAllCmiiNodeSoft(nodeList []config.CmiiNodeInterface) (result []config.CmiiNodeInterface) {
for _, nodeInterface := range nodeList {
if strings.HasPrefix(nodeInterface.Name, "ai") {
continue
}
if strings.HasPrefix(nodeInterface.Name, "35") {
continue
}
result = append(result, nodeInterface)
}
return result
}
// AppNameBelongsToCmiiImage 根据CmiiBackendAppMap CmiiFrontendAppMap判断一个appName是否属于CMII
func AppNameBelongsToCmiiImage(appName string) bool {
_, ok := d_app.CmiiBackendAppMap[appName]
if !ok {
_, ok = d_app.CmiiFrontendAppMap[appName]
if !ok {
log.WarnF("[AppNameBelongsToCmiiImage] - [%s] not cmii app ", appName)
return false
} else {
return true
}
} else {
return true
}
}

View File

@@ -0,0 +1,332 @@
package main
import (
"fmt"
"strconv"
"testing"
"time"
"wdd.io/agent-common/assert"
"wdd.io/agent-common/pusher"
"wdd.io/agent-common/utils"
"wdd.io/agent-operator/config"
)
var CmiiDevNamespaceList = []string{
"uavcloud-dev",
"uavcloud-devflight",
"uavcloud-devoperation",
}
func TestFindAppNotHealthyOrRestartCountGreaterThanN(t *testing.T) {
deploymentRestartCountGreaterThanN := FindAppNotHealthyOrRestartCountGreaterThanN("devflight", 10)
deploymentRestartCountGreaterThanN = FilterAllCmiiAppSoft(deploymentRestartCountGreaterThanN)
for _, deploymentInterface := range deploymentRestartCountGreaterThanN {
println()
utils.BeautifulPrint(deploymentInterface)
println()
}
}
func TestFindDeploymentReplicasSmallerThanN(t *testing.T) {
deploymentReplicasSmallerThanN := FindDeploymentReplicasSmallerThanN("devflight", 0)
for _, deploymentInterface := range deploymentReplicasSmallerThanN {
println()
utils.BeautifulPrint(deploymentInterface)
println()
}
}
func TestFindCmiiMiddlewarePodInterface(t *testing.T) {
middlewarePodInterface := FindCmiiMiddlewarePodInterface(config.Integration)
for _, middlePod := range middlewarePodInterface {
println()
utils.BeautifulPrint(middlePod)
println()
}
}
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 !")
}
func TestRestartCmiiBackendDeployment(t *testing.T) {
RestartCmiiBackendDeployment("dev")
}
func TestRestartCmiiFrontendDeployment(t *testing.T) {
RestartCmiiFrontendDeployment("dev")
}
func TestFindDeploymentNotHealthy(t *testing.T) {
for _, devNamespace := range CmiiDevNamespaceList {
notHealthy := FindDeploymentNotHealthy(devNamespace)
notHealthy = FilterAllCmiiAppSoft(notHealthy)
for _, deploymentInterface := range notHealthy {
utils.BeautifulPrint(deploymentInterface)
}
}
}
func TestFindAllNodeNotHealthy(t *testing.T) {
start := time.Now()
allNodeNotHealthy := FindAllNodeNotHealthy()
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
allNodeNotHealthy = FilterAllCmiiNodeSoft(allNodeNotHealthy)
assert.Equal(t, len(allNodeNotHealthy), 0, "have unhealthy pod !")
for _, nodeInterface := range allNodeNotHealthy {
println()
utils.BeautifulPrint(nodeInterface)
println()
}
}
func TestFindPodNotHealthy(t *testing.T) {
podNotHealthy := FindPodNotHealthy("devfl")
podNotHealthy = FilterAllCmiiPodSoft(podNotHealthy)
for _, podInterface := range podNotHealthy {
t.Logf("[%s] [%s]", podInterface.Name, podInterface.PodPhase)
}
}
func TestFindPodNotHealthy_And_Delete(t *testing.T) {
podNotHealthy := FindPodNotHealthy("devf")
podNotHealthy = FilterAllCmiiPodSoft(podNotHealthy)
for _, podInterface := range podNotHealthy {
t.Logf("[%s] [%s]", podInterface.Name, podInterface.PodPhase)
podDelete := DefaultCmiiOperator.PodDelete(podInterface.Namespace, podInterface.Name)
assert.Equal(t, podDelete, true, "delete of ", podInterface.Namespace, podInterface.Name, " failed !")
}
}
func TestFilterAllCmiiAppStrict(t *testing.T) {
allInterface := DefaultCmiiOperator.DeploymentAllInterface("devflight")
FilterAllCmiiAppStrict(allInterface)
}
func TestRestartDeploymentFromList(t *testing.T) {
allInterface := DefaultCmiiOperator.DeploymentAllInterface("devflight")
allInterface = FilterAllCmiiAppSoft(allInterface)
RestartDeploymentFromList(allInterface)
}
func TestBackupAllCmiiDeploymentToMap(t *testing.T) {
backendMap, frontendMap, srsMap := BackupAllCmiiDeploymentToMap(config.Demo)
utils.BeautifulPrint(backendMap)
utils.BeautifulPrint(frontendMap)
utils.BeautifulPrint(srsMap)
}
func TestBackupAllCmiiDeploymentToList(t *testing.T) {
allCmiiImageList := BackupAllCmiiDeploymentToList(config.Demo, true)
utils.BeautifulPrint(allCmiiImageList)
}
// 直接更新DEMO的Tag实现DEMO更新
func TestUpdateCmiiImageTagFromNameTagMap(t *testing.T) {
backendMap := map[string]string{
"cmii-admin-data": "6.2.0-demo",
"cmii-admin-gateway": "6.2.0-demo",
"cmii-admin-user": "6.2.0-demo",
"cmii-open-gateway": "6.2.0-demo",
"cmii-suav-supervision": "6.2.0-demo",
"cmii-uav-airspace": "6.2.0-demo",
"cmii-uav-alarm": "6.2.0-demo",
"cmii-uav-brain": "6.2.0-demo",
"cmii-uav-cloud-live": "6.2.0-demo",
"cmii-uav-cms": "6.2.0-demo",
"cmii-uav-data-post-process": "6.2.0-demo",
"cmii-uav-developer": "6.2.0-demo",
"cmii-uav-device": "6.2.0-demo",
"cmii-uav-emergency": "6.2.0-demo",
"cmii-uav-gateway": "6.2.0-demo",
"cmii-uav-gis-server": "6.2.0-demo",
"cmii-uav-industrial-portfolio": "6.2.0-demo",
"cmii-uav-integration": "6.2.0-demo",
"cmii-uav-logger": "6.2.0-demo",
"cmii-uav-material-warehouse": "6.2.0-demo",
"cmii-uav-mission": "6.2.0-demo",
"cmii-uav-mqtthandler": "6.2.0-demo",
"cmii-uav-notice": "6.2.0-demo",
"cmii-uav-oauth": "6.2.0-demo",
"cmii-uav-process": "6.2.0-demo",
"cmii-uav-surveillance": "6.2.0-demo",
//"cmii-uav-threedsimulation": "6.2.0-demo",
//"cmii-uav-tower": "6.2.0-demo",
"cmii-uav-user": "6.2.0-demo",
"cmii-uav-waypoint": "6.2.0-demo",
"cmii-uav-sense-adapter": "6.2.0-demo",
"cmii-uas-lifecycle": "6.2.0-demo",
"cmii-uas-gateway": "6.2.0-demo",
"cmii-uav-advanced5g": "6.2.0-demo",
}
frontendMap := map[string]string{
"cmii-suav-platform-supervision": "6.2.0-demo",
"cmii-suav-platform-supervisionh5": "6.2.0-demo",
"cmii-uav-platform": "6.2.0-demo",
"cmii-uav-platform-media": "6.2.0-demo",
"cmii-uav-platform-ai-brain": "6.2.0-demo",
"cmii-uav-platform-cms-portal": "6.2.0-demo",
"cmii-uav-platform-armypeople": "6.2.0-demo",
"cmii-uav-platform-mws": "6.2.0-demo",
"cmii-uav-platform-oms": "6.2.0-demo",
"cmii-uav-platform-open": "6.2.0-demo",
"cmii-uav-platform-securityh5": "6.2.0-demo",
"cmii-uav-platform-share": "6.2.0-demo",
"cmii-uav-platform-uasms": "6.2.0-demo",
"cmii-uav-platform-uas": "6.2.0-demo",
//"cmii-uav-platform-base": "5.7.0",
//"cmii-uav-platform-detection": "5.7.0",
//"cmii-uav-platform-emergency-rescue": "5.7.0",
//"cmii-uav-platform-logistics": "5.7.0",
//"cmii-uav-platform-multiterminal": "5.7.0",
//"cmii-uav-platform-seniclive": "5.7.0",
//"cmii-uav-platform-splice": "5.7.0",
//"cmii-uav-platform-threedsimulation": "5.7.0",
//"cmii-uav-platform-visualization": "5.7.0",
//"cmii-uav-platform-security": "4.1.6",
}
result := UpdateCmiiImageTagFromNameTagMap(config.Demo, backendMap)
utils.BeautifulPrint(result)
result = UpdateCmiiImageTagFromNameTagMap(config.Demo, frontendMap)
utils.BeautifulPrint(result)
}
func TestScaleCmiiFrontendDeploymentToDesiredReplicas(t *testing.T) {
ScaleCmiiFrontendDeploymentToDesiredReplicas(config.Dev, 0)
}
func TestScaleCmiiBackendDeploymentToDesiredReplicas(t *testing.T) {
ScaleCmiiBackendDeploymentToDesiredReplicas(config.Dev, 0)
}
func TestBackupAllDeploymentFromEnv(t *testing.T) {
BackupAllDeploymentFromEnvToFile(config.Demo)
}
func TestBackUpAllCmiiAppImageNameFroEnv(t *testing.T) {
BackUpAllCmiiAppImageNameFromEnv(config.Demo)
}
func TestRestartCmiiDeployment(t *testing.T) {
cmiiEnv := config.Demo
appNameList := []string{
"cmii-uav-industrial-portfolio",
}
for _, appName := range appNameList {
kill := DefaultCmiiOperator.DeploymentRestartByKill(cmiiEnv, appName)
assert.Equal(t, kill, true, "have unhealthy pod !")
check := DefaultCmiiOperator.DeploymentStatusCheck(cmiiEnv, appName, 180)
assert.Equal(t, check, true, "DeploymentStatusCheck failed !")
}
appName := "cmii-uav-notice"
kill := DefaultCmiiOperator.DeploymentRestartByKill(cmiiEnv, appName)
assert.Equal(t, kill, true, "have unhealthy pod !")
check := DefaultCmiiOperator.DeploymentStatusCheck(cmiiEnv, appName, 180)
assert.Equal(t, check, true, "DeploymentStatusCheck failed !")
}
func TestUpdateCmiiDeploymentImageTag(t *testing.T) {
//计算20:00的时间
now := time.Now()
targetTime := time.Date(now.Year(), now.Month(), now.Day(), 17, 23, 00, 0, now.Location())
duration := time.Duration(0)
if !now.After(targetTime) {
// 计算到20:00的剩余时间
duration = targetTime.Sub(now)
} else {
// 如果当前时间已经过了20:00那么就跳到下一天
//targetTime = targetTime.Add(24 * time.Hour)
}
fmt.Println(duration)
// 等待到20:00
//time.Sleep(duration)
cmiiEnv := config.Demo
appNameTagMap := map[string]string{
//"cmii-app-release": "6.1.0-122001",
//"cmii-uav-platform-oms": "6.2.0-012201",
//"cmii-uas-lifecycle": "6.2.0-012301",
"cmii-uav-advanced5g": "6.2.0-master-012301",
//"cmii-uav-platform-pilot2-to-cloud": "6.1.0-32030-123101",
//"cmii-uav-industrial-portfolio": "6.1.0-20241125-121702",
}
for appName, newTag := range appNameTagMap {
ok, oldImageTag, newImageTag := UpdateCmiiDeploymentImageTag(cmiiEnv, appName, newTag)
if !ok {
log.ErrorF("update image tag failed !")
UpdateCmiiDeploymentImageTag(cmiiEnv, appName, oldImageTag)
}
utils.SplitLinePrint()
check := DefaultCmiiOperator.DeploymentStatusCheck(cmiiEnv, appName, 300)
assert.Equal(t, check, true, "deployment run failed!")
if !check {
UpdateCmiiDeploymentImageTag(cmiiEnv, appName, oldImageTag)
}
deploy := DefaultCmiiOperator.DeploymentOneInterface(cmiiEnv, appName)
// push message
message := pusher.CmiiUpdateMessage{
Namespace: cmiiEnv,
AppName: appName,
FromTag: oldImageTag,
ToTag: newImageTag,
Replicas: strconv.FormatInt(int64(deploy.Replicas), 10),
DeployStatus: check,
}
message.SendMessage()
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,322 @@
package main
import (
"bufio"
"fmt"
"testing"
"time"
"wdd.io/agent-common/assert"
"wdd.io/agent-common/utils"
"wdd.io/agent-operator/config"
)
func TestCmiiK8sOperator_DeploymentAll(t *testing.T) {
start := time.Now()
deploymentList := DefaultCmiiOperator.DeploymentAll("devflight")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
var nameList []string
count := 1
for _, deployment := range deploymentList {
if deployment.Spec.Replicas != nil {
count++
}
nameList = append(nameList, deployment.Name)
}
t.Logf("deployment list lenght is => %d", count)
t.Logf("deployment name list are => %d", count)
utils.BeautifulPrint(nameList)
//for _, deployment := range deploymentList {
// utils.BeautifulPrint(deployment)
// println()
//}
}
func TestCmiiK8sOperator_DeploymentAllInterface(t *testing.T) {
start := time.Now()
deploymentList := DefaultCmiiOperator.DeploymentAllInterface("devflight")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
t.Logf("deployment list lenght is => %d", len(deploymentList))
for _, deployment := range deploymentList {
utils.BeautifulPrint(deployment)
println()
}
}
func TestCmiiK8sOperator_DeploymentFizz(t *testing.T) {
start := time.Now()
deploymentFizz := DefaultCmiiOperator.DeploymentFizz("int", "cmii-suav-supervision")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
t.Logf("deployment list lenght is => %d", len(deploymentFizz))
cmiiDeploymentInterface := config.CmiiDeploymentInterface{}
for _, pod := range deploymentFizz {
convert := cmiiDeploymentInterface.Convert(pod)
utils.BeautifulPrint(convert)
utils.BeautifulPrint(pod)
}
// elastic search
}
func TestCmiiK8sOperator_DeploymentScale(t *testing.T) {
start := time.Now()
DefaultCmiiOperator.DeploymentScale(config.Demo, "cmii-uav-industrial-portfolio", 1)
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
}
func TestCmiiK8sOperator_DeploymentUpdateTag(t *testing.T) {
start := time.Now()
DefaultCmiiOperator.DeploymentUpdateTag("Demo", "cmii-uav-gateway", "5.7.0")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
}
func TestCmiiK8sOperator_DeploymentRestart(t *testing.T) {
cmiiEnv := config.Integration
appName := "cmii-uav-data-post-process"
DefaultCmiiOperator.DeploymentRestart(cmiiEnv, appName)
utils.SplitLinePrint()
check := DefaultCmiiOperator.DeploymentStatusCheck(cmiiEnv, appName, 180)
assert.Equal(t, check, true, "deployment run failed!")
}
func TestCmiiK8sOperator_DeploymentRestartByKill(t *testing.T) {
cmiiEnv := "Demo"
appName := "cmii-uav-platform"
kill := DefaultCmiiOperator.DeploymentRestartByKill(cmiiEnv, appName)
assert.Equal(t, kill, true, "deployment restart by kill failed !")
utils.SplitLinePrint()
check := DefaultCmiiOperator.DeploymentStatusCheck(cmiiEnv, appName, 180)
assert.Equal(t, check, true, "deployment run failed!")
}
func TestCmiiK8sOperator_ReplicaSetExists(t *testing.T) {
cmiiEnv := "uavcloud-devflight"
appName := "cmii-admin-data-bf8f87cb7"
exists := DefaultCmiiOperator.ReplicaSetExists(cmiiEnv, appName)
utils.BeautifulPrint(*exists)
}
func TestCmiiK8sOperator_ReplicaSetByAppName(t *testing.T) {
cmiiEnv := "uavcloud-devflight"
appName := "cmii-admin-data"
exists := DefaultCmiiOperator.ReplicaSetByAppName(cmiiEnv, appName)
for _, replicaSet := range exists {
utils.BeautifulPrint(replicaSet)
}
}
func TestCmiiK8sOperator_PodAll(t *testing.T) {
start := time.Now()
podList := DefaultCmiiOperator.PodAll("devflight")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
for _, pod := range podList {
println()
utils.BeautifulPrint(pod)
println()
break
}
}
func TestCmiiK8sOperator_PodFizz(t *testing.T) {
start := time.Now()
podList := DefaultCmiiOperator.PodFizz("devflight", "cmii-uav-data-post-process")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
t.Logf("pod list lenght is => %d", len(podList))
cmiiPodInterface := config.CmiiPodInterface{}
for _, pod := range podList {
println()
utils.BeautifulPrint(pod)
println()
convert := cmiiPodInterface.Convert(pod)
utils.BeautifulPrint(convert)
}
}
func TestCmiiK8sOperator_PodByAppName(t *testing.T) {
cmiiEnv := config.Demo
appName := "cmii-admin-data"
exists := DefaultCmiiOperator.PodByAppName(cmiiEnv, appName)
for _, podInterface := range exists {
utils.BeautifulPrint(podInterface)
}
}
func TestCmiiK8sOperator_PodFizz2(t *testing.T) {
start := time.Now()
podList := DefaultCmiiOperator.PodFizz("devflight", "notice")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
t.Logf("pod list lenght is => %d", len(podList))
podInterface := config.CmiiPodInterface{}
for _, pod := range podList {
convert := podInterface.Convert(pod)
println()
utils.BeautifulPrint(&convert)
println()
}
}
func TestCmiiK8sOperator_PodByNodeName(t *testing.T) {
cmiiEnv := config.DevOperation
nodeName := "Dev-master-01"
exists := DefaultCmiiOperator.PodByNodeName(cmiiEnv, nodeName)
exists = FilterAllCmiiPodSoft(exists)
for _, podInterface := range exists {
utils.BeautifulPrint(podInterface)
if !podInterface.PodStatus {
podDelete := DefaultCmiiOperator.PodDelete(podInterface.Namespace, podInterface.Name)
assert.Equal(t, podDelete, true, "delete pod failed !")
}
}
}
func TestCmiiK8sOperator_NodeCordon(t *testing.T) {
cmiiEnv := config.DevOperation
nodeName := "Dev-master-01"
cordon := DefaultCmiiOperator.NodeCordon(cmiiEnv, nodeName)
assert.Equal(t, cordon, true, "cordon node failed !")
}
func TestCmiiK8sOperator_NodeUnCordon(t *testing.T) {
cmiiEnv := config.DevOperation
nodeName := "Dev-06.ecs.io"
uncordon := DefaultCmiiOperator.NodeUnCordon(cmiiEnv, nodeName)
assert.Equal(t, uncordon, true, "uncordon node failed !")
}
func TestCmiiK8sOperator_PodEvictFromNode(t *testing.T) {
cmiiEnv := config.DevOperation
nodeName := "Dev-04.ecs.io"
podList := DefaultCmiiOperator.PodEvictFromNode(cmiiEnv, nodeName)
for _, podInterface := range podList {
utils.BeautifulPrint(podInterface)
}
}
func TestCmiiK8sOperator_PodExec(t *testing.T) {
podList := DefaultCmiiOperator.PodByAppName(config.DevFlight, "cmii-uav-gateway")
stdout, stderr := DefaultCmiiOperator.PodExec(config.DevFlight, podList[0], []string{
"env",
})
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
// Get the current line
line := scanner.Text()
// Check if the current line contains the search term
fmt.Println(line)
}
utils.SplitLinePrint()
scanner = bufio.NewScanner(stderr)
for scanner.Scan() {
// Get the current line
line := scanner.Text()
// Check if the current line contains the search term
fmt.Println(line)
}
}
func TestCmiiK8sOperator_DeploymentStatusCheck(t *testing.T) {
cmiiEnv := "devflight"
appName := "cmii-uav-gateway"
check := DefaultCmiiOperator.DeploymentStatusCheck(cmiiEnv, appName, 180)
assert.Equal(t, check, true, "deployment run failed!")
}
func TestCmiiK8sOperator_NodeAll(t *testing.T) {
start := time.Now()
nodeList := DefaultCmiiOperator.NodeAll("Dev")
elapsed := time.Since(start).Milliseconds()
fmt.Printf("执行耗时: %d ms\n", elapsed)
for _, node := range nodeList {
println()
utils.BeautifulPrint(node)
println()
}
}
func TestCmiiK8sOperator_NodeAllInterface(t *testing.T) {
cmiiNodeInterfaces := DefaultCmiiOperator.NodeAllInterface(config.Demo)
for _, nodeInterface := range cmiiNodeInterfaces {
println()
utils.BeautifulPrint(nodeInterface)
println()
}
}
func TestCmiiK8sOperator_DeploymentOneInterface(t *testing.T) {
namespace := config.Demo
appName := "cmii-uav-mission"
deploy := DefaultCmiiOperator.DeploymentOneInterface(namespace, appName)
utils.BeautifulPrint(*deploy)
}

View File

@@ -0,0 +1,12 @@
package config
const (
Dev = "uavcloud-dev"
DevFlight = "uavcloud-devflight"
DevOperation = "uavcloud-devoperation"
Validation = "uavcloud-feature"
Integration = "uavcloud-test"
Uat = "uavcloud-uat"
Demo = "uavcloud-demo"
Uavms = "uavcloud-uavms"
)

View File

@@ -0,0 +1,63 @@
package config
var CmiiDevK8sConfig = `
apiVersion: v1
kind: Config
clusters:
- cluster:
api-version: v1
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3akNDQWFxZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFTTVJBd0RnWURWUVFERXdkcmRXSmwKTFdOaE1CNFhEVEkwTURZd05UQTRNakl4T0ZvWERUTTBNRFl3TXpBNE1qSXhPRm93RWpFUU1BNEdBMVVFQXhNSAphM1ZpWlMxallUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsWFhmZGwrbkxnCkt2RnV6OFVkNTQ0T2Q2M1RpaHNOYzMvZlJZSXdEcWNLcXo3ditEQVZzYTZXem94WUxHK1BOaDFHbzZYeXBKSXoKV1hWNFN4NC9mVXo0S2hpMW5mY3RnSkVReVdnU3ZkbDVpcEQxaTJIRkEvR3Jnb3R2RkljN0IwRExVdzBrb3F0Ygo2QzlSYnhNSFFpWk1yZXlzelJYWXRGN3J1c1dHb2J5eGc5RFZsczdTWmdGMjhOSkZXOHNFa0FMaWRwMTBUVENECk05QkhENXdEQkRVMGsyMzFRaE1lY3IzL2YzZDVvOG8vVklLTWs0VDFIZ2lMM0NuZmZlc2FGeTNVSnlxSnBERkUKYmtici9uSmNxcXZ5emxnQ1hsSEtTUlN1ZFN1QkVhbHVRbTczSC83b05oVHE2Y1BkN0hwUHdnK3BTR0kvd0h6NwpHaHNReVVCRXNoa0NBd0VBQWFNak1DRXdEZ1lEVlIwUEFRSC9CQVFEQWdLa01BOEdBMVVkRXdFQi93UUZNQU1CCkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBREJUSlc0ckNQSFNraVQzZ1RsQWJ5a0VsMlF4cFBwRHRLdWwKUHU0cDVsQ0RUZWhJTWFabnlnREZMajlpN2tQQ3lGb1JQaFRxcyswaWVId0p3N2xYWG00dnNOTGZXajN3MDV1Rgo0dnM1N0JRZTI2VzBSZWNMdG5iUFNYVXBJdDBxcjV2VVcwVkYxNk1wdm40ZzZIL2Rvc0hxOUlHcTBMWFpWaU5sClhPUUgvUXZNOG5xTWM4RHFaSG9DUzNvQ3NGQWVTeHd2eFQvY3QwRDUwVWE3ZWtlRllVLzZkSzY0dkk5bzJhY0UKSWc1UkhnM0NlR2RNN2VLdXN1bUpjL1FOeHZTd3pwS0xjWjlzNnpLODVRdlB2dFlTWmRYVEhmdlVENUpHdlFoQwpjLzlMci9BV0hBWUxOOXpOSEdOdE9nK0h1TTBPVHZKeWZkYnF0dVJXTklOL2NlYmhnTTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: "https://192.168.35.178:6443"
name: "rke-cluster"
contexts:
- context:
cluster: "rke-cluster"
user: "kube-admin-rke-cluster"
name: "rke-cluster"
current-context: "rke-cluster"
users:
- name: "kube-admin-rke-cluster"
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2VENDQWRHZ0F3SUJBZ0lJQmtVSkFlMU9yMW93RFFZSktvWklodmNOQVFFTEJRQXdFakVRTUE0R0ExVUUKQXhNSGEzVmlaUzFqWVRBZUZ3MHlOREEyTURVd09ESXlNVGhhRncwek5EQTJNRE13T0RJeU1UbGFNQzR4RnpBVgpCZ05WQkFvVERuTjVjM1JsYlRwdFlYTjBaWEp6TVJNd0VRWURWUVFERXdwcmRXSmxMV0ZrYldsdU1JSUJJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNLTS9KclZCRjJhejV5Wlcwb0ZoN0dCNnhkYW8KWjh4cnk2MXBob0FmM3gxbmxJUkhtK08vaDdCbVdpNXBCciswV1FOUEJNV3pXT3FCa1VDcWVrZHJEd3VqM3VpZQoxVzJ0d2tUUDhmb1NZK1ZQY2xPWkJIR0NrNzZad0N0SFlTb05mci9PcHQyb2grNFptVUdlcFJjNndrYzNXTkxXClB6djh0NUFTZGJTbnYxUXZJaVg5Z1kySWpjRlU0YUdudW9PQ29Rdzd5OUdIOWJOMHMwM2hMN0kraXhoTm16TlIKajVoOEU4SGhPVzhSZXVwUzBDSlVVazZwSzZRUFcwd0hRME9pajVIV1JZRmd1aTFDaE9vcTN0emVlVTBvRytRegpPN1M1bFB0NExYdFpGN1NvSWFMb1A5bG9valpMWFhlY21QcnBTS3NOY2p2K3FnNk93d3BhZXNDaG5RSURBUUFCCm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd0l3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dFQkFEcHJJMGRtZTMrK0RRWmVTNjRuSHBySHBwNGxFU2t5UkNsNVdjd3gvR00yc2s5bQp5Z0Jmcjlkd2dJQmFpSU5XQld3YWFlWVdBaS91dXJTRTZ2cUxkeUNlVkRNeGlQWnhPS3hLd3ZtWFpHL2lsRkxjCk50TEg5R3pGY0RqdUM4QndpRDAxbnlaTHZsRVV3TW9DVEpQNi96VGRpV3JqU1VHVXVIN1FkTHhNN29ROU4za0YKNm5qUzlZV2JYU1hVckNXc2pna1lIMmphTXEyZzFuNU9mN3JQOXptZjJBZ1VVVUlmYzhIaS9RQWx6eWRIdlFqUQpHNlFGUjF4aGg0ZzFtcUw5aWQyek1sZXQvZXNqSWlwemZJMzF4L1lvd2lnNlZPeDhkQWNQMFZBZXpOS3Y3cmJaCkdYSFNwcEJrOS9GdFFyMytWTitsTWVtS2dqTG40Tk1EZjkzOTcxcz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBc0tNL0pyVkJGMmF6NXlaVzBvRmg3R0I2eGRhb1o4eHJ5NjFwaG9BZjN4MW5sSVJICm0rTy9oN0JtV2k1cEJyKzBXUU5QQk1XeldPcUJrVUNxZWtkckR3dWozdWllMVcydHdrVFA4Zm9TWStWUGNsT1oKQkhHQ2s3Nlp3Q3RIWVNvTmZyL09wdDJvaCs0Wm1VR2VwUmM2d2tjM1dOTFdQenY4dDVBU2RiU252MVF2SWlYOQpnWTJJamNGVTRhR251b09Db1F3N3k5R0g5Yk4wczAzaEw3SStpeGhObXpOUmo1aDhFOEhoT1c4UmV1cFMwQ0pVClVrNnBLNlFQVzB3SFEwT2lqNUhXUllGZ3VpMUNoT29xM3R6ZWVVMG9HK1F6TzdTNWxQdDRMWHRaRjdTb0lhTG8KUDlsb29qWkxYWGVjbVBycFNLc05janYrcWc2T3d3cGFlc0NoblFJREFRQUJBb0lCQUM1QzB1dEVWVVBYdGc0MwowRTFaYlZnRy9LQ0wwNWM3eG8rVlh5bkdySkkybFVZa1RzelpIUFJna3EzVHNkWCtwekVZMkwwYk9obHpjWE9sClNBQzJhNmVKR09Yc2JvemZLTDdVWHRHMCtOUUkzb0hHdXpDYXVlUVA2eHlWT1NDTmJ2TmZNTFFySVZSWVc0UHoKMTZUTkxLcHRGR1hDOGpHbGVFNXJBU3Fxb2JSTjNHeG01R08xL0ppOHlvcG5sbVdnV0VKUjUyWXI2SVFBNk1xMQpYQXNGYzZ6UlRhVHRsN000Z3ZRU3VONVNKT1BZdkpscGJYejZ1WDRGcTRSUFc5dEFLekN5cFVDam05WGdaZ2FHCktpaHEwWVY1ZWMybFYveVZlTjBTMUs1NS9ZL3ZsOHNTNC9XbmZlZk1na2FBbytEc3FJOS9lSzduOUNQZkNUc3EKQ2VTUkJJRUNnWUVBNEtvbzJNcTkxemlJSE9BRXpTNjNKaVlzY2VqTCs5bCtCM1FUV1RteE1jc2MrUnptUW5OMQp3dllzaTdnSkVsR3hnVHJ3ai9KT3NhM1hCUnJPL0NjOXZQYzhNNnR0UEliUjVNZ29lSzFNalBvMGdhTmlsV1F5CnlScUh5RzlOMWMrMEhOZnFyUFAydzVhMysvQmZ5VS9mVEI5a0RjMU1waDZWaHNzQ2VuakhoOWtDZ1lFQXlVWSsKS1NaVzc5RFJYS1k5N0U1OG9MRGt4ajhXUllpMVlwTFc2djJPLy9McXBmU08ycmR0USs5aHR0cklrUC9hZlc0MAowMzRmOTVsKzNPR0c0b0I5VytNdUhIOVdtR1ZKNHljUlJhSk9YWXNhVk42Smh1ZGE5Y0FGRFJkRkJLZVBVRjB3Ck9NaFlBSU9OYnRKcFdENXJ0djNZTlM3ckg4K2QweU1kc2RvVHNXVUNnWUFiTFhwemYxTW56ZmJwUjFCTllmRlYKOUJnOFQyVWR1bG04blJZYUhSaUtaWC9Ed3ZNMzVxL0FQZmQxajNYSmVZaDNrYUc0U0Irczd0S3NFMm9tcHJpWgpPMjlVOE0vdUdvRVpvLzBCWERWK2VHWVJxS29zV0Vxc2VVRWp4aE1zWWt2dmtVOGFUUWowOEM2aGs1cUN4OTdEClhxakQ0cW43RG9nWUhrYldlZlhwUVFLQmdDbTdHcUJGaHJqcVByNUs2WVBaTWhYUEYxL1RMTGIyQlVXTzFHaWMKY2MyM2U5YzB3WG12bGtRRG1lcmpxYm9Ha2pKM2F4UitqZm8wSlExKzVReUpQM1NSd2JtKzNTRnp2c0lPRTVLdwplRGNFNUV5OFp4OUZVS0tyVVdESmRsSGt1OTRadENuUndBMDdPVlBFNUhxYlZwSDJSNkdmUExpM3Z5MUxscGlOCmNvL1JBb0dCQUl4OHloK1lLOHpHUlR2aTFseUdTTG90eFlWdlZMbWc4bG9CRmFzUS9tR0RhTk1rNVZ6cS9mUmgKbHU1dGUzWjhtYmxvTExUdzd1OUhRcGM3UGNqVklFV21DazBhYVA4YUs5VkpGYVQzV0xzWG1nRGIrb0tuNG9DVgpTSzZsOWVlQS9uWDA1Uk5xMEx0ekR3d3JNa2paR1VYZ3FldXJvTTF2cjJ2a2RLTkxhWEtmCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
`
var CmiiDevOldK8sConfig = `apiVersion: v1
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=`
var CmiiCoreK8sConfig = `apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01URXhOakUwTURJd09Wb1hEVE13TVRFeE5ERTBNREl3T1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEZhCjV4N0M2MisrZjA5UXUzVWR6UUFXRDN4NDRkTVV6bkxvTjc5Y0RTbzduYjhTd0JmMzk2aFEwaEdiT2lDUXhLc1IKczJhcXl2N0dLUXAvdTVNbUU0bXF1YWEybE1yUkc1UWFJOWhHNlp5SDdxYkFlU0dZSVplZGVoMWF6bzVnblBWRwoyck5aVWR3WU5tUXYvemF6V3dSbi9QQUNuNEt4MkxjYVVJUm16YkZHRnJ2VXl3UDl4UTc2MlNvRWZoMENycEpvCmltTHR3ZGFOU3dweGRCTFpkcXlRY05xRVV0dUI2VXVVM0Z3Y2FBckJpNTZ1OTFJbHVEWS9Dd1UyeDJCSHR1WkwKR2RuQUM0c1VhWm9oZzRFZ0U3UEp6RnFXTUtyaGRmekRzc05EK1VhV2sxRmhvRzViVWZiQ051Zy9KUnNlRzJBZQpodjAvU1ZNcSs5WWYyR0dheC9NQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGdVYxK3Z4UGVrUm82T2U2YTI4NmFHQjduWG0KMUlGVllwSWUxeTVoZy9aTlhKN1RndXFPb2Zjc3JnZ1h2MmdaQkdFN0pheTM0SkhuRFB3Y3ZCMzhHQUxtZmZWeAo2THJVN2ZtSWlpajRIc1NyaHRrMWQzcmhjdFkwMEw2dGJMMzVvTWJnUGwzSERUbGh0M0wxM0gvUVFScXR3TXFOCnBHeWk3VWprbFNpNWVsRWJrbnlUUy9OWTA1Y1JyMTU2N0p4N3F3QlpmUlZaZURUOHdidHpMZ05UWlFZRzVoM2EKQmp6dnlINFoyR2YrNnM4aXZlbGFUMjdPbGpOUTJvUUdyenhHV0ErZGJKSzNIdDVRRkVCeDdVaEsrNWtwYXViNwpWZTB1ekdGK1ZDb2ZFV2FtNk9CUFAycE51SW85d0Jsa24vbU9FUW5SU1FNMW15dmlIWHBaMnVKd1ozbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
server: https://vip.ecs.io:6444
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: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4ekNDQWR1Z0F3SUJBZ0lKQU5ZM0hyTXZseUZjTUEwR0NTcUdTSWIzRFFFQkN3VUFNQlV4RXpBUkJnTlYKQkFNVENtdDFZbVZ5Ym1WMFpYTXdIaGNOTWpFd01URTFNRGd6T0RNNFdoY05NekV3TVRFek1EZ3pPRE00V2pBMApNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RVpNQmNHQTFVRUF3d1FhM1ZpWlhKdVpYUmxjeTFoClpHMXBiakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMS21TZDJIeVdYN2VTdnYKdS8yRnBZQWM5SWRBcFlQbmtESk5wR0Z1SEVlOUJWVXMyL1o3L3BQWGY3NTljVFdZUkV2V0dybDBNS1dTajhycAowQ2JTN3dvdkg2NnpTcWNKRDUzMW11OTgvaE0zenZzaTVqalIxOU5yTEFIL0QzbEZ6d2VnVHpNUWFvenNPc2VOCm0vNmI5cGRLNUcwYkNPRkJlZTRzeW1VdnVjT1NKblg5YkpZUnhNbVI5WHl3REowcnpTSHJrVE9ocVErUXYzdTAKMGZvVk9NSm9BdWkvR2JEV3ZpTEQrRmlDMnFJY0FYRGhNaGd2eVJwTFBPNFlZc0tCc2xjUVJwbkpjei9heFRBUQovM0c3T1pYWjJkNWVDQmRDY0pqL2orNlkyNVJsVXNDNDZzZWR1cTR0SGMrbEJ3UG5FSDYvTG53SUE0VHVaRXBpCkI3Q3RyU0VDQXdFQUFhTW5NQ1V3RGdZRFZSMFBBUUgvQkFRREFnV2dNQk1HQTFVZEpRUU1NQW9HQ0NzR0FRVUYKQndNQ01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ0llSU0wSllLVjNiNUhISEdzMmV0eEt0VnQwaGNBTzNmcgpCcU5Ba3lPNkpvWkU2dnh3Nm5lQXNhc3V5RXh1NDFiMmlwYTJFdFlsTUNWbHE0anhjQWptMnU4b0xWb3NoWWIxClU4MkRqMkJuV2Z6TnhKV3dqSnQ5UzFhUXZmOXFxaDhueGJTeUVhNmxMZmEvTEpFQURzMDZNR05tQUJxbk5ZUVEKcEh1UnNXQlhwT3lSaWhtMHdlK21UNGwxYklMZ0Zpa2ZSaUw1WkRnWVlTNG9BRVpGY1NBbldKRFhSVTI0S0JIRQppYXk4SlNIcks1Ym12TWVpR1ZkL054WlhmSFdCcUcvZUI1SDRuaFhtVzhWbEdjQnhvdDBvckVta2FsblFpYnEwCnBWNUlwcXFBU3JjcjZnVUxrRmtvdWo1aG9rNWdIdWpqakFkenVSa3hyYTJiNERFa05jTTQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBc3FaSjNZZkpaZnQ1SysrNy9ZV2xnQnowaDBDbGcrZVFNazJrWVc0Y1I3MEZWU3piCjluditrOWQvdm4xeE5aaEVTOVlhdVhRd3BaS1B5dW5RSnRMdkNpOGZyck5LcHdrUG5mV2E3M3orRXpmTyt5TG0KT05IWDAyc3NBZjhQZVVYUEI2QlBNeEJxak93Nng0MmIvcHYybDBya2JSc0k0VUY1N2l6S1pTKzV3NUltZGYxcwpsaEhFeVpIMWZMQU1uU3ZOSWV1Uk02R3BENUMvZTdUUitoVTR3bWdDNkw4WnNOYStJc1A0V0lMYW9od0JjT0V5CkdDL0pHa3M4N2hoaXdvR3lWeEJHbWNselA5ckZNQkQvY2JzNWxkblozbDRJRjBKd21QK1A3cGpibEdWU3dManEKeDUyNnJpMGR6NlVIQStjUWZyOHVmQWdEaE81a1NtSUhzSzJ0SVFJREFRQUJBb0lCQUdCam1EY09ySHQ1MDBjQgpja3kzYnpSUWF4OE9vajhwRVlRU29ENXhTcERxUzVaSlBlVWZ3WnZEQ2dtZFpSZWxzRE82c1hDZVlDRDFrdC9JCmg2WnE2TTUxM29KRCttTmxZQ2U1L0g1NjBodE1ZVURlODVoMG9CNVNGTXgrOGJwZEQvYnRaODRGYlhmYmZWdHQKN0Z6VGlaalhyNmV1am52NjkrNnAvQW5jVmo1T0ZRNTZOeHZjbGpxWitlNVM4TDhtZzFUWkpPS3ZRck4vRkRBSAplSHVNeldEcTlLVURXaU9LN0d3aDFGWHdoVTV2T3BwMTRtZjVCVmp4Y3Qvek9DcHdLd2NYaE5NUVRTTVhYUHFsCllBTjBOKzMzb1pkenRxUEtJWHVjaGp3aFhQOWJCZ2REc0M3MTgzNDlWZFRMblZBN2doQlRCcUJRVFVlWitrVnMKU2xwcENvRUNnWUVBNlRteEJyWXMybDExWmtNUDhyenRtcXhiRlNaU0t0bnh1Rk5LNTlRU3ZPQkVFMmlGUCtxMQpwdHY2elhQWkVaVFBoeUowWU83VFcxQk5mZjJUaVdpNzA1TDFlUTVIVlU3QjVMQkthSkV6RFdPYmt6NWxOWk5GCmxWdnM0UGg3SzJvdjBuNjJkMnZlclpZQzBCOWlpUGlFbHFLaFRialF4QzZJYzM3YWtVQytmb01DZ1lFQXhCaEgKUXJ0ZzlrMHVlejJ6ek5SQ1dXb0Jsa0xwdjhEWU1pUFB5aWZUS0dHZDN5c0hIc05RQVZVTDR1YngzdFkrUjdzeApUS2pRb2dSd2tobTJmQUMvN0VRenZNbXMrYWtEai9wUWVXUDU5VVlOK1ptUUFPbDBtQUx2NnovM0RGMnl6RHI5Ckx4eDBieTJXMERpMGs1N0lER3lIV3ZKUHROcmRBZkY1NlV5VVZJc0NnWUJyNnNNTVBQMnlLUzZxbS90a01hR3MKUVhaLzZkUjVlWkdNM2hXNkFmcU5wU1E2NnRGRml5QjB6ak5XSC9YZ1djQlJZbE1CaTJFSFRyZ2N4Vm9nYWZNSAphbWZsbFFMUzZYZDBqMUpPNG1rQ0dBWWo4dW80Q1NaWWYwbXpxNmFxcHg3cndyQkJ3QXN3dlVvZDdYZlZzMUQrCnRzLzJ1NzcyR0NZUmN6QkZwL1M5YXdLQmdGdXd6b0ZSaElFbWpibHFuSXdHSkJBVEZUTGhqdEx1cFNpc3ZoaFUKanRPdThWYk1rOE82cDhvM3Joc215YW5jbTdxR3VRS1RYUnFrNE00djM3Z1QwYW4wS2d6NGNEMDgza0dRVmRpcworcy9KTmZlajZrWEM0NVhBcWRaaVRtNGwwZGpWTEZXL0JHS0grcURhSXZWenBTN0tBSEJ5SlByMzY2ZGc5aFEwCmpwY0pBb0dBRE50eWMrSlVTSmVhQUd5ZlluUEFkRnBSakZQNUZ6ZGdod1JLNVR2WVI0c2Qwd1lyTXVVNnRPSVQKMHpGMUEwTlRSbmI0SStpUklzU3plZ0xzSHg1OXJKNnY2d3Q3NlIwUEFjWlB6cDVkemxTbXYybGRPNEE5MVRLegp2dEIxRGZHUm5pQ1dpOURjRkJpaVRVZlZUbXRtU3pCRGdsREVQUE51Q0txaGkvamRvQVU9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==`

View File

@@ -0,0 +1,261 @@
package config
import (
v1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"strings"
"wdd.io/agent-common/logger"
"wdd.io/agent-common/utils"
)
var log = logger.Log
type CmiiInterfaceConvert interface {
}
type CmiiPodInterface struct {
Name string
Namespace string
//ReplicaSetName string
ContainerImageMap map[string]string
PodIP string
HostIP string
NodeName string
RestartCountMap map[string]int32
RestartCount int32
ContainerName string
Image string
ImageTag string
GitBranch string
GitCommit string
PodStatus bool
PodPhase corev1.PodPhase
}
type CmiiDeploymentInterface struct {
Name string
Namespace string
AvailableReplicas int32
Replicas int32
ContainerImageMap map[string]string
ContainerName string
Image string
ImageTag string
GitBranch string
GitCommit string
StatusOk bool
}
type CmiiNodeInterface struct {
Name string
Hostname string
InternalIP string
KernelVersion string
OsImage string
Architecture string
KubeletVersion string
CpuCapacity string
MemoryCapacity string
PodCapacity string
StorageCapacity string
Labels map[string]string
Unschedulable bool
NodeStatus bool
MemoryPressure bool
DiskPressure bool
PIDPressure bool
NetworkUnavailable bool
}
func (deploy CmiiDeploymentInterface) Convert(deployment v1.Deployment) CmiiDeploymentInterface {
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
if strings.Contains(container.Image, ":8033") {
deploy.ImageTag = strings.Split(container.Image, ":")[2]
} else {
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
deploy.Namespace = deployment.Namespace
deploy.AvailableReplicas = deployment.Status.AvailableReplicas
deploy.Replicas = *deployment.Spec.Replicas
deploy.ContainerImageMap = containerImageMap
deploy.StatusOk = deployment.Status.AvailableReplicas == *deployment.Spec.Replicas
return deploy
}
func (deploy CmiiDeploymentInterface) ConvertFromStatefulSet(statefulSet v1.StatefulSet) CmiiDeploymentInterface {
containers := statefulSet.Spec.Template.Spec.Containers
containerImageMap := make(map[string]string, len(containers))
if len(containers) > 1 {
log.WarnF("[CmiiDeploymentInterface ConvertFromStatefulSet] - statefulSet [%s] [%s] container greater than one !", statefulSet.Namespace, statefulSet.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 = statefulSet.Name
deploy.Namespace = statefulSet.Namespace
deploy.AvailableReplicas = statefulSet.Status.AvailableReplicas
deploy.Replicas = *statefulSet.Spec.Replicas
deploy.ContainerImageMap = containerImageMap
deploy.StatusOk = statefulSet.Status.AvailableReplicas == *statefulSet.Spec.Replicas
return deploy
}
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
if strings.Contains(container.Image, ":") {
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
pod.RestartCount = utils.MaxInt32(pod.RestartCount, containerStatus.RestartCount)
}
pod.Name = podDetail.Name
pod.Namespace = podDetail.Namespace
pod.ContainerImageMap = containerImageMap
pod.RestartCountMap = containerStatusMap
pod.PodIP = podDetail.Status.PodIP
pod.HostIP = podDetail.Status.HostIP
pod.NodeName = podDetail.Spec.NodeName
pod.PodPhase = podDetail.Status.Phase
switch podDetail.Status.Phase {
case corev1.PodFailed:
pod.PodStatus = false
break
case corev1.PodPending:
pod.PodStatus = false
break
case corev1.PodReasonUnschedulable:
pod.PodStatus = false
break
default:
pod.PodStatus = true
break
}
return pod
}
func (node CmiiNodeInterface) Convert(sourceNode corev1.Node) CmiiNodeInterface {
node.Name = sourceNode.Name
for _, nodeAddress := range sourceNode.Status.Addresses {
if nodeAddress.Type == corev1.NodeInternalIP {
node.InternalIP = nodeAddress.Address
}
if nodeAddress.Type == corev1.NodeHostName {
node.Hostname = nodeAddress.Address
}
}
node.KernelVersion = sourceNode.Status.NodeInfo.KernelVersion
node.OsImage = sourceNode.Status.NodeInfo.OSImage
node.KubeletVersion = sourceNode.Status.NodeInfo.KubeletVersion
node.Architecture = sourceNode.Status.NodeInfo.Architecture
node.CpuCapacity = sourceNode.Status.Capacity.Cpu().String()
node.MemoryCapacity = sourceNode.Status.Capacity.Memory().String()
node.PodCapacity = sourceNode.Status.Capacity.Pods().String()
node.StorageCapacity = sourceNode.Status.Capacity.Storage().String()
node.Labels = sourceNode.Labels
for _, nodeCondition := range sourceNode.Status.Conditions {
switch nodeCondition.Type {
case corev1.NodeReady:
node.NodeStatus = uniformNodeConditionStatus(nodeCondition.Status)
break
case corev1.NodeMemoryPressure:
node.MemoryPressure = uniformNodeConditionStatus(nodeCondition.Status)
break
case corev1.NodeDiskPressure:
node.DiskPressure = uniformNodeConditionStatus(nodeCondition.Status)
break
case corev1.NodePIDPressure:
node.PIDPressure = uniformNodeConditionStatus(nodeCondition.Status)
break
case corev1.NodeNetworkUnavailable:
node.NetworkUnavailable = uniformNodeConditionStatus(nodeCondition.Status)
break
}
}
node.Unschedulable = sourceNode.Spec.Unschedulable
return node
}
func uniformNodeConditionStatus(conditionType corev1.ConditionStatus) bool {
if conditionType == corev1.ConditionTrue {
return true
} else {
return false
}
}

View File

@@ -0,0 +1,19 @@
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01URXhOakUwTURJd09Wb1hEVE13TVRFeE5ERTBNREl3T1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEZhCjV4N0M2MisrZjA5UXUzVWR6UUFXRDN4NDRkTVV6bkxvTjc5Y0RTbzduYjhTd0JmMzk2aFEwaEdiT2lDUXhLc1IKczJhcXl2N0dLUXAvdTVNbUU0bXF1YWEybE1yUkc1UWFJOWhHNlp5SDdxYkFlU0dZSVplZGVoMWF6bzVnblBWRwoyck5aVWR3WU5tUXYvemF6V3dSbi9QQUNuNEt4MkxjYVVJUm16YkZHRnJ2VXl3UDl4UTc2MlNvRWZoMENycEpvCmltTHR3ZGFOU3dweGRCTFpkcXlRY05xRVV0dUI2VXVVM0Z3Y2FBckJpNTZ1OTFJbHVEWS9Dd1UyeDJCSHR1WkwKR2RuQUM0c1VhWm9oZzRFZ0U3UEp6RnFXTUtyaGRmekRzc05EK1VhV2sxRmhvRzViVWZiQ051Zy9KUnNlRzJBZQpodjAvU1ZNcSs5WWYyR0dheC9NQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGdVYxK3Z4UGVrUm82T2U2YTI4NmFHQjduWG0KMUlGVllwSWUxeTVoZy9aTlhKN1RndXFPb2Zjc3JnZ1h2MmdaQkdFN0pheTM0SkhuRFB3Y3ZCMzhHQUxtZmZWeAo2THJVN2ZtSWlpajRIc1NyaHRrMWQzcmhjdFkwMEw2dGJMMzVvTWJnUGwzSERUbGh0M0wxM0gvUVFScXR3TXFOCnBHeWk3VWprbFNpNWVsRWJrbnlUUy9OWTA1Y1JyMTU2N0p4N3F3QlpmUlZaZURUOHdidHpMZ05UWlFZRzVoM2EKQmp6dnlINFoyR2YrNnM4aXZlbGFUMjdPbGpOUTJvUUdyenhHV0ErZGJKSzNIdDVRRkVCeDdVaEsrNWtwYXViNwpWZTB1ekdGK1ZDb2ZFV2FtNk9CUFAycE51SW85d0Jsa24vbU9FUW5SU1FNMW15dmlIWHBaMnVKd1ozbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
server: https://192.168.34.232:6444
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: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4ekNDQWR1Z0F3SUJBZ0lKQU5ZM0hyTXZseUZjTUEwR0NTcUdTSWIzRFFFQkN3VUFNQlV4RXpBUkJnTlYKQkFNVENtdDFZbVZ5Ym1WMFpYTXdIaGNOTWpFd01URTFNRGd6T0RNNFdoY05NekV3TVRFek1EZ3pPRE00V2pBMApNUmN3RlFZRFZRUUtEQTV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RVpNQmNHQTFVRUF3d1FhM1ZpWlhKdVpYUmxjeTFoClpHMXBiakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMS21TZDJIeVdYN2VTdnYKdS8yRnBZQWM5SWRBcFlQbmtESk5wR0Z1SEVlOUJWVXMyL1o3L3BQWGY3NTljVFdZUkV2V0dybDBNS1dTajhycAowQ2JTN3dvdkg2NnpTcWNKRDUzMW11OTgvaE0zenZzaTVqalIxOU5yTEFIL0QzbEZ6d2VnVHpNUWFvenNPc2VOCm0vNmI5cGRLNUcwYkNPRkJlZTRzeW1VdnVjT1NKblg5YkpZUnhNbVI5WHl3REowcnpTSHJrVE9ocVErUXYzdTAKMGZvVk9NSm9BdWkvR2JEV3ZpTEQrRmlDMnFJY0FYRGhNaGd2eVJwTFBPNFlZc0tCc2xjUVJwbkpjei9heFRBUQovM0c3T1pYWjJkNWVDQmRDY0pqL2orNlkyNVJsVXNDNDZzZWR1cTR0SGMrbEJ3UG5FSDYvTG53SUE0VHVaRXBpCkI3Q3RyU0VDQXdFQUFhTW5NQ1V3RGdZRFZSMFBBUUgvQkFRREFnV2dNQk1HQTFVZEpRUU1NQW9HQ0NzR0FRVUYKQndNQ01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ0llSU0wSllLVjNiNUhISEdzMmV0eEt0VnQwaGNBTzNmcgpCcU5Ba3lPNkpvWkU2dnh3Nm5lQXNhc3V5RXh1NDFiMmlwYTJFdFlsTUNWbHE0anhjQWptMnU4b0xWb3NoWWIxClU4MkRqMkJuV2Z6TnhKV3dqSnQ5UzFhUXZmOXFxaDhueGJTeUVhNmxMZmEvTEpFQURzMDZNR05tQUJxbk5ZUVEKcEh1UnNXQlhwT3lSaWhtMHdlK21UNGwxYklMZ0Zpa2ZSaUw1WkRnWVlTNG9BRVpGY1NBbldKRFhSVTI0S0JIRQppYXk4SlNIcks1Ym12TWVpR1ZkL054WlhmSFdCcUcvZUI1SDRuaFhtVzhWbEdjQnhvdDBvckVta2FsblFpYnEwCnBWNUlwcXFBU3JjcjZnVUxrRmtvdWo1aG9rNWdIdWpqakFkenVSa3hyYTJiNERFa05jTTQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBc3FaSjNZZkpaZnQ1SysrNy9ZV2xnQnowaDBDbGcrZVFNazJrWVc0Y1I3MEZWU3piCjluditrOWQvdm4xeE5aaEVTOVlhdVhRd3BaS1B5dW5RSnRMdkNpOGZyck5LcHdrUG5mV2E3M3orRXpmTyt5TG0KT05IWDAyc3NBZjhQZVVYUEI2QlBNeEJxak93Nng0MmIvcHYybDBya2JSc0k0VUY1N2l6S1pTKzV3NUltZGYxcwpsaEhFeVpIMWZMQU1uU3ZOSWV1Uk02R3BENUMvZTdUUitoVTR3bWdDNkw4WnNOYStJc1A0V0lMYW9od0JjT0V5CkdDL0pHa3M4N2hoaXdvR3lWeEJHbWNselA5ckZNQkQvY2JzNWxkblozbDRJRjBKd21QK1A3cGpibEdWU3dManEKeDUyNnJpMGR6NlVIQStjUWZyOHVmQWdEaE81a1NtSUhzSzJ0SVFJREFRQUJBb0lCQUdCam1EY09ySHQ1MDBjQgpja3kzYnpSUWF4OE9vajhwRVlRU29ENXhTcERxUzVaSlBlVWZ3WnZEQ2dtZFpSZWxzRE82c1hDZVlDRDFrdC9JCmg2WnE2TTUxM29KRCttTmxZQ2U1L0g1NjBodE1ZVURlODVoMG9CNVNGTXgrOGJwZEQvYnRaODRGYlhmYmZWdHQKN0Z6VGlaalhyNmV1am52NjkrNnAvQW5jVmo1T0ZRNTZOeHZjbGpxWitlNVM4TDhtZzFUWkpPS3ZRck4vRkRBSAplSHVNeldEcTlLVURXaU9LN0d3aDFGWHdoVTV2T3BwMTRtZjVCVmp4Y3Qvek9DcHdLd2NYaE5NUVRTTVhYUHFsCllBTjBOKzMzb1pkenRxUEtJWHVjaGp3aFhQOWJCZ2REc0M3MTgzNDlWZFRMblZBN2doQlRCcUJRVFVlWitrVnMKU2xwcENvRUNnWUVBNlRteEJyWXMybDExWmtNUDhyenRtcXhiRlNaU0t0bnh1Rk5LNTlRU3ZPQkVFMmlGUCtxMQpwdHY2elhQWkVaVFBoeUowWU83VFcxQk5mZjJUaVdpNzA1TDFlUTVIVlU3QjVMQkthSkV6RFdPYmt6NWxOWk5GCmxWdnM0UGg3SzJvdjBuNjJkMnZlclpZQzBCOWlpUGlFbHFLaFRialF4QzZJYzM3YWtVQytmb01DZ1lFQXhCaEgKUXJ0ZzlrMHVlejJ6ek5SQ1dXb0Jsa0xwdjhEWU1pUFB5aWZUS0dHZDN5c0hIc05RQVZVTDR1YngzdFkrUjdzeApUS2pRb2dSd2tobTJmQUMvN0VRenZNbXMrYWtEai9wUWVXUDU5VVlOK1ptUUFPbDBtQUx2NnovM0RGMnl6RHI5Ckx4eDBieTJXMERpMGs1N0lER3lIV3ZKUHROcmRBZkY1NlV5VVZJc0NnWUJyNnNNTVBQMnlLUzZxbS90a01hR3MKUVhaLzZkUjVlWkdNM2hXNkFmcU5wU1E2NnRGRml5QjB6ak5XSC9YZ1djQlJZbE1CaTJFSFRyZ2N4Vm9nYWZNSAphbWZsbFFMUzZYZDBqMUpPNG1rQ0dBWWo4dW80Q1NaWWYwbXpxNmFxcHg3cndyQkJ3QXN3dlVvZDdYZlZzMUQrCnRzLzJ1NzcyR0NZUmN6QkZwL1M5YXdLQmdGdXd6b0ZSaElFbWpibHFuSXdHSkJBVEZUTGhqdEx1cFNpc3ZoaFUKanRPdThWYk1rOE82cDhvM3Joc215YW5jbTdxR3VRS1RYUnFrNE00djM3Z1QwYW4wS2d6NGNEMDgza0dRVmRpcworcy9KTmZlajZrWEM0NVhBcWRaaVRtNGwwZGpWTEZXL0JHS0grcURhSXZWenBTN0tBSEJ5SlByMzY2ZGc5aFEwCmpwY0pBb0dBRE50eWMrSlVTSmVhQUd5ZlluUEFkRnBSakZQNUZ6ZGdod1JLNVR2WVI0c2Qwd1lyTXVVNnRPSVQKMHpGMUEwTlRSbmI0SStpUklzU3plZ0xzSHg1OXJKNnY2d3Q3NlIwUEFjWlB6cDVkemxTbXYybGRPNEE5MVRLegp2dEIxRGZHUm5pQ1dpOURjRkJpaVRVZlZUbXRtU3pCRGdsREVQUE51Q0txaGkvamRvQVU9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

View File

@@ -0,0 +1,19 @@
apiVersion: v1
kind: Config
clusters:
- cluster:
api-version: v1
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3akNDQWFxZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFTTVJBd0RnWURWUVFERXdkcmRXSmwKTFdOaE1CNFhEVEkwTURZd05UQTRNakl4T0ZvWERUTTBNRFl3TXpBNE1qSXhPRm93RWpFUU1BNEdBMVVFQXhNSAphM1ZpWlMxallUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsWFhmZGwrbkxnCkt2RnV6OFVkNTQ0T2Q2M1RpaHNOYzMvZlJZSXdEcWNLcXo3ditEQVZzYTZXem94WUxHK1BOaDFHbzZYeXBKSXoKV1hWNFN4NC9mVXo0S2hpMW5mY3RnSkVReVdnU3ZkbDVpcEQxaTJIRkEvR3Jnb3R2RkljN0IwRExVdzBrb3F0Ygo2QzlSYnhNSFFpWk1yZXlzelJYWXRGN3J1c1dHb2J5eGc5RFZsczdTWmdGMjhOSkZXOHNFa0FMaWRwMTBUVENECk05QkhENXdEQkRVMGsyMzFRaE1lY3IzL2YzZDVvOG8vVklLTWs0VDFIZ2lMM0NuZmZlc2FGeTNVSnlxSnBERkUKYmtici9uSmNxcXZ5emxnQ1hsSEtTUlN1ZFN1QkVhbHVRbTczSC83b05oVHE2Y1BkN0hwUHdnK3BTR0kvd0h6NwpHaHNReVVCRXNoa0NBd0VBQWFNak1DRXdEZ1lEVlIwUEFRSC9CQVFEQWdLa01BOEdBMVVkRXdFQi93UUZNQU1CCkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBREJUSlc0ckNQSFNraVQzZ1RsQWJ5a0VsMlF4cFBwRHRLdWwKUHU0cDVsQ0RUZWhJTWFabnlnREZMajlpN2tQQ3lGb1JQaFRxcyswaWVId0p3N2xYWG00dnNOTGZXajN3MDV1Rgo0dnM1N0JRZTI2VzBSZWNMdG5iUFNYVXBJdDBxcjV2VVcwVkYxNk1wdm40ZzZIL2Rvc0hxOUlHcTBMWFpWaU5sClhPUUgvUXZNOG5xTWM4RHFaSG9DUzNvQ3NGQWVTeHd2eFQvY3QwRDUwVWE3ZWtlRllVLzZkSzY0dkk5bzJhY0UKSWc1UkhnM0NlR2RNN2VLdXN1bUpjL1FOeHZTd3pwS0xjWjlzNnpLODVRdlB2dFlTWmRYVEhmdlVENUpHdlFoQwpjLzlMci9BV0hBWUxOOXpOSEdOdE9nK0h1TTBPVHZKeWZkYnF0dVJXTklOL2NlYmhnTTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: "https://192.168.35.178:6443"
name: "cmii-dev-cluster"
contexts:
- context:
cluster: "cmii-dev-cluster"
user: "kube-admin-cmii-dev-cluster"
name: "cmii-dev-cluster"
current-context: "cmii-dev-cluster"
users:
- name: "kube-admin-cmii-dev-cluster"
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2VENDQWRHZ0F3SUJBZ0lJQmtVSkFlMU9yMW93RFFZSktvWklodmNOQVFFTEJRQXdFakVRTUE0R0ExVUUKQXhNSGEzVmlaUzFqWVRBZUZ3MHlOREEyTURVd09ESXlNVGhhRncwek5EQTJNRE13T0RJeU1UbGFNQzR4RnpBVgpCZ05WQkFvVERuTjVjM1JsYlRwdFlYTjBaWEp6TVJNd0VRWURWUVFERXdwcmRXSmxMV0ZrYldsdU1JSUJJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNLTS9KclZCRjJhejV5Wlcwb0ZoN0dCNnhkYW8KWjh4cnk2MXBob0FmM3gxbmxJUkhtK08vaDdCbVdpNXBCciswV1FOUEJNV3pXT3FCa1VDcWVrZHJEd3VqM3VpZQoxVzJ0d2tUUDhmb1NZK1ZQY2xPWkJIR0NrNzZad0N0SFlTb05mci9PcHQyb2grNFptVUdlcFJjNndrYzNXTkxXClB6djh0NUFTZGJTbnYxUXZJaVg5Z1kySWpjRlU0YUdudW9PQ29Rdzd5OUdIOWJOMHMwM2hMN0kraXhoTm16TlIKajVoOEU4SGhPVzhSZXVwUzBDSlVVazZwSzZRUFcwd0hRME9pajVIV1JZRmd1aTFDaE9vcTN0emVlVTBvRytRegpPN1M1bFB0NExYdFpGN1NvSWFMb1A5bG9valpMWFhlY21QcnBTS3NOY2p2K3FnNk93d3BhZXNDaG5RSURBUUFCCm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd0l3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dFQkFEcHJJMGRtZTMrK0RRWmVTNjRuSHBySHBwNGxFU2t5UkNsNVdjd3gvR00yc2s5bQp5Z0Jmcjlkd2dJQmFpSU5XQld3YWFlWVdBaS91dXJTRTZ2cUxkeUNlVkRNeGlQWnhPS3hLd3ZtWFpHL2lsRkxjCk50TEg5R3pGY0RqdUM4QndpRDAxbnlaTHZsRVV3TW9DVEpQNi96VGRpV3JqU1VHVXVIN1FkTHhNN29ROU4za0YKNm5qUzlZV2JYU1hVckNXc2pna1lIMmphTXEyZzFuNU9mN3JQOXptZjJBZ1VVVUlmYzhIaS9RQWx6eWRIdlFqUQpHNlFGUjF4aGg0ZzFtcUw5aWQyek1sZXQvZXNqSWlwemZJMzF4L1lvd2lnNlZPeDhkQWNQMFZBZXpOS3Y3cmJaCkdYSFNwcEJrOS9GdFFyMytWTitsTWVtS2dqTG40Tk1EZjkzOTcxcz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBc0tNL0pyVkJGMmF6NXlaVzBvRmg3R0I2eGRhb1o4eHJ5NjFwaG9BZjN4MW5sSVJICm0rTy9oN0JtV2k1cEJyKzBXUU5QQk1XeldPcUJrVUNxZWtkckR3dWozdWllMVcydHdrVFA4Zm9TWStWUGNsT1oKQkhHQ2s3Nlp3Q3RIWVNvTmZyL09wdDJvaCs0Wm1VR2VwUmM2d2tjM1dOTFdQenY4dDVBU2RiU252MVF2SWlYOQpnWTJJamNGVTRhR251b09Db1F3N3k5R0g5Yk4wczAzaEw3SStpeGhObXpOUmo1aDhFOEhoT1c4UmV1cFMwQ0pVClVrNnBLNlFQVzB3SFEwT2lqNUhXUllGZ3VpMUNoT29xM3R6ZWVVMG9HK1F6TzdTNWxQdDRMWHRaRjdTb0lhTG8KUDlsb29qWkxYWGVjbVBycFNLc05janYrcWc2T3d3cGFlc0NoblFJREFRQUJBb0lCQUM1QzB1dEVWVVBYdGc0MwowRTFaYlZnRy9LQ0wwNWM3eG8rVlh5bkdySkkybFVZa1RzelpIUFJna3EzVHNkWCtwekVZMkwwYk9obHpjWE9sClNBQzJhNmVKR09Yc2JvemZLTDdVWHRHMCtOUUkzb0hHdXpDYXVlUVA2eHlWT1NDTmJ2TmZNTFFySVZSWVc0UHoKMTZUTkxLcHRGR1hDOGpHbGVFNXJBU3Fxb2JSTjNHeG01R08xL0ppOHlvcG5sbVdnV0VKUjUyWXI2SVFBNk1xMQpYQXNGYzZ6UlRhVHRsN000Z3ZRU3VONVNKT1BZdkpscGJYejZ1WDRGcTRSUFc5dEFLekN5cFVDam05WGdaZ2FHCktpaHEwWVY1ZWMybFYveVZlTjBTMUs1NS9ZL3ZsOHNTNC9XbmZlZk1na2FBbytEc3FJOS9lSzduOUNQZkNUc3EKQ2VTUkJJRUNnWUVBNEtvbzJNcTkxemlJSE9BRXpTNjNKaVlzY2VqTCs5bCtCM1FUV1RteE1jc2MrUnptUW5OMQp3dllzaTdnSkVsR3hnVHJ3ai9KT3NhM1hCUnJPL0NjOXZQYzhNNnR0UEliUjVNZ29lSzFNalBvMGdhTmlsV1F5CnlScUh5RzlOMWMrMEhOZnFyUFAydzVhMysvQmZ5VS9mVEI5a0RjMU1waDZWaHNzQ2VuakhoOWtDZ1lFQXlVWSsKS1NaVzc5RFJYS1k5N0U1OG9MRGt4ajhXUllpMVlwTFc2djJPLy9McXBmU08ycmR0USs5aHR0cklrUC9hZlc0MAowMzRmOTVsKzNPR0c0b0I5VytNdUhIOVdtR1ZKNHljUlJhSk9YWXNhVk42Smh1ZGE5Y0FGRFJkRkJLZVBVRjB3Ck9NaFlBSU9OYnRKcFdENXJ0djNZTlM3ckg4K2QweU1kc2RvVHNXVUNnWUFiTFhwemYxTW56ZmJwUjFCTllmRlYKOUJnOFQyVWR1bG04blJZYUhSaUtaWC9Ed3ZNMzVxL0FQZmQxajNYSmVZaDNrYUc0U0Irczd0S3NFMm9tcHJpWgpPMjlVOE0vdUdvRVpvLzBCWERWK2VHWVJxS29zV0Vxc2VVRWp4aE1zWWt2dmtVOGFUUWowOEM2aGs1cUN4OTdEClhxakQ0cW43RG9nWUhrYldlZlhwUVFLQmdDbTdHcUJGaHJqcVByNUs2WVBaTWhYUEYxL1RMTGIyQlVXTzFHaWMKY2MyM2U5YzB3WG12bGtRRG1lcmpxYm9Ha2pKM2F4UitqZm8wSlExKzVReUpQM1NSd2JtKzNTRnp2c0lPRTVLdwplRGNFNUV5OFp4OUZVS0tyVVdESmRsSGt1OTRadENuUndBMDdPVlBFNUhxYlZwSDJSNkdmUExpM3Z5MUxscGlOCmNvL1JBb0dCQUl4OHloK1lLOHpHUlR2aTFseUdTTG90eFlWdlZMbWc4bG9CRmFzUS9tR0RhTk1rNVZ6cS9mUmgKbHU1dGUzWjhtYmxvTExUdzd1OUhRcGM3UGNqVklFV21DazBhYVA4YUs5VkpGYVQzV0xzWG1nRGIrb0tuNG9DVgpTSzZsOWVlQS9uWDA1Uk5xMEx0ekR3d3JNa2paR1VYZ3FldXJvTTF2cjJ2a2RLTkxhWEtmCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

View File

@@ -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=

View File

@@ -0,0 +1,26 @@
{
"docker.io/bitnami/redis": "6.2.6-debian-10-r0",
"docker.io/bitnami/redis": "6.2.14-debian-11-r1",
"docker.io/bitnami/mysql": "8.0.35-debian-11-r1",
"docker.io/bitnami/mysql": "8.1.0-debian-11-r42",
"docker.io/simonrupf/chronyd": "0.4.3",
"docker.io/bitnami/bitnami-shell": "10-debian-10-r140",
"docker.io/bitnami/bitnami-shell": "11-debian-11-r136",
"docker.io/bitnami/rabbitmq": "3.9.12-debian-10-r3",
"docker.io/bitnami/rabbitmq": "3.11.26-debian-11-r2",
"docker.io/ossrs/srs": "v4.0.136",
"docker.io/emqx/emqx": "4.2.12",
"docker.io/nacos/nacos-server": "v2.1.2",
"docker.io/nacos/nacos-server": "v2.1.2-slim",
"docker.io/mongo": "5.0",
"docker.io/rabbitmq": "3.9-management",
"docker.io/bitnami/minio": "2022.5.4",
"docker.io/bitnami/minio": "2023.5.4",
"docker.io/simonrupf/chronyd": "0.4.3",
"docker.io/kubernetesui/dashboard": "v2.0.1",
"docker.io/kubernetesui/metrics-scraper": "v1.0.4",
"docker.io/ossrs/srs": "v4.0-r3",
"docker.io/nginx": "1.21.3",
"docker.io/redis": "6.0.20-alpine",
"docker.io/dyrnq/nfs-subdir-external-provisioner": "v4.0.2"
}

View File

@@ -0,0 +1,58 @@
{
"rancher/backup-restore-operator": "v1.0.3",
"rancher/calico-cni": "v3.17.2",
"rancher/calico-ctl": "v3.17.2",
"rancher/calico-kube-controllers": "v3.17.2",
"rancher/calico-node": "v3.17.2",
"rancher/calico-pod2daemon-flexvol": "v3.17.2",
"rancher/cis-operator": "v1.0.3",
"rancher/coredns-coredns": "1.8.0",
"rancher/coreos-etcd": "v3.4.14-rancher1",
"rancher/coreos-kube-state-metrics": "v1.9.7",
"rancher/coreos-prometheus-config-reloader": "v0.39.0",
"rancher/coreos-prometheus-operator": "v0.39.0",
"rancher/externalip-webhook": "v0.1.6",
"rancher/flannel-cni": "v0.3.0-rancher6",
"rancher/coreos-flannel": "v0.13.0-rancher1",
"rancher/fleet-agent": "v0.3.4",
"rancher/fleet": "v0.3.4",
"rancher/fluentd": "v0.1.24",
"rancher/grafana-grafana": "7.1.5",
"rancher/hyperkube": "v1.20.4-rancher1",
"rancher/jimmidyson-configmap-reload": "v0.3.0",
"rancher/k8s-dns-dnsmasq-nanny": "1.15.2",
"rancher/k8s-dns-kube-dns": "1.15.2",
"rancher/k8s-dns-node-cache": "1.15.13",
"rancher/k8s-dns-sidecar": "1.15.2",
"rancher/klipper-lb": "v0.1.2",
"rancher/kube-api-auth": "v0.1.4",
"rancher/kubectl": "v1.20.4",
"rancher/kubernetes-external-dns": "v0.7.3",
"rancher/cluster-proportional-autoscaler": "1.8.1",
"rancher/library-busybox": "1.32.1",
"rancher/library-nginx": "1.19.2-alpine",
"rancher/library-traefik": "1.7.19",
"rancher/local-path-provisioner": "v0.0.14",
"rancher/log-aggregator": "v0.1.7",
"rancher/istio-kubectl": "1.5.10",
"rancher/metrics-server": "v0.4.1",
"rancher/configmap-reload": "v0.3.0-rancher4",
"rancher/nginx-ingress-controller-defaultbackend": "1.5-rancher1",
"rancher/nginx-ingress-controller": "nginx-0.43.0-rancher1",
"rancher/opa-gatekeeper": "v3.1.0-beta.7",
"rancher/openzipkin-zipkin": "2.14.2",
"rancher/pause": "3.2",
"rancher/plugins-docker": "18.09",
"rancher/prom-alertmanager": "v0.21.0",
"rancher/prom-node-exporter": "v1.0.1",
"rancher/prom-prometheus": "v2.18.2",
"rancher/prometheus-auth": "v0.2.1",
"rancher/rancher-agent": "v2.5.7",
"rancher/rancher-webhook": "v0.1.0-beta9",
"rancher/rancher": "v2.5.7",
"rancher/rke-tools": "v0.1.72",
"rancher/security-scan": "v0.1.14",
"rancher/shell": "v0.1.6",
"rancher/sonobuoy-sonobuoy": "v0.16.3",
"rancher/system-upgrade-controller": "v0.6.2"
}

102
agent-operator/go.mod Normal file
View File

@@ -0,0 +1,102 @@
module wdd.io/agent-operator
go 1.22.1
require (
github.com/docker/docker v20.10.17+incompatible
github.com/docker/go-units v0.4.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
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6
github.com/morikuni/aec v1.0.0
k8s.io/api v0.29.1
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
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/docker/distribution v2.8.1+incompatible // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-logr/logr v1.3.0 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.21.4 // indirect
github.com/go-openapi/errors v0.20.3 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/loads v0.21.2 // indirect
github.com/go-openapi/runtime v0.25.0 // indirect
github.com/go-openapi/spec v0.20.8 // indirect
github.com/go-openapi/strfmt v0.21.3 // indirect
github.com/go-openapi/swag v0.22.3 // indirect
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
github.com/google/gnostic-models v0.6.8 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/imdario/mergo v0.3.12 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/moby/spdystream v0.2.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
go.mongodb.org/mongo-driver v1.12.1 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/mod v0.14.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/oauth2 v0.10.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/term v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.16.1 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.1 // indirect
k8s.io/klog/v2 v2.110.1 // indirect
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
)

409
agent-operator/go.sum Normal file
View File

@@ -0,0 +1,409 @@
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE=
github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY=
github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc=
github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo=
github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
github.com/go-openapi/errors v0.20.3 h1:rz6kiC84sqNQoqrtulzaL/VERgkoCyB6WdEkc2ujzUc=
github.com/go-openapi/errors v0.20.3/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g=
github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro=
github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw=
github.com/go-openapi/runtime v0.25.0 h1:7yQTCdRbWhX8vnIjdzU8S00tBYf7Sg71EBeorlPHvhc=
github.com/go-openapi/runtime v0.25.0/go.mod h1:Ux6fikcHXyyob6LNWxtE96hWwjBPYF0DXgVFuMTneOs=
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxRU=
github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg=
github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k=
github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o=
github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU=
github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
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.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=
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/goharbor/harbor/src v0.0.0-20230220075213-6015b3efa7d0 h1:gMgzuiprCAnpNGXUWtNFpWhOtufmZsmLjjb2OJlNaNw=
github.com/goharbor/harbor/src v0.0.0-20230220075213-6015b3efa7d0/go.mod h1:0C9RORUO0WryiK8qxJ89y5hrim5AdE+Az5hcE+eMF2A=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mittwald/goharbor-client/v5 v5.5.3 h1:AClQeSVjO7ThTjBWGso1j9szueTxdb8LthRBuOpibyQ=
github.com/mittwald/goharbor-client/v5 v5.5.3/go.mod h1:P83UsJz83Ku8eB/Kg+d4+sA1E8rKQ0ScWDkbnQDSElA=
github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg=
github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng=
go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE=
go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs=
go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys=
go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw=
k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ=
k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc=
k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU=
k8s.io/client-go v0.29.1 h1:19B/+2NGEwnFLzt0uB5kNJnfTsbV8w6TgQRz9l7ti7A=
k8s.io/client-go v0.29.1/go.mod h1:TDG/psL9hdet0TI9mGyHJSgRkW3H9JZk2dNEUS7bRks=
k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

View File

@@ -0,0 +1,165 @@
package image
import (
"context"
"fmt"
"github.com/mittwald/goharbor-client/v5/apiv2"
"github.com/mittwald/goharbor-client/v5/apiv2/model"
"strings"
)
type HarborOperator struct {
HarborHost string
HarborPort string
HarborUser string
HarborPass string
HarborClient *apiv2.RESTClient
}
var LocalHarborOperator = newDefaultInstance
func newDefaultInstance() {
}
const (
DefaultHarborPort = "8033"
DefaultHarborUser = "admin"
DefaultHarborPass = "V2ryStr@ngPss"
)
func (op *HarborOperator) BuildOperator() (bool, error) {
if op.HarborPort != "" {
op.HarborHost = op.HarborHost + ":" + op.HarborPort
}
if !strings.HasSuffix(op.HarborHost, "/api/") {
op.HarborHost = op.HarborHost + "/api/"
}
log.InfoF("[Harbor Client Create] - start to create harbor client %s", op.HarborHost)
if op.HarborUser == "" {
op.HarborUser = DefaultHarborUser
}
if op.HarborPass == "" {
op.HarborPass = DefaultHarborPass
}
// check connection
client, err := apiv2.NewRESTClientForHost(op.HarborHost, op.HarborUser, op.HarborPass, nil)
if err != nil {
errorLog := fmt.Sprintf("Error creating REST client: %s\n", err.Error())
log.Error(errorLog)
return false, err
}
op.HarborClient = client
return true, nil
}
func (op *HarborOperator) RepoListAll(projectName string) []*model.Repository {
listRepositories, err := op.HarborClient.ListRepositories(context.TODO(), projectName)
if err != nil {
log.ErrorF("RepoListAll error is %s", err.Error())
return nil
}
return listRepositories
}
// RepoAllCmiiImage 返回没有前缀的内容 cmii-uav-user
func (op *HarborOperator) RepoAllCmiiImage() (repoNameList []string) {
listAll := op.RepoListAll("cmii")
for _, repository := range listAll {
prefix := strings.TrimPrefix(repository.Name, "cmii/")
if strings.HasPrefix(prefix, "cmii") {
repoNameList = append(repoNameList, prefix)
}
}
// 返回没有
return repoNameList
}
func (op *HarborOperator) ArtifactListAll(projectName, repoName string) []*model.Artifact {
listArtifacts, err := op.HarborClient.ListArtifacts(context.TODO(), projectName, repoName)
if err != nil {
log.ErrorF("ArtifactListAll error is %s", err.Error())
return nil
}
return listArtifacts
}
func (op *HarborOperator) ArtifactListOne(projectName, repoName, artifactReference string) *model.Artifact {
artifact, err := op.HarborClient.GetArtifact(context.TODO(), projectName, repoName, artifactReference)
if err != nil {
log.ErrorF("ArtifactListOne error is %s", err.Error())
return nil
}
return artifact
}
func (op *HarborOperator) ArtifactDeleteOne(projectName, repoName, artifactReference string) bool {
err := op.HarborClient.DeleteArtifact(context.TODO(), projectName, repoName, artifactReference)
if err != nil {
log.ErrorF("ArtifactDeleteOne error is %s", err.Error())
return false
}
log.InfoF("ArtifactDeleteOne of %s %s %s is success", projectName, repoName, artifactReference)
return true
}
func (op *HarborOperator) RepoListOne(projectName, repoName string) *model.Repository {
repository, err := op.HarborClient.GetRepository(context.TODO(), projectName, repoName)
if err != nil {
log.ErrorF("RepoListOne error is %s", err.Error())
return nil
}
return repository
}
// CmiiTagFilter 根据tag前缀 找到所有的cmii tag
func (op *HarborOperator) CmiiTagFilter(tagPrefix string) (allCmiiImageList []string) {
repoNameList := op.RepoAllCmiiImage() // all cmii repo name
for _, cmiiRepo := range repoNameList {
// cmii-uav-user
artifactList := op.ArtifactListAll("cmii", cmiiRepo)
for _, artifact := range artifactList {
// list all artifact of cmii-uav-user
for _, tag := range artifact.Tags {
if strings.HasPrefix(tag.Name, tagPrefix) {
// tag has prefix 5.4.0-123 5.4.0-123-123
allCmiiImageList = append(allCmiiImageList, cmiiRepo+":"+tag.Name)
}
}
}
}
return allCmiiImageList
}
func (op *HarborOperator) ArtifactDeleteFromNameTagList(projectName string, nameTagList []string) (errorDeleteList []string) {
for _, nameTag := range nameTagList {
split := strings.Split(nameTag, ":")
if len(split) != 2 {
log.ErrorF("ArtifactDeleteFromNameTagList error is %s", nameTag)
errorDeleteList = append(errorDeleteList, nameTag)
continue
}
repoName := split[0]
tagName := split[1]
if !op.ArtifactDeleteOne(projectName, repoName, tagName) {
log.ErrorF("ArtifactDeleteFromNameTagList error is %s %s %s", projectName, repoName, tagName)
errorDeleteList = append(errorDeleteList, nameTag)
}
}
return errorDeleteList
}

View File

@@ -0,0 +1,149 @@
package image
import (
"fmt"
"strings"
"testing"
"wdd.io/agent-common/utils"
)
var DefaultHarborOperator *HarborOperator
func TestHarborOperator_BuildOperator_CMII(t *testing.T) {
harborOperator := &HarborOperator{
HarborHost: "http://harbor.cdcyy.com.cn",
HarborPort: "",
HarborUser: "rad02_drone",
HarborPass: "Drone@1234",
HarborClient: nil,
}
_, err := harborOperator.BuildOperator()
if err != nil {
t.Logf("error is %s", err.Error())
return
}
DefaultHarborOperator = harborOperator
}
func TestHarborOperator_BuildOperator(t *testing.T) {
harborOperator := &HarborOperator{
HarborHost: "http://harbor.wdd.io",
HarborPort: "8033",
HarborUser: "admin",
HarborPass: "V2ryStr@ngPss",
HarborClient: nil,
}
_, err := harborOperator.BuildOperator()
if err != nil {
t.Logf("error is %s", err.Error())
return
}
DefaultHarborOperator = harborOperator
}
func TestHarborOperator_RepoListAll(t *testing.T) {
TestHarborOperator_BuildOperator(t)
//repoListAll := DefaultHarborOperator.RepoListAll("ran")
repoListAll := DefaultHarborOperator.RepoListAll("cmii")
utils.BeautifulPrint(repoListAll)
}
func TestHarborOperator_RepoAllCmiiImage(t *testing.T) {
TestHarborOperator_BuildOperator(t)
repoListAll := DefaultHarborOperator.RepoAllCmiiImage()
utils.BeautifulPrint(repoListAll)
}
func TestHarborOperator_ArtifactListAll(t *testing.T) {
TestHarborOperator_BuildOperator(t)
artifactListAll := DefaultHarborOperator.ArtifactListAll("cmii", "cmii-uav-user")
for _, artifact := range artifactListAll {
//if len(artifact.Tags) == 0 {
// fmt.Println(artifact.Digest)
//}
for _, tag := range artifact.Tags {
fmt.Println(tag.Name)
}
}
//utils.BeautifulPrint(artifactListAll)
}
func TestHarborOperator_CmiiHarborCleanUp(t *testing.T) {
TestHarborOperator_BuildOperator_CMII(t)
//repoListAll := DefaultHarborOperator.RepoListAll("ran")
repoListAll := DefaultHarborOperator.RepoListAll("cmii")
for _, repo := range repoListAll {
repoName := strings.TrimPrefix(repo.Name, "cmii/")
artifactListAll := DefaultHarborOperator.ArtifactListAll("cmii", repoName)
for _, artifact := range artifactListAll {
//if len(artifact.Tags) == 0 {
// fmt.Println(artifact.Digest)
//}
for _, tag := range artifact.Tags {
if strings.Contains(tag.Name, "snapshot") || strings.Contains(tag.Name, "validation") || strings.Contains(tag.Name, "beta") || strings.Contains(tag.Name, "staging") || strings.Contains(tag.Name, "test") {
fmt.Println(tag.Name)
fmt.Println(artifact.Digest)
fmt.Println()
DefaultHarborOperator.ArtifactDeleteOne("cmii", repoName, artifact.Digest)
}
}
}
}
//utils.BeautifulPrint(artifactListAll)
}
func TestHarborOperator_ArtifactListOne(t *testing.T) {
TestHarborOperator_BuildOperator(t)
//reference := "sha256:0048162a053eef4d4ce3fe7518615bef084403614f8bca43b40ae2e762e11e06" // not ok icon
reference := "sha256:27bd0055156abc20c29863750f13bbcc14019126da36d3941cfd82eb104ec31a" // ok digest
// reference := "5.2.0" // ok tag
artifactListOne := DefaultHarborOperator.ArtifactListOne("cmii", "cmii-uav-user", reference)
utils.BeautifulPrint(artifactListOne)
}
func TestHarborOperator_ArtifactDeleteOne(t *testing.T) {
TestHarborOperator_BuildOperator(t)
reference := "sha256:27bd0055156abc20c29863750f13bbcc14019126da36d3941cfd82eb104ec31a"
ccc := DefaultHarborOperator.ArtifactDeleteOne("cmii", "cmii-uav-user", reference)
if !ccc {
log.Error("delete failed")
}
}
func TestHarborOperator_CmiiTagFilter(t *testing.T) {
TestHarborOperator_BuildOperator_CMII(t)
imageMap := DefaultHarborOperator.CmiiTagFilter("5.7")
utils.BeautifulPrint(imageMap)
}
func TestHarborOperator_ArtifactDeleteFromNameTagList(t *testing.T) {
TestHarborOperator_BuildOperator(t)
allCmiiImageList := DefaultHarborOperator.CmiiTagFilter("5.5")
errorDeleteList := DefaultHarborOperator.ArtifactDeleteFromNameTagList("cmii", allCmiiImageList)
utils.BeautifulPrint(errorDeleteList)
}

View File

@@ -0,0 +1,659 @@
package image
import (
"bufio"
"context"
"encoding/json"
"errors"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/client"
"github.com/klauspost/pgzip"
"io"
"io/fs"
"os"
"path/filepath"
"regexp"
"strconv"
"strings"
"time"
image2 "wdd.io/agent-common/image"
"wdd.io/agent-common/logger"
"wdd.io/agent-common/utils"
"wdd.io/agent-deploy/d_app"
)
var apiClient = newClient()
var log = logger.Log
const OfflineImageGzipFolderPrefix = "/root/octopus_image/"
func newClient() *client.Client {
apiClient, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
log.ErrorF("[newClient] - new client failed ! => %s", err.Error())
panic(err)
}
defer apiClient.Close()
return apiClient
}
func GetRunningContainer() []types.Container {
return getContainerList(false)
}
func GetAllContainer() []types.Container {
return getContainerList(true)
}
func getContainerList(all bool) []types.Container {
containers, err := apiClient.ContainerList(context.Background(), types.ContainerListOptions{
Quiet: false,
Size: false,
All: all,
Latest: false,
Limit: 0,
Filters: filters.Args{},
})
if err != nil {
log.ErrorF("[getContainerList] - error => %s", err.Error())
}
return containers
}
//func SetDockerProxy(httpProxy string) {
// proxy_all := "HTTP_PROXY=" + httpProxy + " HTTPS_PROXY=" + httpProxy
//
// log.InfoF("[SetDockerProxy] - set docker proxy to %s", proxy_all)
//
// // Set the HTTP proxy for the Docker daemon
// configFile, err := apiClient.ConfigCreate(context.Background(), swarm.ConfigSpec{
// Annotations: swarm.Annotations{
// Name: "proxy.conf",
// },
// Data: []byte(proxy_all),
// })
// if err != nil {
// // 处理错误
// log.ErrorF("[SetDockerProxy] - set docker proxy error %s", err.Error())
// }
//
//
//
//
//}
func GetAll() []types.ImageSummary {
list, err := apiClient.ImageList(context.TODO(), types.ImageListOptions{
All: true,
Filters: filters.Args{},
})
if err != nil {
log.ErrorF("[ImageGetAll] --error => %s", err.Error())
}
return list
}
func GetByName(imageName string) *types.ImageSummary {
imageGetAll := GetAll()
for _, imageSummary := range imageGetAll {
for _, tag := range imageSummary.RepoTags {
if strings.Contains(tag, imageName) {
return &imageSummary
}
}
}
return nil
}
func Delete(imageName string) []types.ImageDeleteResponseItem {
imageGetByName := GetByName(imageName)
if imageGetByName == nil {
log.ErrorF("[ImageDelete] -- image not exists ! %s", imageGetByName.RepoTags)
return nil
}
remove, err := apiClient.ImageRemove(context.TODO(), imageGetByName.ID, types.ImageRemoveOptions{
Force: true,
PruneChildren: false,
})
if err != nil {
log.ErrorF("[ImageDelete] -- ImageRemove error ! %s", err.Error())
return nil
}
return remove
}
func PruneAllCmiiImages() (errorRemoveImageNameList []string) {
_, _ = apiClient.ImagesPrune(context.TODO(), filters.Args{})
imageGetAll := GetAll()
// ip:8033
//re := regexp.MustCompile(`\b(?:\d{1,3}\.){3}\d{1,3}:\d{1,4}`)
for _, imageSummary := range imageGetAll {
for _, repoTag := range imageSummary.RepoTags {
if strings.HasPrefix(repoTag, image2.CmiiHarborPrefix) || strings.HasPrefix(repoTag, "harbor.wdd.io") || strings.Contains(repoTag, ":8033") {
for _, tag := range imageSummary.RepoTags {
_, err := apiClient.ImageRemove(context.TODO(), imageSummary.ID, types.ImageRemoveOptions{
Force: true,
PruneChildren: true,
})
if err != nil {
log.ErrorF("[ImageDelete] -- ImageRemove error ! %s", err.Error())
errorRemoveImageNameList = append(errorRemoveImageNameList, tag)
}
log.InfoF("[ImageDelete] - image remove of [%s] success!", tag)
}
}
}
}
_, _ = apiClient.ImagesPrune(context.TODO(), filters.Args{})
return errorRemoveImageNameList
}
func TagFromSourceToTarget(sourceImageName, targetImageName string) bool {
getByName := GetByName(sourceImageName)
if getByName == nil {
log.ErrorF("[ImageTagFromSourceToTarget] - %s not exits !", sourceImageName)
return false
}
sourceImageName = getByName.RepoTags[0]
err := apiClient.ImageTag(context.TODO(), sourceImageName, targetImageName)
if err != nil {
log.ErrorF("[ImageTagFromSourceToTarget] - from %s to %s error %s", sourceImageName, targetImageName, err.Error())
}
log.InfoF("[ImageTagFromSourceToTarget] - from %s to %s success!", sourceImageName, targetImageName)
return true
}
func UploadToOctopusKindHarbor(targetImageName string) (pushResult io.ReadCloser) {
if GetByName(targetImageName) == nil {
log.ErrorF("[ImagePushToOctopusKindHarbor] - %s not exits !", targetImageName)
return pushResult
}
pushResult, err := apiClient.ImagePush(context.TODO(), targetImageName, types.ImagePushOptions{
All: false,
//RegistryAuth: "eyAidXNlcm5hbWUiOiAiYWRtaW4iLCAicGFzc3dvcmQiOiAiVjJyeVN0ckBuZ1BzcyIsICJlbWFpbCI6ICJpY2VAcXEuY29tIiB9Cg==",
// 重庆移动二级平台
RegistryAuth: "eyAidXNlcm5hbWUiOiAiemd5ZHR4anRjcXl4Z3MxODg4MzI1NzMxMSIsICJwYXNzd29yZCI6ICJEaWN0QDIwMjQiLCAiZW1haWwiOiAiaWNlQHFxLmNvbSIgfQ==",
PrivilegeFunc: nil,
Platform: "amd64",
})
if err != nil {
log.ErrorF("[ImagePushToOctopusKindHarbor] - push %s error %s", targetImageName, err.Error())
return nil
}
return pushResult
}
func UploadToHarbor(targetImageName string) (uploadOK bool) {
pushResult := UploadToOctopusKindHarbor(targetImageName)
defer pushResult.Close()
scanner := bufio.NewScanner(pushResult)
for scanner.Scan() {
}
fmt.Println()
log.InfoF("[UploadToHarbor] - upload %s success!", targetImageName)
fmt.Println()
return true
}
// TagFromListAndPushToCHarbor 需要支持 harbor.cdcyy.cn ip:8033 rancher/rancher:v2.5.7 nginx:latest
func TagFromListAndPushToCHarbor(referenceImageList []string, targetHarborHost string) (errorPushImageNameList []string) {
targetHarborHost = strings.TrimPrefix(targetHarborHost, "http://")
targetHarborHost = strings.TrimPrefix(targetHarborHost, "https://")
for _, imageName := range referenceImageList {
// check image
// harbor.cdcyy.cn
cmiiImageFullName := imageName
// convert image name
targetImageName := image2.ImageNameToTargetImageFullName(imageName, targetHarborHost)
if TagFromSourceToTarget(cmiiImageFullName, targetImageName) {
pushResult := UploadToOctopusKindHarbor(targetImageName)
if pushResult == nil {
errorPushImageNameList = append(errorPushImageNameList, cmiiImageFullName)
log.InfoF("[ImageTagFromListAndPushToCHarbor] - push of %s error error !", targetImageName)
break
}
scanner := bufio.NewScanner(pushResult)
for scanner.Scan() {
text := scanner.Text()
if strings.Contains(text, "digest: sha256:") {
fmt.Println(scanner.Text())
}
}
log.InfoF("[ImageTagFromListAndPushToCHarbor] - push of %s success!", targetImageName)
fmt.Println()
} else {
errorPushImageNameList = append(errorPushImageNameList, cmiiImageFullName)
}
}
return errorPushImageNameList
}
func PullFromCmiiHarbor(imageName string) (pullResult io.ReadCloser) {
pullResult, err := apiClient.ImagePull(context.TODO(), imageName, types.ImagePullOptions{
All: false,
RegistryAuth: "eyAidXNlcm5hbWUiOiAicmFkMDJfZHJvbmUiLCAicGFzc3dvcmQiOiAiRHJvbmVAMTIzNCIsICJlbWFpbCI6ICJpY2VAcXEuY29tIiB9Cg==",
PrivilegeFunc: func() (string, error) {
return "authorization: Basic cmFkMDJfZHJvbmU6RHJvbmVAMTIzNA==", nil
},
Platform: "amd64",
})
if err != nil {
log.ErrorF("[ImagePullFromCmiiHarbor]- image pull of %s ,error => %s", imageName, err.Error())
return nil
}
return pullResult
}
func PullFromCmiiHarborByMap(imageVersionMap map[string]string, silentMode bool) (fullImageNameList, errorPullImageList []string) {
fullImageNameList = CmiiImageMapToFullNameList(imageVersionMap)
return fullImageNameList, PullFromFullNameList(fullImageNameList)
}
func PullCmiiFromFileJson(filePathName string) {
readFile, err := os.ReadFile(filePathName)
if err != nil {
log.ErrorF("[ImagePullCMiiFromFileJson] - file %s read error ! %s", filePathName, err.Error())
return
}
var resultMap map[string]string
err = json.Unmarshal(readFile, &readFile)
if err != nil {
log.ErrorF("[ImagePullCMiiFromFileJson] - file %s un marshal error ! %s", filePathName, err.Error())
return
}
for image, tag := range resultMap {
pullResult := PullFromCmiiHarbor(image + ":" + tag)
if pullResult == nil {
continue
}
scanner := bufio.NewScanner(pullResult)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "\"status\":\"Pulling from") {
fmt.Println(line)
}
if strings.Contains(line, "Status: Image is up to date for") {
fmt.Println(line)
}
}
fmt.Println()
}
}
// PullFromFullNameList 根据镜像名列表拉取全部的镜像
func PullFromFullNameList(fullImageNameList []string) (errorPullImageList []string) {
start := time.Now()
for _, fullImageName := range fullImageNameList {
if !strings.HasPrefix(fullImageName, "harbor.cdcyy.com.cn") {
since := time.Since(start)
if since < 60*time.Second {
duration := 60*time.Second - since
log.DebugF("PullFromFullNameList - wait for %s !", duration.String())
time.Sleep(duration)
start = time.Now()
}
}
log.DebugF("start to pull => [%s]", fullImageName)
pullResult := PullFromCmiiHarbor(fullImageName)
if pullResult == nil {
errorPullImageList = append(errorPullImageList, fullImageName)
continue
}
scanner := bufio.NewScanner(pullResult)
for scanner.Scan() {
line := scanner.Text()
//if strings.Contains(line, "\"status\":\"Pulling from") {
// fmt.Println(line)
//}
if strings.Contains(line, "Status: Image is up to date for") {
fmt.Println(line)
}
}
fmt.Println()
}
return errorPullImageList
}
func PullFromListAndCompressSplit(fullImageNameList []string, gzipFolder string) (errorPullImageList, errorGzipImageList []string) {
errorPullImageList = PullFromFullNameList(fullImageNameList)
// generate a project folder
err := os.MkdirAll(gzipFolder, os.ModeDir)
if err != nil {
if !errors.Is(err, os.ErrExist) {
log.ErrorF("[ImagePullFromListAndCompressSplit] - create folder of %s error %s", gzipFolder, err.Error())
}
}
var tarGzipFileNameList []string
for _, image := range fullImageNameList {
ok, path := SaveToGzipFile(image, gzipFolder)
if !ok {
errorGzipImageList = append(errorGzipImageList, image)
continue
}
tarGzipFileNameList = append(tarGzipFileNameList, path)
}
utils.BeautifulPrintListWithTitle(tarGzipFileNameList, "image gzip name list")
return errorPullImageList, errorGzipImageList
}
// LoadFromGzipFilePath 根据Gzip文件的全名称进行Load操作
func LoadFromGzipFilePath(gzipFileNameFullPath string) bool {
openFile, err := os.OpenFile(gzipFileNameFullPath, 0, fs.ModePerm)
if err != nil {
log.ErrorF("[ImageLoadFromFile] - failed to open file %s, error is %s", gzipFileNameFullPath, err.Error())
return false
}
loadResponse, err := apiClient.ImageLoad(context.TODO(), openFile, true)
if err != nil {
log.ErrorF("[ImageLoadFromFile] - load error %s, error is %s", gzipFileNameFullPath, err.Error())
return false
}
log.InfoF("[ImageLoadFromFile] - load of %s, result is %s", gzipFileNameFullPath, strconv.FormatBool(loadResponse.JSON))
scanner := bufio.NewScanner(loadResponse.Body)
for scanner.Scan() {
line := scanner.Text()
fmt.Println(line)
}
return true
}
func LoadFromFolderPath(folderPath string) (errorLoadImageNameList []string) {
if !strings.HasSuffix(folderPath, "/") {
folderPath += "/"
}
dirEntries, err := os.ReadDir(folderPath)
if err != nil {
log.ErrorF("[ImageLoadFromFolderPath] - error read folder %s error is %s", folderPath, err.Error())
return
}
// load gzip file
for _, dirEntry := range dirEntries {
if strings.HasSuffix(dirEntry.Name(), ".tar.gz") {
if !LoadFromGzipFilePath(folderPath + dirEntry.Name()) {
errorLoadImageNameList = append(errorLoadImageNameList, folderPath+dirEntry.Name())
}
}
}
return errorLoadImageNameList
}
// SaveToGzipFile 根据目标镜像的全名称 将镜像压缩为Gzip文件
func SaveToGzipFile(imageFullName, folderPathPrefix string) (gzipOK bool, gzipImageFileFullPath string) {
imageGetByName := GetByName(imageFullName)
if imageGetByName == nil {
log.ErrorF("[ImageSaveToTarGZ] - %s not exits", imageFullName)
return false, ""
}
imageSaveTarStream, err := apiClient.ImageSave(context.TODO(), imageGetByName.RepoTags)
if err != nil {
log.ErrorF("[ImageSaveToTarGZ] - image save error %s", err.Error())
return false, ""
}
var realImageTag string
for _, repoTag := range imageGetByName.RepoTags {
if !strings.Contains(repoTag, "8033") {
realImageTag = repoTag
break
}
}
gzipImageFileFullPath = image2.ImageFullNameToGzipFileName(realImageTag)
if err := os.MkdirAll(filepath.Dir(gzipImageFileFullPath), os.ModePerm); err != nil {
log.ErrorF("[ImageSaveToTarGZ] - failed to create directory: %s", err)
return false, ""
}
// 生成gzip压缩文件的全路径名称
gzipImageFileFullPath = filepath.Join(folderPathPrefix, gzipImageFileFullPath)
log.InfoF("[ImageSaveToTarGZ] - start to save [%s] to [%s]", realImageTag, gzipImageFileFullPath)
// 删除掉旧的Gzip文件
if err := os.Remove(gzipImageFileFullPath); err != nil && !os.IsNotExist(err) {
log.ErrorF("[ImageSaveToTarGZ] - failed to remove old gzip file: %s", err)
return false, ""
}
// 创建
tarFile, err := os.Create(gzipImageFileFullPath)
if err != nil {
log.ErrorF("[ImageSaveToTarGZ] - error create gzip %s file ! => %s ", gzipImageFileFullPath, err.Error())
return false, ""
}
defer tarFile.Close()
// 创建pgzip writer
gw, err := pgzip.NewWriterLevel(tarFile, pgzip.DefaultCompression) // 你可以调整压缩级别
if err != nil {
log.ErrorF("[ImageSaveToTarGZ] - pgzip create writer error: %s", err.Error())
}
defer gw.Close()
// Copy the tar archive to the gzip writer.
if _, err := io.Copy(gw, imageSaveTarStream); err != nil {
log.ErrorF("[ImageSaveToTarGZ] - failed to copy tar archive to gzip writer: %s", err.Error())
return false, ""
}
// 成功
return true, gzipImageFileFullPath
}
// SaveImageListToGzipFile 将一个列表内的镜像全部压缩为一个tar.gz文件
func SaveImageListToGzipFile(imageFullNames []string, folderPathPrefix string, outputFileName string) (gzipOK bool, gzipFileFullPath string, errorGzipImageList []string) {
//if len(imageFullNames) == 0 {
// log.Error("[SaveImagesToGzipFile] - no images provided")
// return false, "", errorGzipImageList
//}
//
//// 确保输出文件路径
//gzipFileFullPath = folderPathPrefix + outputFileName
//if err := os.MkdirAll(filepath.Dir(gzipFileFullPath), os.ModePerm); err != nil {
// log.ErrorF("[SaveImagesToGzipFile] - failed to create directory: %s", err)
// return false, "", errorGzipImageList
//}
//
//log.InfoF("[SaveImagesToGzipFile] - start saving images to [%s]", gzipFileFullPath)
//
//// 删除旧的Gzip文件
//if err := os.removePrefix(gzipFileFullPath); err != nil && !os.IsNotExist(err) {
// log.ErrorF("[SaveImagesToGzipFile] - failed to remove old gzip file: %s", err)
// return false, "", errorGzipImageList
//}
//
//tarFile, err := os.Create(gzipFileFullPath)
//if err != nil {
// log.ErrorF("[SaveImagesToGzipFile] - error creating gzip file: %s", err)
// return false, "", errorGzipImageList
//}
//defer tarFile.Close()
//
//gw, err := pgzip.NewWriterLevel(tarFile, pgzip.DefaultCompression)
//if err != nil {
// log.ErrorF("[SaveImagesToGzipFile] - pgzip writer creation error: %s", err)
// return false, "", errorGzipImageList
//}
//defer gw.Close()
//
//for _, imageFullName := range imageFullNames {
// imageGetByName := GetByName(imageFullName)
// if imageGetByName == nil {
// log.WarnF("[SaveImagesToGzipFile] - %s not exists, skipping", imageFullName)
// continue
// }
//
// imageSaveTarStream, err := apiClient.ImageSave(context.TODO(), imageGetByName.RepoTags)
// if err != nil {
// log.ErrorF("[SaveImagesToGzipFile] - image save error for %s: %s", imageFullName, err)
// continue
// }
//
// if _, err := io.Copy(gw, imageSaveTarStream); err != nil {
// log.ErrorF("[SaveImagesToGzipFile] - failed to copy tar archive for %s to gzip writer: %s", imageFullName, err)
// continue
// }
//
//}
//
//if err := gw.Close(); err != nil {
// log.ErrorF("[SaveImagesToGzipFile] - error closing gzip writer: %s", err)
// return false, "", errorGzipImageList
//}
//
//log.InfoF("[SaveImagesToGzipFile] - successfully saved images to [%s]", gzipFileFullPath)
return true, gzipFileFullPath, errorGzipImageList
}
func CmiiImageMapToFullNameList(cmiiImageVersionMap map[string]string) (fullImageNameList []string) {
for image, tag := range cmiiImageVersionMap {
s := image2.CmiiHarborPrefix + image + ":" + tag
fullImageNameList = append(fullImageNameList, s)
}
return fullImageNameList
}
func CmiiImageMapFromGzipFolder(gzipFileFolder string) (cmiiImageVersionMap map[string]string) {
allFileInFolder, err := utils.ListAllFileInFolder(gzipFileFolder)
if err != nil {
return nil
}
cmiiImageVersionMap = make(map[string]string)
for _, gzipFileName := range allFileInFolder {
log.DebugF("gzip file name is %s", gzipFileName)
imageName, imageTag := image2.GzipFileNameToImageNameAndTag(gzipFileName)
cmiiImageVersionMap[imageName] = imageTag
}
return cmiiImageVersionMap
}
// GenerateCmiiTagVersionImageMap 生成特定版本的ImageTagMap
func GenerateCmiiTagVersionImageMap(specificTag string) (backendMap, frontendMap, srsMap map[string]string) {
matched, _ := regexp.MatchString(`^\d+\.\d+\.\d+$`, specificTag)
if !matched {
sprintf := fmt.Sprintf("tag is not match ! [%s]", specificTag)
log.Error(sprintf)
panic(sprintf)
}
backendMap = make(map[string]string, len(d_app.CmiiBackendAppMap))
frontendMap = make(map[string]string, len(d_app.CmiiFrontendAppMap))
srsMap = make(map[string]string, len(d_app.CmiiSrsAppMap))
for imageName := range d_app.CmiiBackendAppMap {
backendMap[imageName] = specificTag
}
for imageName := range d_app.CmiiFrontendAppMap {
frontendMap[imageName] = specificTag
}
for imageName, imageTag := range d_app.CmiiSrsAppMap {
srsMap[imageName] = imageTag
}
return backendMap, frontendMap, srsMap
}
func loginToDockerHub(HarborFullHost string) {
if HarborFullHost == "" {
HarborFullHost = "https://registry-1.docker.io"
}
login, err := apiClient.RegistryLogin(context.TODO(), types.AuthConfig{
Username: "icederce",
Password: "loveff.cxc.23",
Auth: "aWNlZGVyY2U6bG92ZWZmLmN4Yy4yMw==",
ServerAddress: HarborFullHost,
})
if err != nil {
log.ErrorF("[loginToDockerHub] - login to %s failed !", HarborFullHost)
}
log.DebugF("[loginToDockerHub] - login is %s", login.Status)
}
func WriteDependencyImageToFile() {
imageFilePrefix := "C:\\Users\\wddsh\\Documents\\IdeaProjects\\ProjectOctopus\\cmii_operator\\image\\"
middleFile := imageFilePrefix + "middle-image.txt"
_ = os.Remove(middleFile)
for _, image := range d_app.MiddlewareAmd64 {
utils.AppendContentToFile(image+"\n", middleFile)
}
rkeFile := imageFilePrefix + "rke-image.txt"
_ = os.Remove(rkeFile)
for _, image := range d_app.Rancher1204Amd64 {
utils.AppendContentToFile(image+"\n", rkeFile)
}
}

View File

@@ -0,0 +1,302 @@
package image
import (
"bufio"
"fmt"
"strings"
"testing"
"wdd.io/agent-common/assert"
"wdd.io/agent-common/image"
"wdd.io/agent-common/utils"
"wdd.io/agent-deploy/d_app"
)
func TestGetRunningContainer(t *testing.T) {
allContainer := GetRunningContainer()
for _, container := range allContainer {
utils.BeautifulPrint(container)
}
}
func TestGetAllContainer(t *testing.T) {
allContainer := GetAllContainer()
for _, container := range allContainer {
utils.BeautifulPrint(container)
}
}
func TestImageGetAll(t *testing.T) {
imageGetAll := GetAll()
for _, summary := range imageGetAll {
utils.BeautifulPrint(summary)
}
}
func TestImageGetByName(t *testing.T) {
image := "harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:4.1.6-beta"
imageGetByName := GetByName(image)
utils.BeautifulPrint(imageGetByName)
}
func TestImageDelete(t *testing.T) {
image := "harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:4.1.6-beta"
imageDelete := Delete(image)
for _, item := range imageDelete {
utils.BeautifulPrint(item)
}
}
func TestImagePullFromCmiiHarbor(t *testing.T) {
image := "harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:4.1.6-beta"
pullFromCmiiHarbor := PullFromCmiiHarbor(image)
defer pullFromCmiiHarbor.Close()
scanner := bufio.NewScanner(pullFromCmiiHarbor)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "\"status\":\"Pulling from") {
fmt.Println(line)
}
if strings.Contains(line, "Status: Image is up to date for") {
fmt.Println(line)
}
}
//var fs uintptr
//
//tools.DisplayJSONMessagesStream(pullFromCmiiHarbor, os.Stdout, fs, true, func(message tools.JSONMessage) {
//
//})
}
func TestImagePushToOctopusKindHarbor(t *testing.T) {
// re-tag
image := "harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:4.1.6-beta"
newTag := "10.250.0.100:8033/cmii/cmii-uav-gateway:4.1.6-beta"
target := TagFromSourceToTarget(image, newTag)
assert.Equal(t, target, true, "image re-tag error !")
// push
pushResult := UploadToOctopusKindHarbor(newTag)
defer pushResult.Close()
scanner := bufio.NewScanner(pushResult)
for scanner.Scan() {
}
fmt.Println("image push success!")
}
func TestImageLoadFromFile(t *testing.T) {
loadFromFile := LoadFromGzipFilePath("/root/cmlc=cmii=srs=v5.0.195.tar.gz")
assert.Equal(t, loadFromFile, true, "image load error !")
}
func TestImageSaveToTarGZ(t *testing.T) {
image := "harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:4.1.6-beta"
imageSaveToTarGZ, _ := SaveToGzipFile(image, "/home/wdd/IdeaProjects/ProjectOctopus/cmii_operator/log")
assert.Equal(t, imageSaveToTarGZ, true, "image save to tar gz file error !")
}
func TestImageFullNameToGzipFileName(t *testing.T) {
test := []string{
"bitnami/redis:6.2.6-debian-10-r0",
"simonrupf/chronyd:0.4.3",
"harbor.cdcyy.com.cn/cmii/cmii-rtsp-operator:v4.1.0",
"harbor.cdcyy.com.cn/cmii/ossrs/srs:v4.0.136",
"ossrs/srs:v4.0.136",
"mongo:5.0",
"bitnami/minio:2023.5.4",
"busybox:latest",
"busybox",
}
test = append(test, d_app.MiddlewareAmd64...)
for _, s := range test {
gzipFileName := image.ImageFullNameToGzipFileName(s)
fmt.Println(gzipFileName)
}
}
func TestImageTagFromSourceToTarget(t *testing.T) {
sourceImageName := "ossrs/srs:v5.0.195"
targetImageName := "harbor.wdd.io:8033/cmii/srs:v5.0.195"
if TagFromSourceToTarget(sourceImageName, targetImageName) {
pushResult := UploadToOctopusKindHarbor(targetImageName)
defer pushResult.Close()
scanner := bufio.NewScanner(pushResult)
for scanner.Scan() {
}
}
}
func TestSaveSpecificImageToGzipFile(t *testing.T) {
imageGzipFilePathPrefix := "/root/ai_image/"
imageFullNameList := []string{
"harbor.cdcyy.com.cn/cmii/cmlc-ai/cmlc-ai-operator:v5.2.0-t4-no-dino",
}
for _, imageFullName := range imageFullNameList {
result := PullFromCmiiHarbor(imageFullName)
if result == nil {
log.ErrorF("image pull error ! => %s", imageFullName)
return
}
scc := bufio.NewScanner(result)
for scc.Scan() {
line := scc.Text()
if strings.Contains(line, "\"status\":\"Pulling from") {
fmt.Println(line)
}
if strings.Contains(line, "Status: Image is up to date for") {
fmt.Println(line)
}
}
// image pull success
log.InfoF("image should have pulled successful ! => %s", imageFullName)
ok, _ := SaveToGzipFile(imageFullName, imageGzipFilePathPrefix)
if !ok {
log.ErrorF("image save to gzip file error ! => %s", imageFullName)
return
}
}
}
func TestConvertCmiiImageMapFromGzipFolder(t *testing.T) {
versionMap := CmiiImageMapFromGzipFolder(OfflineImageGzipFolderPrefix)
utils.BeautifulPrint(versionMap)
}
func TestImageNameToTargetImageFullName(t *testing.T) {
AllCmiiImageTagList := []string{
"harbor.cdcyy.com.cn/cmii/cmii-uav-cloud-live:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-data-post-process:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-depotautoreturn:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-logger:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-mqtthandler:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-notice:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-admin-gateway:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-cms:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-material-warehouse:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-process:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-autowaypoint:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-brain:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-mission:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-oauth:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-airspace:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-suav-supervision:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-user:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-admin-user:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-emergency:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-kpi-monitor:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-waypoint:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-device:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-alarm:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-clusters:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-surveillance:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-threedsimulation:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-open-gateway:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-industrial-portfolio:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-tower:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-developer:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-app-release:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-integration:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-admin-data:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-armypeople:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-base:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-logistics:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-seniclive:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-visualization:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-cms-portal:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-multiterminal:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-security:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-media:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-oms:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-securityh5:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-share:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervision:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-ai-brain:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-emergency-rescue:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-splice:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-jiangsuwenlv:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-open:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-qinghaitourism:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-qingdao:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-mws:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-threedsimulation:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervisionh5:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-detection:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-platform-hljtt:5.4.0",
"harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0",
"ossrs/srs:v5.0.195",
"harbor.cdcyy.com.cn/cmii/cmii-srs-oss-adaptor:2023-SA",
}
AllCmiiImageTagList = append(AllCmiiImageTagList, d_app.Rancher1204Amd64...)
AllCmiiImageTagList = append(AllCmiiImageTagList, d_app.MiddlewareAmd64...)
var result []string
for _, imageName := range AllCmiiImageTagList {
targetImageFullName := image.ImageNameToTargetImageFullName(imageName, "cq.com")
result = append(result, targetImageFullName)
}
utils.BeautifulPrint(result)
}
func TestSaveImageListToGzipFile(t *testing.T) {
allImageList := []string{
"harbor.cdcyy.com.cn/cmii/cmii-uav-oauth:5.7.0",
"harbor.cdcyy.com.cn/cmii/cmii-iam-gateway:5.6.0",
"harbor.cdcyy.com.cn/cmii/cmii-uav-kpi-monitor:5.5.0",
}
gzipOK, gzipFileFullPath, errorGzipImageList := SaveImageListToGzipFile(allImageList, "/home/wdd/IdeaProjects/ProjectOctopus/agent-operator/image", "test.tar.gz")
assert.Equal(t, gzipOK, true, "gzip image list to single file failed !")
log.Info("gzip file is " + gzipFileFullPath)
utils.BeautifulPrint(errorGzipImageList)
}
func TestImagePruneAllCmiiImages(t *testing.T) {
errorRemoveImageNameList := PruneAllCmiiImages()
utils.BeautifulPrintListWithTitle(errorRemoveImageNameList, "CMII Image Prune Error")
}

View File

@@ -0,0 +1,166 @@
#!/bin/bash
all_image_list_txt="all-cmii-image-list.txt" # 需要修改版本
gzip_image_list_txt="all-gzip-image-list.txt" # 一般不需要修改
oss_prefix_url="https://oss.demo.uavcmlc.com/cmlc-installation"
local_gzip_path="/root/octopus_image"
DockerRegisterDomain="10.40.51.5:8033" # 需要根据实际修改
HarborAdminPass=V2ryStr@ngPss # 需要跟第一脚本中的密码保持一致
print_green() {
echo -e "\033[32m${1}\033[0m"
echo ""
}
print_red() {
echo -e "\033[31m${1}\033[0m"
echo ""
}
Download_Load_Tag_Upload() {
print_green "[DLTU] - start !"
while [[ $# -gt 0 ]]; do
case "$1" in
rke)
# print_green "download rke "
local_gzip_path="$local_gzip_path/rke"
mkdir -p ${local_gzip_path}
oss_prefix_url="$oss_prefix_url/rke/"
dltu
shift # past argument
;;
middle)
local_gzip_path="$local_gzip_path/middle"
mkdir -p $local_gzip_path
oss_prefix_url="$oss_prefix_url/middle/"
dltu
shift # past argument
;;
cmii)
local_gzip_path="$local_gzip_path/cmii"
mkdir -p $local_gzip_path
oss_prefix_url="$oss_prefix_url/cmii/"
dltu
shift # past argument
;;
*)
# unknown option
print_red "bad arguments"
;;
esac
done
}
dltu() {
print_green "download all image name list and gzip file list!"
cd $local_gzip_path || exit
rm $all_image_list_txt
rm $gzip_image_list_txt
wget "$oss_prefix_url$all_image_list_txt"
wget "$oss_prefix_url$gzip_image_list_txt"
docker login -u admin -p ${HarborAdminPass} ${DockerRegisterDomain}
echo ""
while IFS= read -r i; do
[ -z "${i}" ] && continue
echo "download gzip file =>: $oss_prefix_url${i}"
if wget "$oss_prefix_url${i}" >/dev/null 2>&1; then
echo "Gzip file download success : ${i}"
image_full_name=$(docker load -i ${i} | head -n1 |awk -F': ' '{print $2}')
app_name=$(echo "$image_full_name" | sed 's|.*/||g')
echo "extract short name is $app_name"
if echo $image_full_name | grep -q "rancher"
then
print_green "tag image to => $DockerRegisterDomain/rancher/$app_name"
docker tag ${image_full_name} $DockerRegisterDomain/rancher/$app_name
docker push $DockerRegisterDomain/rancher/$app_name
else
print_green "tag image to => $DockerRegisterDomain/cmii/$app_name"
docker tag ${image_full_name} $DockerRegisterDomain/cmii/$app_name
docker push $DockerRegisterDomain/cmii/$app_name
fi
else
print_red "Gzip file download FAILED : ${i}"
fi
echo "-------------------------------------------------"
done <"${gzip_image_list_txt}"
shift
}
Load_Tag_Upload(){
print_green "[LTU] - start to load image from offline !"
while [[ $# -gt 0 ]]; do
case "$1" in
rke)
# print_green "download rke "
local_gzip_path="$local_gzip_path/rke"
mkdir -p ${local_gzip_path}
oss_prefix_url="$oss_prefix_url/rke/"
ltu
shift # past argument
;;
middle)
local_gzip_path="$local_gzip_path/middle"
mkdir -p $local_gzip_path
oss_prefix_url="$oss_prefix_url/middle/"
ltu
shift # past argument
;;
cmii)
local_gzip_path="$local_gzip_path/cmii"
mkdir -p $local_gzip_path
oss_prefix_url="$oss_prefix_url/cmii/"
ltu
shift # past argument
;;
*)
# unknown option
print_red "bad arguments"
;;
esac
done
}
ltu(){
all_file_list=$(find $local_gzip_path -type f -name "*.tar.gz")
for file in $all_file_list; do
echo "offline gzip file is => : $file"
image_full_name=$(docker load -i ${file} | head -n1 |awk -F': ' '{print $2}')
app_name=$(echo "$image_full_name" | sed 's|.*/||g')
echo "extract short name is $app_name"
if echo $image_full_name | grep -q "rancher"
then
print_green "tag image to => $DockerRegisterDomain/rancher/$app_name"
docker tag ${image_full_name} $DockerRegisterDomain/rancher/$app_name
docker push $DockerRegisterDomain/rancher/$app_name
else
print_green "tag image to => $DockerRegisterDomain/cmii/$app_name"
docker tag ${image_full_name} $DockerRegisterDomain/cmii/$app_name
docker push $DockerRegisterDomain/cmii/$app_name
fi
done
}
test(){
app_name=$(echo "nginx:latest" | sed 's|.*/||g')
echo "extract short name is $app_name"
}
# test
#Download_Load_Tag_Upload "rke" "middle" "cmii"
Load_Tag_Upload "rke"

View File

@@ -0,0 +1,15 @@
#!/bin/bash
#for image in $(ls /root/octopus_image/rke)
#do
# echo "start to upload => $image"
# mc cp /root/octopus_image/rke/$image demo/cmlc-installation/rke-image-amd64/
# echo ""
#done
export local_path=/root/octopus_image/5.4.0
for image in $(ls $local_path); do
echo "start to upload => $image"
mc cp $local_path/$image demo/cmlc-installation/5.4.0/
echo ""
done

View File

@@ -0,0 +1,17 @@
bitnami/redis:6.2.14-debian-11-r1
bitnami/mysql:8.1.0-debian-11-r42
simonrupf/chronyd:0.4.3
bitnami/bitnami-shell:11-debian-11-r136
bitnami/rabbitmq:3.11.26-debian-11-r2
ossrs/srs:v5.0.195
emqx/emqx:5.5.1
nacos/nacos-server:v2.1.2-slim
mongo:5.0
bitnami/minio:2023.5.4
kubernetesui/dashboard:v2.0.1
kubernetesui/metrics-scraper:v1.0.4
nginx:1.24.0
dyrnq/nfs-subdir-external-provisioner:v4.0.2
jerrychina2020/rke-tools:v0.175-linux
jerrychina2020/rke-tools:v0.175
busybox:latest

View File

@@ -0,0 +1,18 @@
bitnami/redis:6.2.14-debian-11-r1
bitnami/mysql:8.1.0-debian-11-r42
simonrupf/chronyd:0.4.3
bitnami/bitnami-shell:11-debian-11-r136
bitnami/rabbitmq:3.11.26-debian-11-r2
ossrs/srs:v5.0.195
emqx/emqx:5.5.1
nacos/nacos-server:v2.1.2
nacos/nacos-server:v2.1.2-slim
mongo:5.0
bitnami/minio:2023.5.4
kubernetesui/dashboard:v2.0.1
kubernetesui/metrics-scraper:v1.0.4
nginx:1.24.0
dyrnq/nfs-subdir-external-provisioner:v4.0.2
jerrychina2020/rke-tools:v0.175-linux
jerrychina2020/rke-tools:v0.175
busybox:latest

View File

@@ -0,0 +1,185 @@
#!/bin/bash
cmii_image_list=(
cmlc=cmii=cmii-admin-data=5.4.0.tar.gz
cmlc=cmii=cmii-admin-gateway=5.4.0.tar.gz
docker=ossrs=srs=v4.0.136.tar.gz
)
middle_image_list=(
docker=bitnami=bitnami-shell=10-debian-10-r140.tar.gz
docker=kubernetesui=dashboard=v2.0.1.tar.gz
docker=bitnami=bitnami-shell=11-debian-11-r136.tar.gz
docker=kubernetesui=metrics-scraper=v1.0.4.tar.gz
docker=bitnami=minio=2022.5.4.tar.gz
docker=library=busybox=latest.tar.gz
docker=bitnami=minio=2023.5.4.tar.gz
docker=library=mongo=5.0.tar.gz
docker=bitnami=mysql=8.0.35-debian-11-r1.tar.gz
docker=library=nginx=1.21.3.tar.gz
docker=bitnami=mysql=8.1.0-debian-11-r42.tar.gz
docker=library=rabbitmq=3.9-management.tar.gz
docker=bitnami=rabbitmq=3.11.26-debian-11-r2.tar.gz
docker=library=redis=6.0.20-alpine.tar.gz
docker=bitnami=rabbitmq=3.9.12-debian-10-r3.tar.gz
docker=nacos=nacos-server=v2.1.2-slim.tar.gz
docker=bitnami=redis=6.2.14-debian-11-r1.tar.gz
docker=ossrs=srs=v4.0.136.tar.gz
docker=bitnami=redis=6.2.6-debian-10-r0.tar.gz
docker=ossrs=srs=v4.0-r3.tar.gz
docker=dyrnq=nfs-subdir-external-provisioner=v4.0.2.tar.gz
docker=ossrs=srs=v5.0.195.tar.gz
docker=emqx=emqx=4.2.12.tar.gz
docker=simonrupf=chronyd=0.4.3.tar.gz
)
rke_image_list=(
docker=rancher=backup-restore-operator=v1.0.3.tar.gz
docker=rancher=calico-cni=v3.17.2.tar.gz
docker=rancher=calico-ctl=v3.17.2.tar.gz
docker=rancher=calico-kube-controllers=v3.17.2.tar.gz
docker=rancher=calico-node=v3.17.2.tar.gz
docker=rancher=calico-pod2daemon-flexvol=v3.17.2.tar.gz
docker=rancher=cis-operator=v1.0.3.tar.gz
docker=rancher=cluster-proportional-autoscaler=1.7.1.tar.gz
docker=rancher=cluster-proportional-autoscaler=1.8.1.tar.gz
docker=rancher=configmap-reload=v0.3.0-rancher4.tar.gz
docker=rancher=coredns-coredns=1.8.0.tar.gz
docker=rancher=coreos-etcd=v3.4.14-rancher1.tar.gz
docker=rancher=coreos-flannel=v0.13.0-rancher1.tar.gz
docker=rancher=coreos-kube-state-metrics=v1.9.7.tar.gz
docker=rancher=coreos-prometheus-config-reloader=v0.39.0.tar.gz
docker=rancher=coreos-prometheus-operator=v0.39.0.tar.gz
docker=rancher=externalip-webhook=v0.1.6.tar.gz
docker=rancher=flannel-cni=v0.3.0-rancher6.tar.gz
docker=rancher=fleet-agent=v0.3.4.tar.gz
docker=rancher=fleet=v0.3.4.tar.gz
docker=rancher=fluentd=v0.1.24.tar.gz
docker=rancher=grafana-grafana=7.1.5.tar.gz
docker=rancher=hyperkube=v1.20.4-rancher1.tar.gz
docker=rancher=istio-kubectl=1.5.10.tar.gz
docker=rancher=jimmidyson-configmap-reload=v0.3.0.tar.gz
docker=rancher=k8s-dns-dnsmasq-nanny=1.15.2.tar.gz
docker=rancher=k8s-dns-kube-dns=1.15.2.tar.gz
docker=rancher=k8s-dns-node-cache=1.15.13.tar.gz
docker=rancher=k8s-dns-sidecar=1.15.2.tar.gz
docker=rancher=klipper-lb=v0.1.2.tar.gz
docker=rancher=kube-api-auth=v0.1.4.tar.gz
docker=rancher=kubernetes-external-dns=v0.7.3.tar.gz
docker=rancher=library-busybox=1.31.1.tar.gz
docker=rancher=library-busybox=1.32.1.tar.gz
docker=rancher=library-nginx=1.19.2-alpine.tar.gz
docker=rancher=library-traefik=1.7.19.tar.gz
docker=rancher=local-path-provisioner=v0.0.11.tar.gz
docker=rancher=local-path-provisioner=v0.0.14.tar.gz
docker=rancher=local-path-provisioner=v0.0.19.tar.gz
docker=rancher=log-aggregator=v0.1.7.tar.gz
docker=rancher=metrics-server=v0.4.1.tar.gz
docker=rancher=nginx-ingress-controller-defaultbackend=1.5-rancher1.tar.gz
docker=rancher=nginx-ingress-controller=nginx-0.43.0-rancher1.tar.gz
docker=rancher=opa-gatekeeper=v3.1.0-beta.7.tar.gz
docker=rancher=openzipkin-zipkin=2.14.2.tar.gz
docker=rancher=pause=3.2.tar.gz
docker=rancher=plugins-docker=18.09.tar.gz
docker=rancher=prom-alertmanager=v0.21.0.tar.gz
docker=rancher=prometheus-auth=v0.2.1.tar.gz
docker=rancher=prom-node-exporter=v1.0.1.tar.gz
docker=rancher=prom-prometheus=v2.18.2.tar.gz
docker=rancher=rancher-agent=v2.5.7.tar.gz
docker=rancher=rancher=v2.5.7.tar.gz
docker=rancher=rancher-webhook=v0.1.0-beta9.tar.gz
docker=rancher=rke-tools=v0.1.72.tar.gz
docker=rancher=security-scan=v0.1.14.tar.gz
docker=rancher=security-scan=v0.2.2.tar.gz
docker=rancher=shell=v0.1.6.tar.gz
docker=rancher=sonobuoy-sonobuoy=v0.16.3.tar.gz
docker=rancher=system-upgrade-controller=v0.6.2.tar.gz
)
oss_prefix=https://oss.demo.uavcmlc.com/cmlc-installation/shls
oss_middle_prefix=https://oss.demo.uavcmlc.com/cmlc-installation/mid-image-amd64
oss_rke_prefix=https://oss.demo.uavcmlc.com/cmlc-installation/rke-image-amd64
target_harbor_host=103.0.180.181:8033
cmii_image_download_from_oss() {
for image in "${cmii_image_list[@]}"; do
echo "start to download => $image"
curl -x socks5h://103.0.180.82:9997 $oss_prefix/$image -o $image
echo ""
done
}
middle_image_download_from_oss() {
mkdir -p /wdd/image/middle/
for image in "${middle_image_list[@]}"; do
echo "start to download => $image"
curl -x socks5h://103.0.180.82:9997 $oss_middle_prefix/$image -o /wdd/image/middle/$image
echo ""
done
}
rke_image_download_from_oss() {
mkdir -p /wdd/image/rke/
for image in "${rke_image_list[@]}"; do
echo "start to download => $image"
curl -x socks5h://103.0.180.82:9997 $oss_rke_prefix/$image -o /wdd/image/rke/$image
echo ""
done
}
image_load_to_harbor() {
local cmii_harbor_prefix="harbor.cdcyy.com.cn/cmii/"
for image in "${cmii_image_list[@]}"; do
echo "start to load => $image"
docker load <"$image"
echo ""
if [[ $image == cmlc* ]]; then
local app_name=$(echo $image | cut -d "=" -f3)
local ccc=$(echo $image | cut -d "=" -f4)
local app_tag="${ccc%.tar.gz}"
echo "from $cmii_harbor_prefix$app_name:$app_tag ==> $target_harbor_host/cmii/$app_name:$app_tag"
docker tag "$cmii_harbor_prefix$app_name:$app_tag" "$target_harbor_host/cmii/$app_name:$app_tag"
echo "start to push => $target_harbor_host/cmii/$app_name:$app_tag"
docker login -u admin -p V2ryStr@ngPss $target_harbor_host
docker push "$target_harbor_host/cmii/$app_name:$app_tag"
echo ""
fi
echo ""
done
for image in "${rke_image_list[@]}"; do
echo "start to load => $image"
docker load <"$image"
echo ""
local app_name_prefix=$(echo $image | cut -d "=" -f2)
local app_name=$(echo $image | cut -d "=" -f3)
local ccc=$(echo $image | cut -d "=" -f4)
local app_tag="${ccc%.tar.gz}"
echo "from $app_name_prefix/$app_name:$app_tag ==> $target_harbor_host/rancher/$app_name:$app_tag"
docker tag "$app_name_prefix/$app_name:$app_tag" "$target_harbor_host/rancher/$app_name:$app_tag"
echo "start to push => $target_harbor_host/rancher/$app_name:$app_tag"
docker login -u admin -p V2ryStr@ngPss $target_harbor_host
docker push "$target_harbor_host/rancher/$app_name:$app_tag"
echo
done
for image in "${middle_image_list[@]}"; do
echo "start to load => $image"
docker load <"$image"
echo ""
# docker=bitnami=redis=6.2.14-debian-11-r1.tar.gz
local app_name_prefix=$(echo $image | cut -d "=" -f2)
local app_name=$(echo $image | cut -d "=" -f3)
local ccc=$(echo $image | cut -d "=" -f4)
local app_tag="${ccc%.tar.gz}"
echo "from $app_name_prefix/$app_name:$app_tag ==> $target_harbor_host/cmii/$app_name:$app_tag"
echo "start to push => $target_harbor_host/cmii/$app_name:$app_tag"
docker login -u admin -p V2ryStr@ngPss $target_harbor_host
docker push "$target_harbor_host/cmii/$app_name:$app_tag"
done
}
create_harbor_project() {
curl -X POST -u "admin:V2ryStr@ngPss" -H "authorization: Basic YWRtaW46VjJyeVN0ckBuZ1Bzcw==" -H "Content-Type: application/json" -d '{"project_name":"cmii","registry_id":null,"metadata":{"public":"true"},"storage_limit":-1}' http://$target_harbor_host/api/v2.0/projects
curl -X POST -u "admin:V2ryStr@ngPss" -H "authorization: Basic YWRtaW46VjJyeVN0ckBuZ1Bzcw==" -H "Content-Type: application/json" -d '{"project_name":"rancher","registry_id":null,"metadata":{"public":"true"},"storage_limit":-1}' http://$target_harbor_host/api/v2.0/projects
}

View File

@@ -0,0 +1,70 @@
#!/bin/bash
full_image_name_list=(
harbor.cdcyy.com.cn/cmii/cmii-uav-cloud-live:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-data-post-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-depotautoreturn:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-logger:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-mqtthandler:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-notice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-admin-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-cms:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-material-warehouse:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-autowaypoint:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-brain:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-mission:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-oauth:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-airspace:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-supervision:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-admin-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-emergency:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-kpi-monitor:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-waypoint:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-device:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-alarm:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-clusters:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-surveillance:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-threedsimulation:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-open-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-industrial-portfolio:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-tower:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-developer:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-app-release:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-integration:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-admin-data:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-armypeople:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-base:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-logistics:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-seniclive:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-visualization:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-cms-portal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-multiterminal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-security:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-media:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-oms:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-securityh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-share:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervision:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-ai-brain:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-emergency-rescue:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-splice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-jiangsuwenlv:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-open:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-qinghaitourism:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-qingdao:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-mws:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-threedsimulation:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervisionh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-detection:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-hljtt:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-srs-oss-adaptor:2023-SA
)
gzip_image_name_list=(
ossrs/srs:v5.0.195
)

View File

@@ -0,0 +1,62 @@
rancher/backup-restore-operator:v1.0.3
rancher/calico-cni:v3.17.2
rancher/calico-ctl:v3.17.2
rancher/calico-kube-controllers:v3.17.2
rancher/calico-node:v3.17.2
rancher/calico-pod2daemon-flexvol:v3.17.2
rancher/cis-operator:v1.0.3
rancher/cluster-proportional-autoscaler:1.7.1
rancher/coredns-coredns:1.8.0
rancher/coreos-etcd:v3.4.14-rancher1
rancher/coreos-kube-state-metrics:v1.9.7
rancher/coreos-prometheus-config-reloader:v0.39.0
rancher/coreos-prometheus-operator:v0.39.0
rancher/externalip-webhook:v0.1.6
rancher/flannel-cni:v0.3.0-rancher6
rancher/coreos-flannel:v0.13.0-rancher1
rancher/fleet-agent:v0.3.4
rancher/fleet:v0.3.4
rancher/fluentd:v0.1.24
rancher/grafana-grafana:7.1.5
rancher/hyperkube:v1.20.4-rancher1
rancher/jimmidyson-configmap-reload:v0.3.0
rancher/k8s-dns-dnsmasq-nanny:1.15.2
rancher/k8s-dns-kube-dns:1.15.2
rancher/k8s-dns-node-cache:1.15.13
rancher/k8s-dns-sidecar:1.15.2
rancher/klipper-lb:v0.1.2
rancher/kube-api-auth:v0.1.4
rancher/kubectl:v1.20.4
rancher/kubernetes-external-dns:v0.7.3
rancher/cluster-proportional-autoscaler:1.8.1
rancher/library-busybox:1.31.1
rancher/library-busybox:1.32.1
rancher/library-nginx:1.19.2-alpine
rancher/library-traefik:1.7.19
rancher/local-path-provisioner:v0.0.11
rancher/local-path-provisioner:v0.0.14
rancher/local-path-provisioner:v0.0.19
rancher/log-aggregator:v0.1.7
rancher/istio-kubectl:1.5.10
rancher/metrics-server:v0.4.1
rancher/configmap-reload:v0.3.0-rancher4
rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1
rancher/nginx-ingress-controller:nginx-0.43.0-rancher1
rancher/opa-gatekeeper:v3.1.0-beta.7
rancher/openzipkin-zipkin:2.14.2
rancher/pause:3.2
rancher/plugins-docker:18.09
rancher/prom-alertmanager:v0.21.0
rancher/prom-node-exporter:v1.0.1
rancher/prom-prometheus:v2.18.2
rancher/prometheus-auth:v0.2.1
rancher/rancher-agent:v2.5.7
rancher/rancher-webhook:v0.1.0-beta9
rancher/rancher:v2.5.7
rancher/rke-tools:v0.1.72
jerrychina2020/rke-tools:v0.175-linux
rancher/security-scan:v0.1.14
rancher/security-scan:v0.2.2
rancher/shell:v0.1.6
rancher/sonobuoy-sonobuoy:v0.16.3
rancher/system-upgrade-controller:v0.6.2

View File

@@ -0,0 +1,68 @@
cmii-uav-platform 5.2.0
cmii-uav-platform-ai-brain 5.2.0
cmii-uav-platform-armypeople 5.2.0-26276
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-developer 5.2.0-25858
cmii-uav-platform-qingdao 4.1.6-24238-qingdao
cmii-uav-platform-qinghaitourism 4.1.0-21377-0508 feature/UAVCLOUD-21377 29c0ab73b24d412943d2f435fcc8484447bb6e2d
cmii-uav-device 5.2.0
cmii-uav-emergency 5.2.0
cmii-uav-gateway 5.2.0
cmii-uav-gis-server 5.2.0
cmii-admin-data 5.2.0
cmii-uav-grid-datasource 5.2.0-24810
cmii-uav-grid-engine 5.1.0
cmii-admin-gateway 5.2.0
cmii-uav-grid-manage 5.1.0
cmii-uav-platform-security 4.1.6
cmii-uav-industrial-portfolio 5.2.0-25268-11
cmii-uav-integration 5.2.0-25447
cmii-uav-kpi-monitor 5.2.0
cmii-admin-user 5.2.0
cmii-uav-logger 5.2.0
cmii-uav-platform-securityh5 5.2.0
cmii-app-release 4.2.0-validation staging c71f49b4df189d2739a8a04fbfdb2dd8ffbe3dbd
cmii-uav-platform-seniclive 5.2.0
cmii-uav-platform-share 5.2.0
cmii-open-gateway 5.2.0
cmii-uav-platform-splice 5.2.0
cmii-suav-platform-supervision 5.2.0
cmii-uav-material-warehouse 5.2.0
cmii-uav-platform-threedsimulation 5.2.0-21392 feature/UAVCLOUD-21392 d82cc5411455cd25719307b1d1afeb1b55a10b85
cmii-uav-mission 5.2.0-25840
cmii-uav-platform-visualization 5.2.0
cmii-suav-platform-supervisionh5 5.2.0
cmii-uav-mqtthandler 5.2.0-25340
cmii-uav-notice 5.2.0
cmii-uav-process 5.2.0
cmii-uav-oauth 5.2.0
cmii-suav-supervision 5.2.0
cmii-uav-surveillance 5.2.0-25854
cmii-uav-airspace 5.2.0
cmii-uav-threedsimulation 5.2.0 master 838a812669a157a9f65044974a1eb6456f515284
cmii-uav-alarm 5.2.0
cmii-uav-tower 5.2.0
cmii-uav-autowaypoint 4.1.6-cm-0828
cmii-uav-user 5.2.0
cmii-uav-brain 5.2.0
cmii-uav-cloud-live 5.2.0
cmii-uav-waypoint 5.2.0-011102
helm-live-op-v2 5.2.0
cmii-uav-clusters 5.2.0
cmii-uav-cms 5.2.0
helm-live-rtsp-op v5.1.0
cmii-uav-data-post-process 5.2.0
cmii-uav-depotautoreturn 4.2.0 feature/depot 10d64944492268e8b461e86c47c1e35a62b1b6df
helm-live-rtsp-zlm v1.0.6
helm-proxysql 2.0.10

View File

@@ -0,0 +1,27 @@
cmii-uav-developer 5.2.0-25858 hotfix/UAVCLOUD-25858 a4cb9dda95687edf3b334a175d6af6fee6d2a3c4
cmii-uav-platform 5.2.0 master c69b4186185e0f70b79c1f15384b02e45a846b65
cmii-uav-platform-ai-brain 5.2.0 master 64aa7e77b6102220aff6a3e7790e3b7d9a90e86e
cmii-uav-platform-armypeople 5.2.0-24538 feature/UAVCLOUD-24538 8919f32066d60754cbf7cb5c91990f0df7416c15
cmii-uav-platform-base 5.2.0 master 7af440ed64332b6a82ff0b0ceaa3f0e4d0cd5c4d
cmii-admin-data 5.2.0 master 174dbdb374d89bc5a0272e41d3263aff986538c2
cmii-uav-platform-cms-portal 5.2.0 master e1297936d8e3274a937ac9a5d8062204cc4d7690
cmii-uav-platform-detection 5.2.0 master d58d1cd97ecf88d235b835adbd43ef69af5dfb34
cmii-admin-gateway 5.2.0 master 319450016906a7a45166c177bb3871833a88c7a4
cmii-uav-platform-emergency-rescue 5.2.0
cmii-uav-device 5.2.0 master bc98aef580821850ffbf154a497560463a5f9b7f
cmii-admin-user 5.2.0 master fe3c3662c75585ea77a41db9b3f0b42afb1bef09
cmii-uav-emergency 5.2.0 master b98efc668407418e9b97026bb27e507598756498
cmii-uav-gateway 5.2.0 master 6be883e4e0f05a566a6c00a322d8c0c7b0f6c27a
cmii-app-release 4.2.0-validation staging c71f49b4df189d2739a8a04fbfdb2dd8ffbe3dbd
cmii-uav-gis-server 5.2.0 master 1b7d19db174d3085cb89796bac439fd238cb7f1f
cmii-open-gateway 5.2.0 master 90defcaeca1a8998e566c38d41f03e28b29099ee
cmii-uav-platform-hljtt 5.2.0 master 49aeec2325a4cee8ac24c448850262577ea8046d
cmii-suav-platform-supervision 5.2.0 master 184fb3cc25056deeab67a22b0e984059d75d0ae5
cmii-uav-grid-datasource 5.2.0-24810 hotfix/UAVCLOUD-24810-zbkh95876495498a655f15efd77c0482adb999587203
cmii-suav-platform-supervisionh5 5.2.0 master 34bcb2988cc50080420582dbe06744245d3f71a1
cmii-uav-platform-jiangsuwenlv 4.1.3-jiangsu-0427 feature/UAVCLOUD-21794 8608c608acd94c844f466a93f5566a61f5cc5cf8
cmii-uav-grid-engine 5.1.0 master ba0dfdb9428235a1763bc704db12b6b52e110a81
cmii-uav-platform-logistics 5.2.0 master 1dbcf654a96316263645b0809e1a37d4be213b71
cmii-suav-supervision 5.2.0 master 1e1b401aa1f052a6cc127db68f172579d5369a98
cmii-uav-grid-manage 5.1.0 master ab40b86d6e227e037492d9ca27517b45d593898d
cmii-uav-platform-media 5.2.0 master 3d2392585f67463cefc767f93906096c0824205a

View File

@@ -0,0 +1,65 @@
cmii-admin-data 5.4.0 master b87cd7ef169c684fe33c05b24e9359596d2dcaab
cmii-admin-gateway 5.4.0 master 319450016906a7a45166c177bb3871833a88c7a4
cmii-admin-user 5.4.0 master 11ca82637fabcf7dc990933cfa041599caa4bdb3
cmii-app-release 4.2.0-validation staging c71f49b4df189d2739a8a04fbfdb2dd8ffbe3dbd
cmii-open-gateway 5.4.0 master 90defcaeca1a8998e566c38d41f03e28b29099ee
cmii-suav-platform-supervision 5.4.0 master b4e1f84df6ee78f8a32b019b5e008d9abebfc3a1
cmii-suav-platform-supervisionh5 5.4.0 master 34bcb2988cc50080420582dbe06744245d3f71a1
cmii-suav-supervision 5.2.0 master 1e1b401aa1f052a6cc127db68f172579d5369a98
cmii-uav-airspace 5.4.0 master 33e3449fa632a51663c3a6867c91b63c39604a5c
cmii-uav-platform-qinghaitourism 4.1.0-21377-0508 feature/UAVCLOUD-21377 29c0ab73b24d412943d2f435fcc8484447bb6e2d
cmii-uav-oauth 5.4.0 master 8545d10435329d9999f31819f702f7396b8d5470
cmii-uav-alarm 5.3.0 master 77e7170b5411191d6097e73872530f314184ca2a
cmii-uav-platform-security 4.1.6 master b69e07278d1cd30246fe3c3416640cbab2a79f5e
cmii-uav-platform 5.4.0 master f901d1e75b1b6dd5cab58178b350a38c97e24b04
cmii-uav-platform-securityh5 5.4.0 master fc453c00ae715f0648e599284f231a5b04c2daf4
cmii-uav-platform-ai-brain 5.4.0 master 64aa7e77b6102220aff6a3e7790e3b7d9a90e86e
cmii-uav-platform-seniclive 5.2.0
cmii-uav-platform-armypeople 5.4.0 master 8cdd9b8cc9ef9b4e5c8803c5f25571b1e95d100d
cmii-uav-platform-share 5.4.0 master 69adc02e570116dbcd3186852be3751dc77375c5
cmii-uav-platform-base 5.4.0 master 7af440ed64332b6a82ff0b0ceaa3f0e4d0cd5c4d
cmii-uav-autowaypoint 4.1.6-cm
cmii-uav-platform-cms-portal 5.4.0 master e1297936d8e3274a937ac9a5d8062204cc4d7690
cmii-uav-platform-splice 5.4.0 master 88a78f84eb82ecca95c61af89e0779a4297904fc
cmii-uav-platform-detection 5.4.0 master ff6178ae8037c473d3f01bce75cb366149a2ca1a
cmii-uav-platform-threedsimulation 5.2.0-21392 feature/UAVCLOUD-21392 d82cc5411455cd25719307b1d1afeb1b55a10b85
cmii-uav-brain 5.4.0 master 5ad37353cbab2059f2c5df40b17f11588074c1a4
cmii-uav-platform-emergency-rescue 5.2.0
cmii-uav-platform-visualization 5.2.0
cmii-uav-cloud-live 5.4.0 master 72ee6a404338fe43167217cbd71c68069537504d
cmii-uav-process 5.4.0 master 594396d6676c2a289fcf63d1be122cf471d555b9
cmii-uav-surveillance 5.4.0 master b2a195bc169d6019b2cff7519d93c9322854fcbe
cmii-uav-platform-hljtt 5.3.0-hjltt hotfix/UAVCLOUD-25344 0efa24c18942f57f51f07bffb4814829b0fa8a21
cmii-uav-clusters 5.2.0
cmii-uav-threedsimulation 5.1.0 master 838a812669a157a9f65044974a1eb6456f515284
cmii-uav-platform-jiangsuwenlv 4.1.3-jiangsu-0427 feature/UAVCLOUD-21794 a1aba6ce622a66f97a91368ffe5cb1b402e4a1f5
cmii-uav-cms 5.3.0 master a6bcaac4febadd0e870dad553b0999c2efebfe27
cmii-uav-platform-logistics 5.4.0 master 1dbcf654a96316263645b0809e1a37d4be213b71
cmii-uav-platform-media 5.4.0 master 3d2392585f67463cefc767f93906096c0824205a
cmii-uav-data-post-process 5.4.0 master 9b4749934a66690d0024a464677e352cd6e29402
cmii-uav-platform-multiterminal 5.4.0 master bb01bc0a9f60f154d9f1d7f4110dc00321cceefb
cmii-uav-platform-mws 5.4.0 master dd4656904232ba729dc5ac146af65af7dce0928a
cmii-uav-depotautoreturn 5.4.0 feature/depot 10d64944492268e8b461e86c47c1e35a62b1b6df
cmii-uav-tower 5.4.0 master 76835a8e6714ac862f2b8a9a91c8e3d6a24af6d2
cmii-uav-user 5.4.0 master 2c13df8f60775bb631d6925bd97aacc6456c4695
cmii-uav-platform-oms 5.4.0 master 8c90e914811f68783cf77d2bf0d6dbbba1da74ff
cmii-uav-waypoint 5.4.0-26768 hotfix/UAVCLOUD-26768 e6bbaec8d1cbd1feef3140c4458a388d9f15053c
cmii-uav-platform-open 5.4.0 master 175853d47cf1efbe3a5a34fea709483cd44ac1da
cmii-uav-platform-qingdao 4.1.6-24238-qingdao feature/UAVCLOUD-24238-qingdaoe03f64bb06ff657146780292afdaffbeca1c6e54
cmii-uav-developer 5.4.0 master 40aca1c7a4a07f51288bfd7f688bdf2c25fbfb29
cmii-uav-device 5.4.0 master f1c9cd081e5616c40826dae3caf25a91336565b9
cmii-uav-emergency 5.3.0 master b98efc668407418e9b97026bb27e507598756498
cmii-uav-gateway 5.4.0 master 6be883e4e0f05a566a6c00a322d8c0c7b0f6c27a
cmii-uav-gis-server 5.4.0 master 1b7d19db174d3085cb89796bac439fd238cb7f1f
cmii-uav-grid-datasource 5.2.0-24810 hotfix/UAVCLOUD-24810-zbkh95876495498a655f15efd77c0482adb999587203
cmii-uav-grid-engine 5.1.0 master ba0dfdb9428235a1763bc704db12b6b52e110a81
cmii-uav-grid-manage 5.1.0 master ab40b86d6e227e037492d9ca27517b45d593898d
cmii-uav-industrial-portfolio 5.4.0 master 5c90a29a11832c4cdfd7a7f07e3d34b53a362ba7
cmii-uav-integration 5.4.0 master b263f82dcffa3df49ffa1cefc66b484a87ca0d3a
cmii-uav-kpi-monitor 5.4.0 master 2201e8798f6831adf97ff63ea9fcd3b2365a2b5a
cmii-uav-logger 5.4.0 master 459e0f49e55718726c8d3b4cbaa193b5b6f995b0
cmii-uav-material-warehouse 5.4.0 master 28169ae40f25b18f21f22965fd08054a63eea0d7
cmii-uav-mission 5.4.0 master 8e6b362090e15618cc363aba526b0ec7db05e441
cmii-uav-mqtthandler 5.4.0 master 21d2384edcb542a96437b2796dab45bdfe00c840
cmii-uav-multilink 5.4.0 master 2605680a0dad09015fcb294916b901ef3d60426a
cmii-uav-notice 5.4.0 master bb29aee5009ff408293061de0ac0913ec2ad4633

View File

@@ -0,0 +1,65 @@
cmii-admin-data 5.4.0 master 52776da9bc17e8ce8d2af968846f74996ac1529e
cmii-admin-gateway 5.4.0 master 319450016906a7a45166c177bb3871833a88c7a4
cmii-admin-user 5.4.0 master 11ca82637fabcf7dc990933cfa041599caa4bdb3
cmii-app-release 4.2.0-validation staging c71f49b4df189d2739a8a04fbfdb2dd8ffbe3dbd
cmii-open-gateway 5.4.0 master 90defcaeca1a8998e566c38d41f03e28b29099ee
cmii-suav-platform-supervision 5.4.0 master 17b32fde996ecd53d33a1cea11ead514fa690c33
cmii-suav-platform-supervisionh5 5.4.0 master 34bcb2988cc50080420582dbe06744245d3f71a1
cmii-uav-developer 5.4.0 master 40aca1c7a4a07f51288bfd7f688bdf2c25fbfb29
cmii-suav-supervision 5.2.0 master 1e1b401aa1f052a6cc127db68f172579d5369a98
cmii-uav-device 5.4.0-26905 master fc321d363ef6c471fbf02f3df843caba48f08123
cmii-uav-airspace 5.4.0 master 87443290eedefe237cc5bb272de570f13719df2b
cmii-uav-emergency 5.3.0 master b98efc668407418e9b97026bb27e507598756498
cmii-uav-alarm 5.3.0 master 77e7170b5411191d6097e73872530f314184ca2a
cmii-uav-gateway 5.4.0 master 6be883e4e0f05a566a6c00a322d8c0c7b0f6c27a
cmii-uav-gis-server 5.4.0 master 1b7d19db174d3085cb89796bac439fd238cb7f1f
cmii-uav-autowaypoint 4.1.6-cm
cmii-uav-grid-datasource 5.2.0-24810 hotfix/UAVCLOUD-24810-zbkh95876495498a655f15efd77c0482adb999587203
cmii-uav-grid-engine 5.1.0 master ba0dfdb9428235a1763bc704db12b6b52e110a81
cmii-uav-brain 5.4.0 master 5ad37353cbab2059f2c5df40b17f11588074c1a4
cmii-uav-grid-manage 5.1.0 master ab40b86d6e227e037492d9ca27517b45d593898d
cmii-uav-cloud-live 5.4.0 master 72ee6a404338fe43167217cbd71c68069537504d
cmii-uav-industrial-portfolio 5.4.0 master 5c90a29a11832c4cdfd7a7f07e3d34b53a362ba7
cmii-uav-clusters 5.2.0
cmii-uav-integration 5.4.0-0228 master c64057eba69f8326cd470a82d319776f68b448af
cmii-uav-cms 5.3.0 master a6bcaac4febadd0e870dad553b0999c2efebfe27
cmii-uav-kpi-monitor 5.4.0 master 2201e8798f6831adf97ff63ea9fcd3b2365a2b5a
cmii-uav-data-post-process 5.4.0 master 9b4749934a66690d0024a464677e352cd6e29402
cmii-uav-logger 5.4.0 master 459e0f49e55718726c8d3b4cbaa193b5b6f995b0
cmii-uav-depotautoreturn 5.4.0 feature/depot 10d64944492268e8b461e86c47c1e35a62b1b6df
cmii-uav-platform-qinghaitourism 4.1.0-21377-0508 feature/UAVCLOUD-21377 29c0ab73b24d412943d2f435fcc8484447bb6e2d
cmii-uav-material-warehouse 5.4.0 master 28169ae40f25b18f21f22965fd08054a63eea0d7
cmii-uav-platform-security 4.1.6 master b69e07278d1cd30246fe3c3416640cbab2a79f5e
cmii-uav-mission 5.4.0-26462-0228 feature/UAVCLOUD-26462-AI-new3f028468c9bd11f93209a48503d4b1fce2b62f75
cmii-uav-platform-securityh5 5.4.0 master fc453c00ae715f0648e599284f231a5b04c2daf4
cmii-uav-platform-seniclive 5.2.0
cmii-uav-mqtthandler 5.4.0-26768 hotfix/UAVCLOUD-26768 50a325f89c9b1a07f22a6a9f76990ed46a990af0
cmii-uav-platform-share 5.4.0 master 69adc02e570116dbcd3186852be3751dc77375c5
cmii-uav-multilink 5.4.0 master 2605680a0dad09015fcb294916b901ef3d60426a
cmii-uav-platform-splice 5.4.0 master 88a78f84eb82ecca95c61af89e0779a4297904fc
cmii-uav-notice 5.4.0 master bb29aee5009ff408293061de0ac0913ec2ad4633
cmii-uav-platform-threedsimulation 5.2.0-21392 feature/UAVCLOUD-21392 d82cc5411455cd25719307b1d1afeb1b55a10b85
cmii-uav-platform-visualization 5.2.0
cmii-uav-process 5.4.0 master 594396d6676c2a289fcf63d1be122cf471d555b9
cmii-uav-surveillance 5.4.0-24227 hotfix/24227 9759462cfd72439f48e6e35ce7e218043ca9ef54
cmii-uav-oauth 5.4.0 master 8545d10435329d9999f31819f702f7396b8d5470
cmii-uav-threedsimulation 5.1.0 master 838a812669a157a9f65044974a1eb6456f515284
cmii-uav-platform 5.4.0-25263 feature/UAVCLOUD-25263-aidc9dbe23a8ca36f27937ede264f8fbc3557baea6
cmii-uav-tower 5.4.0 master 76835a8e6714ac862f2b8a9a91c8e3d6a24af6d2
cmii-uav-platform-ai-brain 5.4.0 master 64aa7e77b6102220aff6a3e7790e3b7d9a90e86e
cmii-uav-platform-armypeople 5.4.0 master d6643c3ff0b3376f9170acfdcd191ca76e346e5c
cmii-uav-user 5.4.0 master 7a7c535c0d85445c6f9b5733d65a6ba435f6902c
cmii-uav-waypoint 5.4.0-26768 hotfix/UAVCLOUD-26768 cae0737bc24258897337409b83bcbe31da591d58
cmii-uav-platform-base 5.4.0 master 7af440ed64332b6a82ff0b0ceaa3f0e4d0cd5c4d
cmii-uav-platform-cms-portal 5.4.0 master a1ef2c9ec397af10fa1e1642c7ab06fedbede4ca
cmii-uav-platform-detection 5.4.0 master ff6178ae8037c473d3f01bce75cb366149a2ca1a
cmii-uav-platform-emergency-rescue 5.2.0
cmii-uav-platform-hljtt 5.3.0-hjltt master c22efca0267f522f8b616a89814bdcaf97970c01
cmii-uav-platform-jiangsuwenlv 4.1.3-jiangsu-0427 feature/UAVCLOUD-21794 a1aba6ce622a66f97a91368ffe5cb1b402e4a1f5
cmii-uav-platform-logistics 5.4.0 master 1dbcf654a96316263645b0809e1a37d4be213b71
cmii-uav-platform-media 5.4.0 master 693b090344c72f0890cdc4a331696fd7181703a1
cmii-uav-platform-multiterminal 5.4.0 master bb01bc0a9f60f154d9f1d7f4110dc00321cceefb
cmii-uav-platform-mws 5.4.0 master dd4656904232ba729dc5ac146af65af7dce0928a
cmii-uav-platform-oms 5.4.0 master 8c90e914811f68783cf77d2bf0d6dbbba1da74ff
cmii-uav-platform-open 5.4.0 master 175853d47cf1efbe3a5a34fea709483cd44ac1da
cmii-uav-platform-qingdao 4.1.6-24238-qingdao feature/UAVCLOUD-24238-qingdaoe03f64bb06ff657146780292afdaffbeca1c6e54

View File

@@ -0,0 +1,87 @@
cmii-uav-onesupport 4.1.5-snapshot feature/UAVCLOUD-22088-productmanage 05c9c22e51ad576854bf6e39e678f5a91ee82df8
cmii-uav-platform 5.2.0-beta staging b933b42ea0a73da732b6821c415ef3192d83c0ae
cmii-uav-platform-ai-brain 4.2.0-test hotfix/UAVCLOUD-24267-lock acf0c717e29bce14e3d876f0162c4ed8329afe30
cmii-uav-platform-blockchain 4.0.7-beta staging 9939688adbfda2deec323fe90ae2ac1ac2ca39b3
cmii-uav-platform-classification 4.0.7-beta staging 35b19855be11f60e2ba4b5ff8837f965204fcda7
cmii-uav-platform-cms-portal 4.0.5-beta staging 87d1f00040714d7c40732d86d0e065b45bcdd13d
cmii-uav-platform-detection 4.1.3-test master 1758281702456b7dfccd0cba944dd5065d7d67cd
cmii-uav-platform-free 3.1.0-validation PR-5 a90309ab276f3b11a3c412b7006472bbe7ccef01
cmii-uav-data-classification 4.0.7-beta staging ff73639c9e869601df07fa6c2189dcccf286151b
cmii-uav-platform-free-application 3.1.0-validation PR-4 7a86cdae728f805b3d908153b34e7cc0d299ad5b
cmii-uav-platform-hyperspectral 2.1.14-beta
cmii-uav-platform-lowdetection-application 3.1.2-snapshot feature/UAVCLOUD-14610-cms ed703d4a83f8e73763a2771bdc54ffa9d9e5f2e5
cmii-uav-data-post-process 5.2.0-beta staging 6046e17925b43b573e416b2c004f005f5dcf6695
cmii-uav-platform-media 4.0.5-beta staging c416428614691fcbc356f6e0f0bec4da75ae2b80
cmii-uav-platform-multiterminal 4.1.5-snapshot feature/UAVCLOUD-21942 b2eea37a57866569be34be28d4f4636f025a1f80
cmii-uav-depotautoreturn 12345678 feature/depot d7339662569fb4958b50200a625b3cd059f79acc
cmii-uav-platform-mws 3.0.0-snapshot bugfix/UAVCLOUD-12219-download b317150f2104e986246f88747a2415c07b66aee2
cmii-uav-platform-omoc-uav 2.2.0-snapshot
cmii-uav-developer 4.2.0-test feature/staging-2021.0.4 c9d6168640a2f62559588639b11f39f7ad377d83
cmii-admin-data 5.2.0-beta staging 378998cb81c98afc29ff327419e9449907a210d5
cmii-uav-device 5.2.0-validation hotfix/LAIN05A-12-utmiss 19ac70b26a34ce432b8f5b88d4ecc5851531a4c9
cmii-uav-platform-oms 5.2.0-beta staging af8e22c36643cec7de5a02e9a6ceb9fd2221bf7a
cmii-admin-gateway 4.1.5-beta staging a2b54b40dd5606ae52ca35aa8333d7650d543713
cmii-uav-emergency 4.2.0-snapshot master-4.1.0 af49131505b2b847e929f8e206f0cea517722ca6
cmii-uav-platform-open 3.1.1-snapshot feature/UAVCLOUD-10496-docUpdate c542df7cba9330d59f30e132b7f0151d43c171c1
cmii-admin-user 5.2.0-beta staging d61b01d77dd52754444b29098aba0dbc6a481331
cmii-uav-flight-monitor 5.2.0-snapshot feature/UAVCLOUD-25312-airspace 90c7b123f9fac629f3a6955b89a7a6af17464a5e
cmii-uav-platform-qinghaitourism 4.1.3-snapshot feature/UAVCLOUD-21377 2250c10b9622151f4f9f26727e8354e988334098
cmii-app-release 4.2.1-snapshot feature/UAVCLOUD-20006 08f9ef373be9534cb636e3cc33d0138746dcb554
cmii-uav-platform-scanner 4.2.0-snapshot uav 88029f5e53a5871f538485b909d68cc19c8bec15
cmii-uav-gateway 4.1.6-beta staging bdcdf85720bd1da671bdb55e80f2192968d98633
cmii-uav-platform-security 4.0.5-beta staging cc4882e93a30d42550cf4a81bfefdf6dc987e17d
cmii-uav-gis-server 5.2.0-test staging d96979e36f3314d8f6d40a859d562c3af3010d48
cmii-omoc-gateway 2.2.0-snapshot
cmii-uav-platform-security-application 3.0.0-snapshot feature/UAVCLOUD-12431-ai 7f5e1c1fdbb2b642434f04ae3040bdf8248cf751
cmii-uav-grid-datasource 4.2.0-validation hotfix/UAVCLOUD-9999-zbkh 9d69803e8c25bded4eb98e64a9400855ff4fbd84
cmii-omoc-process 2.2.0-snapshot d62b42860bac854b37be2b65d8f83e8326fc70f2
cmii-uav-platform-securityh5 4.1.6-test hotfix/UAVCLOUD-21143-polyline 5304b32c9fbbc337e054246357abbe2c02c261ab
cmii-uav-grid-engine 4.1.1-snapshot feature/UAVCLOUD-14566-grid 58ebc8b600766bdfed45da7c9e58f1f6e7c6d5cc
cmii-omoc-user 2.2.0-snapshot 559889a8f12811e11cf793b6223dc5aa7fa57ea7
cmii-uav-platform-share 4.1.1-validation feature/UAVCLOUD-20073 4e9634f6107ea2cc6108f46269bd7afcd605dfc8
cmii-uav-grid-manage 5.2.0-validation hotfix/UAVCLOUD-24536 62b9bb905076113643e0fadc27e856bbd73698ac
cmii-open-gateway 4.0.6-snapshot feature/staging-2021.0.4 267d2628a3dde0c5e0d5d27bc20f6e646ff8e361
cmii-uav-platform-sky-center 2.1.14-beta
cmii-uav-grid-surveilliance 4.1.1-snapshot feature/UAVCLOUD-14566-grid 8f183887eaef2739e86464674cb73df6888334b1
cmii-suav-platform-airspace 4.1.1-snapshot feature/UAVCLOUD-20410 319f2c4cca9138644a21a3728673bce94aea89f9
cmii-uav-industrial-portfolio 4.2.0-snapshot feature/UAVCLOUD-22062-lnglat 200097986286388014fc9ca838ad2f7e31fe201c
cmii-suav-platform-supervision 5.2.0-snapshot master-5.0.0 bb2ae825fc464979679d0244f195f20d79c68b93
cmii-uav-platform-smauth 4.2.0-snapshot uav bed805d9f1a523d15379fb331ddf128d93133f4a
cmii-suav-platform-supervisionh5 4.0.5-test master 67eeca65a47e64cccfcba1baaf925dd5dd9f9ea2
cmii-uav-integration 5.2.0-snapshot feature/UAVCLOUD-25939 b92afe9e8bca866599da4eee969c9cc12ac38cde
cmii-uav-platform-smsecret 4.2.0-snapshot uav 69d6d2497b5b29c7a4390119029aed61b653e734
cmii-suav-supervision 5.2.0-snapshot feature/UAVCLOUD-25312-airspace fc3faaf475706cf3c7f85adad963a144315c6019
cmii-uav-kpi-monitor 4.0.2-validation hotfix/UAVCLOUD-18642-format15 798df910ffc0ed84fd98d94d6c6e2404693630d9
cmii-uav-platform-splice 4.1.2-snapshot feature/UAVCLOUD-20939 c235350212bf2359d550faecab78ff02047bca37
cmii-uav-logger 5.2.0-snapshot bugfix/UAVCLOUD-25682-update 1395a816465a16acec2b5505a7826a4bc51a1cc9
cmii-uav-airspace 4.2.0-snapshot feature/UAVCLOUD-22062 d97d1ed736a7fd6be734c6056fedbe04b733b16f
cmii-uav-material-warehouse 4.2.0-snapshot feature/UAVCLOUD-24157 78f2c3c4142b3a63a921028900e474a2731268d9
cmii-uav-alarm 5.2.0-beta bugfix/UAVCLOUD-24837 89742b8878aa831ad2dc2778f6435dcfa0e721ea
cmii-uav-platform-threedsimulation 5.2.0-snapshot feature/UAVCLOUD-21392 d82cc5411455cd25719307b1d1afeb1b55a10b85
cmii-uav-autowaypoint 4.0.4-beta staging 6def0f0d812384a9a397910a66c734f5eff9b7df
cmii-uav-blockchain 4.1.1-beta staging 9821072bd8b7c64d01c218c20c8755030f429774
cmii-uav-mission 5.2.0-beta staging dcdb95583880d9a83fe1a15ec3b400642ea47bcc
cmii-uav-platform-visualization 3.1.0-snapshot hotfix/UAVCLOUD-14310-model ac857696ec158ce45f8d035fc40403ef4713949e
cmii-uav-brain 5.2.0-snapshot feature/UAVCLOUD-25815-humanAttr 5b14feb88d15cce567c64b084b6fffeff9edb4f5
cmii-uav-mqtthandler 5.2.0-snapshot bugfix/UAVCLOUD-26069 6c9e2741fdd5d2006680679adfdbfe67cb26a2a4
cmii-uav-process 5.2.0-beta staging 3c2b08723ff456cfaa2ed42c2e85179584967721
cmii-uav-cloud-live 5.2.0-snapshot feature/UAVCLOUD-20550-twoline 8b6f12f6bbbeae115fc3a7d875fc881fe089ab32
cmii-uav-multilink 5.2.0-snapshot feature/UAVCLOUD-24456 b197703aed380ecbfcd75f37b06f4e4fa5aa1596
cmii-uav-notice 5.2.0-beta staging 7b467002f601ac2fb52a4a6251ccb2cbd0a1897c
cmii-uav-clusters 3.3.0-beta staging 83a5721fee245ad763e615b17789958661625c86
cmii-uav-oauth 5.2.0-beta staging cc533eeab630a4ae09dd3f1117a7ec920d63a689
cmii-uav-security-system 4.0.7-snapshot feature/UAVCLOUD-20322 6d68c5756c8e427d8af78ee3062b1f9d933fb81b
cmii-uav-cms 4.2.0-test staging 66c9e71bb700d2a0fcb21833d3940b0f1e7fd65e
cmii-uav-container-scanner 4.1.6-beta staging ac3f5139685aad1e6a64002a92435e30a8dbe2a2
cmii-uav-surveillance 5.2.0-validation hotfix/UAVCLOUD-25939-qiyun 85acee2dd09fd89f3b0e500b2605246afefc0f7d
cmii-uav-container-scanner-go 3.2.5-beta staging c912863ead095d67bd1cf6940a2b8435354adb95
cmii-uav-threedsimulation 5.2.0-snapshot feature/UAVCLOUD-21392 1842c45b32b09f89859b429fb7ab015bf582bad2
cmii-uav-tower 4.1.6-snapshot feature/UAVCLOUD-21941 8c8a7cb852d92425ce7331d11d28d7a335fe683b
cmii-uav-user 5.2.0-beta staging 644ab2483ca585f3da021b1c07cd5e31a57b3c6c
cmii-uav-waypoint 5.2.0-beta staging 9b7b022ba3466063120747c73b6e442b01b02e13
helm-vms-deploy v1.0.0
tcp-server-boot 4.2.0-snapshot uav 8e676f4ede0e69ccadff618ace15c7025155d2e9
uav-auth-backend 4.2.0-snapshot uav 3832f2197f1e18a08cd40645261ba1988435b708
uav-secret-backend 4.2.0-snapshot uav b20f192faec3d32fd5234b61b1608709ed52253b
uav-tcp-server 4.2.0-snapshot uav 96c6529bb59d883b77461a0f416e08f86bcc7f4f
uavms-lowaltitude-platform 5.2.0-snapshot feature/LAIN05A-12 bf4b2a3700e680aff9be2aa0b3a4d1d99e94368f

View File

@@ -0,0 +1,87 @@
cmii-uav-onesupport 4.1.5-snapshot feature/UAVCLOUD-22088-productmanage 05c9c22e51ad576854bf6e39e678f5a91ee82df8
cmii-uav-platform 5.2.0-beta staging b933b42ea0a73da732b6821c415ef3192d83c0ae
cmii-uav-platform-ai-brain 4.2.0-test hotfix/UAVCLOUD-24267-lock acf0c717e29bce14e3d876f0162c4ed8329afe30
cmii-uav-platform-blockchain 4.0.7-beta staging 9939688adbfda2deec323fe90ae2ac1ac2ca39b3
cmii-uav-platform-classification 4.0.7-beta staging 35b19855be11f60e2ba4b5ff8837f965204fcda7
cmii-uav-platform-cms-portal 4.0.5-beta staging 87d1f00040714d7c40732d86d0e065b45bcdd13d
cmii-uav-platform-detection 4.1.3-test master 1758281702456b7dfccd0cba944dd5065d7d67cd
cmii-uav-platform-free 3.1.0-validation PR-5 a90309ab276f3b11a3c412b7006472bbe7ccef01
cmii-uav-platform-free-application 3.1.0-validation PR-4 7a86cdae728f805b3d908153b34e7cc0d299ad5b
cmii-uav-platform-hyperspectral 2.1.14-beta
cmii-uav-platform-lowdetection-application 3.1.2-snapshot feature/UAVCLOUD-14610-cms ed703d4a83f8e73763a2771bdc54ffa9d9e5f2e5
cmii-uav-platform-media 4.0.5-beta staging c416428614691fcbc356f6e0f0bec4da75ae2b80
cmii-uav-platform-multiterminal 4.1.5-snapshot feature/UAVCLOUD-21942 b2eea37a57866569be34be28d4f4636f025a1f80
cmii-uav-platform-mws 3.0.0-snapshot bugfix/UAVCLOUD-12219-download b317150f2104e986246f88747a2415c07b66aee2
cmii-uav-platform-omoc-uav 2.2.0-snapshot
cmii-uav-platform-oms 5.2.0-beta staging af8e22c36643cec7de5a02e9a6ceb9fd2221bf7a
cmii-uav-platform-open 3.1.1-snapshot feature/UAVCLOUD-10496-docUpdate c542df7cba9330d59f30e132b7f0151d43c171c1
cmii-uav-platform-qinghaitourism 4.1.3-snapshot feature/UAVCLOUD-21377 2250c10b9622151f4f9f26727e8354e988334098
cmii-uav-platform-scanner 4.2.0-snapshot uav 88029f5e53a5871f538485b909d68cc19c8bec15
cmii-uav-platform-security 4.0.5-beta staging cc4882e93a30d42550cf4a81bfefdf6dc987e17d
cmii-uav-platform-security-application 3.0.0-snapshot feature/UAVCLOUD-12431-ai 7f5e1c1fdbb2b642434f04ae3040bdf8248cf751
cmii-uav-platform-securityh5 4.1.6-test hotfix/UAVCLOUD-21143-polyline 5304b32c9fbbc337e054246357abbe2c02c261ab
cmii-uav-platform-share 4.1.1-validation feature/UAVCLOUD-20073 4e9634f6107ea2cc6108f46269bd7afcd605dfc8
cmii-uav-platform-sky-center 2.1.14-beta
cmii-uav-data-classification 4.0.7-beta staging ff73639c9e869601df07fa6c2189dcccf286151b
cmii-uav-data-post-process 5.2.0-beta staging 6046e17925b43b573e416b2c004f005f5dcf6695
cmii-uav-depotautoreturn 12345678 feature/depot d7339662569fb4958b50200a625b3cd059f79acc
cmii-uav-developer 4.2.0-test feature/staging-2021.0.4 c9d6168640a2f62559588639b11f39f7ad377d83
cmii-uav-device 5.2.0-validation hotfix/LAIN05A-12-utmiss 19ac70b26a34ce432b8f5b88d4ecc5851531a4c9
cmii-uav-emergency 4.2.0-snapshot master-4.1.0 af49131505b2b847e929f8e206f0cea517722ca6
cmii-uav-flight-monitor 5.2.0-snapshot feature/UAVCLOUD-25312-airspace 90c7b123f9fac629f3a6955b89a7a6af17464a5e
cmii-uav-gateway 4.1.6-beta staging bdcdf85720bd1da671bdb55e80f2192968d98633
cmii-uav-gis-server 5.2.0-test staging d96979e36f3314d8f6d40a859d562c3af3010d48
cmii-admin-data 5.2.0-beta staging 378998cb81c98afc29ff327419e9449907a210d5
cmii-uav-grid-datasource 4.2.0-validation hotfix/UAVCLOUD-9999-zbkh 9d69803e8c25bded4eb98e64a9400855ff4fbd84
cmii-uav-platform-smauth 4.2.0-snapshot uav bed805d9f1a523d15379fb331ddf128d93133f4a
cmii-uav-grid-engine 4.1.1-snapshot feature/UAVCLOUD-14566-grid 58ebc8b600766bdfed45da7c9e58f1f6e7c6d5cc
cmii-uav-platform-smsecret 4.2.0-snapshot uav 69d6d2497b5b29c7a4390119029aed61b653e734
cmii-uav-grid-manage 5.2.0-validation hotfix/UAVCLOUD-24536 62b9bb905076113643e0fadc27e856bbd73698ac
cmii-uav-platform-splice 4.1.2-snapshot feature/UAVCLOUD-20939 c235350212bf2359d550faecab78ff02047bca37
cmii-admin-gateway 4.1.5-beta staging a2b54b40dd5606ae52ca35aa8333d7650d543713
cmii-uav-grid-surveilliance 4.1.1-snapshot feature/UAVCLOUD-14566-grid 8f183887eaef2739e86464674cb73df6888334b1
cmii-uav-platform-threedsimulation 5.2.0-snapshot feature/UAVCLOUD-21392 d82cc5411455cd25719307b1d1afeb1b55a10b85
cmii-uav-platform-visualization 3.1.0-snapshot hotfix/UAVCLOUD-14310-model ac857696ec158ce45f8d035fc40403ef4713949e
cmii-uav-industrial-portfolio 4.2.0-snapshot feature/UAVCLOUD-22062-lnglat 200097986286388014fc9ca838ad2f7e31fe201c
cmii-uav-process 5.2.0-beta staging 3c2b08723ff456cfaa2ed42c2e85179584967721
cmii-uav-integration 5.2.0-snapshot feature/UAVCLOUD-25939 b92afe9e8bca866599da4eee969c9cc12ac38cde
cmii-uav-security-system 4.0.7-snapshot feature/UAVCLOUD-20322 6d68c5756c8e427d8af78ee3062b1f9d933fb81b
cmii-uav-surveillance 5.2.0-validation hotfix/UAVCLOUD-25939-qiyun 85acee2dd09fd89f3b0e500b2605246afefc0f7d
cmii-uav-kpi-monitor 4.0.2-validation hotfix/UAVCLOUD-18642-format15 798df910ffc0ed84fd98d94d6c6e2404693630d9
cmii-uav-threedsimulation 5.2.0-snapshot feature/UAVCLOUD-21392 1842c45b32b09f89859b429fb7ab015bf582bad2
cmii-uav-logger 5.2.0-snapshot bugfix/UAVCLOUD-25682-update 1395a816465a16acec2b5505a7826a4bc51a1cc9
cmii-uav-tower 4.1.6-snapshot feature/UAVCLOUD-21941 8c8a7cb852d92425ce7331d11d28d7a335fe683b
cmii-uav-material-warehouse 4.2.0-snapshot feature/UAVCLOUD-24157 78f2c3c4142b3a63a921028900e474a2731268d9
cmii-uav-mission 5.2.0-beta staging dcdb95583880d9a83fe1a15ec3b400642ea47bcc
cmii-uav-user 5.2.0-beta staging 644ab2483ca585f3da021b1c07cd5e31a57b3c6c
cmii-admin-user 5.2.0-beta staging d61b01d77dd52754444b29098aba0dbc6a481331
cmii-uav-mqtthandler 5.2.0-snapshot bugfix/UAVCLOUD-26069 6c9e2741fdd5d2006680679adfdbfe67cb26a2a4
cmii-uav-waypoint 5.2.0-beta staging 9b7b022ba3466063120747c73b6e442b01b02e13
cmii-uav-multilink 5.2.0-snapshot feature/UAVCLOUD-24456 b197703aed380ecbfcd75f37b06f4e4fa5aa1596
cmii-uav-notice 5.2.0-beta staging 7b467002f601ac2fb52a4a6251ccb2cbd0a1897c
cmii-app-release 4.2.1-snapshot feature/UAVCLOUD-20006 08f9ef373be9534cb636e3cc33d0138746dcb554
helm-vms-deploy v1.0.0
tcp-server-boot 4.2.0-snapshot uav 8e676f4ede0e69ccadff618ace15c7025155d2e9
uav-auth-backend 4.2.0-snapshot uav 3832f2197f1e18a08cd40645261ba1988435b708
cmii-omoc-gateway 2.2.0-snapshot
uav-secret-backend 4.2.0-snapshot uav b20f192faec3d32fd5234b61b1608709ed52253b
cmii-uav-oauth 5.2.0-beta staging cc533eeab630a4ae09dd3f1117a7ec920d63a689
uav-tcp-server 4.2.0-snapshot uav 96c6529bb59d883b77461a0f416e08f86bcc7f4f
cmii-omoc-process 2.2.0-snapshot d62b42860bac854b37be2b65d8f83e8326fc70f2
cmii-omoc-user 2.2.0-snapshot 559889a8f12811e11cf793b6223dc5aa7fa57ea7
cmii-open-gateway 4.0.6-snapshot feature/staging-2021.0.4 267d2628a3dde0c5e0d5d27bc20f6e646ff8e361
uavms-lowaltitude-platform 5.2.0-snapshot feature/LAIN05A-12 bf4b2a3700e680aff9be2aa0b3a4d1d99e94368f
cmii-suav-platform-airspace 4.1.1-snapshot feature/UAVCLOUD-20410 319f2c4cca9138644a21a3728673bce94aea89f9
cmii-suav-platform-supervision 5.2.0-snapshot master-5.0.0 bb2ae825fc464979679d0244f195f20d79c68b93
cmii-suav-platform-supervisionh5 4.0.5-test master 67eeca65a47e64cccfcba1baaf925dd5dd9f9ea2
cmii-suav-supervision 5.2.0-snapshot feature/UAVCLOUD-25312-airspace fc3faaf475706cf3c7f85adad963a144315c6019
cmii-uav-airspace 4.2.0-snapshot feature/UAVCLOUD-22062 d97d1ed736a7fd6be734c6056fedbe04b733b16f
cmii-uav-alarm 5.2.0-beta bugfix/UAVCLOUD-24837 89742b8878aa831ad2dc2778f6435dcfa0e721ea
cmii-uav-autowaypoint 4.0.4-beta staging 6def0f0d812384a9a397910a66c734f5eff9b7df
cmii-uav-blockchain 4.1.1-beta staging 9821072bd8b7c64d01c218c20c8755030f429774
cmii-uav-brain 5.2.0-snapshot feature/UAVCLOUD-25815-humanAttr 5b14feb88d15cce567c64b084b6fffeff9edb4f5
cmii-uav-cloud-live 5.2.0-snapshot feature/UAVCLOUD-20550-twoline 8b6f12f6bbbeae115fc3a7d875fc881fe089ab32
cmii-uav-clusters 3.3.0-beta staging 83a5721fee245ad763e615b17789958661625c86
cmii-uav-cms 4.2.0-test staging 66c9e71bb700d2a0fcb21833d3940b0f1e7fd65e
cmii-uav-container-scanner 4.1.6-beta staging ac3f5139685aad1e6a64002a92435e30a8dbe2a2
cmii-uav-container-scanner-go 3.2.5-beta staging c912863ead095d67bd1cf6940a2b8435354adb95

View File

@@ -0,0 +1,83 @@
cmii-admin-data 5.2.0-beta staging e9268573ee02256e63d0e34102c8c9880c55d321
cmii-admin-gateway 5.2.0-beta staging 481260f79b5dd431abd19aaa57cdf020085ca73a
cmii-admin-user 5.2.0-beta staging d61b01d77dd52754444b29098aba0dbc6a481331
cmii-app-release 4.2.0-beta staging c71f49b4df189d2739a8a04fbfdb2dd8ffbe3dbd
cmii-open-gateway 5.2.0-beta staging c63f8916765d0e1fd3bc4492c77e6ae30d43a435
cmii-suav-platform-airspace 3.3.3-beta staging e1bdf97da8622856c6acdeb4f24be506bd3765b0
cmii-suav-platform-airspaceh5 4.0.0-beta staging 15a8ba2ed847c3d4e9643527ccf30a2d0272f6ab
cmii-suav-platform-supervision 5.2.0-beta staging d24b75d7bff6680dd2aaaa68f72e46a3b47d52f9
cmii-suav-platform-supervisionh5 4.2.0-beta staging fab077aafc76473a5a0f882c4c327e84cc39f2a5
cmii-suav-supervision 5.2.0-011901 feature/UAVCLOUD-25312-airspace 6630fed8cd8f5eccbd74e6a2232272f00869d523
cmii-uav-airspace 5.2.0-beta staging c689828e9c8eb153e4790ebc7f8a0c5ba3eb3416
cmii-uav-container-scanner 3.2.3-integration staging 1992408799f1e1ecc52483f83fc97c2cf6e09e4b
cmii-uav-alarm 5.2.0-beta staging 9198d54bd342bdc95033e20f34a62d97ec8a51a5
cmii-uav-autowaypoint 4.0.3-beta staging 47f4a70ce04cb3432a519d5d289b141f40c278d1
cmii-uav-data-post-process 4.1.5-beta staging 802db31cf7075d0216e4604b6324a40f92bb2c8b
cmii-uav-bitbucket 3.3.3-onetools staging 9dbb8018d443e05cddf3b8a45fd4e357a2168bbc
cmii-uav-depotautoreturn 4.1.6-beta staging 42bd8679bb110f22c9e16359e5c4376cf4d99912
cmii-uav-bitbucket0 2.2.0-beta
cmii-uav-developer 5.2.0-beta staging 47b0765274aa052d38b2a9c9f4aa3e50c321e802
cmii-uav-blockchain 3.2.4-beta staging 59e50fe679b0ab7ae18686ee48e6735a954f993a
cmii-uav-device 5.2.0-beta staging d8da3ffa32b9aa30d4c79421cf439efdeb9e1fb2
cmii-uav-brain 3.2.5-validation PR-169 f3676c37594157b7c5790d3b573b688453829a12
cmii-uav-emergency 4.1.6-beta staging 07019d87c5deb081f007130106253b581315cbcd
cmii-uav-cloud-live 5.2.0-beta staging e5ff34d3b086e801fa267e868934b5d17e9b5631
cmii-uav-flight-monitor 5.2.0-beta master-5.3.0-jcwg 380aaff7b0b73cdcd96fedab39cd653185e4d528
cmii-uav-cluster-agents 3.2.4
cmii-uav-clusters 2.2.0-beta staging fda468a6cc88d61d6b8cddbc13349eaba3dd5a9e
cmii-uav-gateway 5.2.0-beta staging 4c7d96c9d7b139bb8e4e3c00d5e102a06a20f4bc
cmii-uav-gis-server 5.2.0-beta master-5.3.0-jcwg 40a249e6f4d74c3114a2cd30018285c15cede769
cmii-uav-cms 4.2.0-beta staging 66c9e71bb700d2a0fcb21833d3940b0f1e7fd65e
cmii-uav-grid-datasource 4.2.0-beta staging 0bc819ef97cba4e269f39b1a9a4005c7fba212b6
cmii-uav-grid-engine 4.1.2-beta staging 0082f028d46baed21f06424d9a1b54ddff9eeef1
cmii-uav-grid-manage 4.1.2-beta staging 2bd7ab52f25c6f155576cb664700286436b0c48d
cmii-uav-hyperspectral-consumer 2.1.14-beta
cmii-uav-hyperspectral-provider 2.1.14-beta
cmii-uav-industrial-portfolio 5.2.0-beta staging 6aa56006f338af2d7a72a46bfa8bd86423f2439c
cmii-uav-integration 5.2.0-beta staging ba280a455fc81086f5b924755ad8e8a54295cf2b
cmii-uav-kpi-monitor 3.2.3-integration staging 6a5efc4edfb4b015724b1ac6f738ecad18b30648
cmii-uav-notice 5.2.0-beta staging 79a608fd4a9ec5fab509bb9dbb04fb81ef6423ea
cmii-uav-logger 4.2.0-beta staging 1005949e2ffc21d41846bffcf87e7dbac24ae84a
cmii-uav-material-warehouse 5.2.0-mr51 staging 19d16d50a6e1c9623c6173de8c0403c466d21a76
cmii-uav-oauth 5.2.0-beta staging cf4f2c348b0e938a88c0510574417e82f9e1bda3
cmii-uav-mission 5.2.0-beta bugfix/UAVCLOUD-23884 dbf36dc5809af26fcba92076e5d902825aef7f3a
cmii-uav-platform 5.2.0-beta staging b933b42ea0a73da732b6821c415ef3192d83c0ae
cmii-uav-mqtthandler 5.2.0-beta staging dc46def7450cc870a11c3235e21b76fb4790a5b2
cmii-uav-platform-ai-brain 3.2.5-beta staging 076c7dfa104da6f1b15d7783765d708c508bb865
cmii-uav-multilink 5.2.0-beta staging 03a860e6cc85bf01755c649b1e95423049d92568
cmii-uav-platform-one-tools 3.2.3-integration staging 62db785518d54daffdeabda5724411e288463410
cmii-uav-platform-open 4.1.1-beta staging 2134b51e98e0b940f5f24122629c360acffb138b
cmii-uav-platform-airspacesupervision 5.2.0-beta staging d16e37940fe1a18560fcb402af07c8dea9039411
cmii-uav-platform-pilot 5.2.0-beta staging 85ab2be9cbd752252246a2af27cb716332929ddd
cmii-uav-platform-armypeople 5.2.0-beta staging c51fa3e02ab85df10d2c1d648615e6ec0020254a
cmii-uav-platform-security 4.0.6-beta staging d733c565c1f3550641c501113a24340005d551d4
cmii-uav-platform-base 3.2.5-beta staging 652bd64f5504323c8b483938082b732f2b6e642f
cmii-uav-platform-security-application 3.1.0-beta staging f66c8d24e2dce74e4f5ee4feb25532ad1a7d6fb5
cmii-uav-platform-cms 3.1.0-integration staging 57ecf9bd80958f23e9bdda782b45aa96b733e65e
cmii-uav-platform-cms-portal 4.2.0-beta staging 0f3abab36b94ee3a3383248283aec510569080cb
cmii-uav-platform-security-screen 3.2.3-integration staging da26a0d777a3444c2ab90ed9a86d7de4018ae273
cmii-uav-platform-detection 5.2.0-beta staging 33b38a0f9468ce2474e3933bf8bb2096629fa20a
cmii-uav-platform-securityh5 4.1.6-beta staging c464d71e8306b9de4dbe4e713295a933820f44d1
cmii-uav-platform-emergency-rescue 3.2.3-integration staging ac0e1051ee06d154b9f8983e776f9cdc7ca23804
cmii-uav-platform-seniclive 4.0.6-beta staging d931c525e53cabcdac84d3e0554c95ded8c9417b
cmii-uav-platform-emergency-screen 3.0.0-beta staging 42d17f35159adb0cf4c7ada7a8a99465b91a3df0
cmii-uav-platform-share 5.2.0-beta staging 53ed4d78dd711cf0dc0c5f266ae0f11e7464f651
cmii-uav-platform-free 3.1.2-beta staging f6dcd7834319a579b6912bbce2c3cd8f4db52925
cmii-uav-platform-sky-center 3.2.3-integration staging ae02d11262a9f5670799ec214de86a2bedf8d538
cmii-uav-platform-hyperspectral 2.2.2-integration
cmii-uav-platform-livestream 4.0.5-beta staging a4c6cc08b7c13c5d31e64ef8c2c4ab2007f81841
cmii-uav-platform-splice 4.1.4-beta staging b29b010eb71a563df25b6785a9b18d05686b30cc
cmii-uav-platform-visualization 3.0.0-beta staging d53a344e85aa91a7b7e746deb62a3ad26ad3aceb
cmii-uav-platform-logistic-application 3.1.2-beta staging 8a201fd9481d4ba333060213979000b1ef563aed
cmii-uav-process 5.2.0-beta staging 433bbe716b3b7aa3be368eacd825b510e608f9ff
cmii-uav-platform-logistics 3.2.3-integration staging 7e2cca65b4768e18782d664b3028f022bfd494af
cmii-uav-surveillance 5.2.0-beta staging b68854b932a704233b861e05544fcbee72544fce
cmii-uav-platform-lowdetection-application 3.1.0-beta staging 7f57ca15cf94949567a14b02843dcc03e955bf7b
cmii-uav-tower 4.2.0-beta staging f35f171d4f0d015c0369b3f2b14b291264d84ac3
cmii-uav-platform-media 4.0.6-beta staging 4ba86f8f6eccf39210d36495fd2159ee64826dbe
cmii-uav-user 5.2.0-beta staging 53a3ca893aaf4d81f4564ed52666c7acf5a657c7
cmii-uav-platform-multiterminal 4.1.5-beta staging 59aaf38298c1b2889a40db9a50b6a2f8c07afab2
cmii-uav-waypoint 5.2.0 feature/UAVCLOUD-22973-updateKMZ 86c3fbee7d035b202a0699464dd6cb0e8d386b9e
cmii-uav-platform-mws 4.0.2-beta staging a36865e1113ac9c8e73498e72bb8d0b31abffd70
cmii-uav-platform-oms 5.2.0-beta staging 4002c73e56521d0dd10b822d40f6971853b4f36b
helm-vms-deploy v1.0.0

View File

@@ -0,0 +1,301 @@
2024-04-18-17-20-00 uavcloud-demo cmii-uav-integration 5.5.0 5.5.0-0418
2024-04-19-09-30-00 uavcloud-demo cmii-uav-platform-open 5.5.0 5.5.0-0419
2024-04-22-09-18-00 uavcloud-demo cmii-uav-airspace 5.5.0 5.5.0-0422
2024-04-22-14-20-00 uavcloud-demo cmii-uav-airspace 5.5.0-0422 5.5.0-042201
2024-04-22-16-57-00 uavcloud-demo cmii-uav-airspace 5.5.0-042201 5.5.0-042202
2024-04-23-09-27-00 uavcloud-demo cmii-uav-device 5.5.0 5.5.0-042301
2024-04-23-11-15-00 uavcloud-demo cmii-uav-platform 5.5.0 5.5.0-042301
2024-04-23-11-17-00 uavcloud-demo cmii-suav-platform-supervision 5.5.0 5.5.0-042301
2024-04-23-16-28-06 uavcloud-dev cmii-suav-platform-supervision 5.2.0-test 5.5.0-042301
2024-04-23-17-35-00 uavcloud-dev cmii-uav-platform-armypeople 5.5.0-validation 5.5.0-042301
2024-04-23-17-36-00 uavcloud-demo cmii-uav-platform-armypeople 5.5.0-042201 5.5.0-042301
2024-04-24-12-00-00 uavcloud-demo cmii-uav-platform 5.5.0-042301 5.5.0-042401
2024-04-24-12-00-07 uavcloud-demo cmii-uav-airspace 5.5.0-042202 5.5.0-042401
2024-04-24-12-01-47 uavcloud-demo cmii-uav-industrial-portfolio 5.5.0-042201 5.5.0-042401
2024-04-24-12-03-14 uavcloud-demo cmii-uav-surveillance 5.5.0 5.5.0-042401
2024-04-24-17-30-00 uavcloud-demo cmii-uav-platform 5.5.0-042401 5.5.0-042402
2024-04-24-17-30-07 uavcloud-demo cmii-uav-cloud-live 5.5.0 5.5.0-042401
2024-04-24-17-31-51 uavcloud-demo cmii-uav-mission 5.5.0 5.5.0-042401
2024-04-25-09-36-00 uavcloud-demo cmii-uav-platform 5.5.0-042402 5.5.0-042501
2024-04-25-09-37-12 uavcloud-demo cmii-uav-industrial-portfolio 5.5.0-042401 5.5.0-042501
2024-04-25-17-42-00 uavcloud-demo cmii-uav-platform 5.5.0-042501 5.5.0-042503
2024-04-25-17-42-06 uavcloud-demo cmii-uav-platform-splice 5.5.0 5.5.0-042501
2024-04-25-17-45-00 uavcloud-demo cmii-uav-data-post-process 5.5.0 5.5.0-042501
2024-04-26-17-55-00 uavcloud-demo cmii-uav-platform-splice 5.5.0-042501 5.5.0-042601
2024-04-28-12-03-00 uavcloud-demo cmii-uav-platform-cms-portal 5.5.0 5.5.0-042801
2024-04-28-12-03-05 uavcloud-demo cmii-uav-platform 5.5.0-042503 5.5.0-042801
2024-04-28-12-03-10 uavcloud-demo cmii-uav-platform-oms 5.5.0 5.5.0-042801
2024-04-28-12-03-13 uavcloud-demo cmii-uav-user 5.5.0 5.5.0-042801
2024-04-29-11-25-00 uavcloud-demo cmii-uav-platform 5.5.0-042801 5.5.0-042901
2024-04-29-12-08-01 uavcloud-demo cmii-uav-mqtthandler 5.5.0 5.5.0-042901
2024-04-29-12-13-03 uavcloud-demo cmii-uav-mission 5.5.0-042401 5.5.0-042901
2024-04-29-12-14-37 uavcloud-demo cmii-uav-surveillance 5.5.0-042401 5.5.0-042901
2024-04-29-12-14-38 uavcloud-demo cmii-uav-mqtthandler 5.5.0-042901 5.5.0
2024-04-29-17-36-00 uavcloud-demo cmii-uav-platform 5.5.0-042901 5.5.0-042903
2024-04-29-17-36-45 uavcloud-demo cmii-uav-industrial-portfolio 5.5.0-29353-042801 5.5.0-042901
2024-04-30-11-57-00 uavcloud-demo cmii-uav-platform 5.5.0-042903 5.5.0-043001
2024-04-30-17-22-52 uavcloud-demo cmii-uav-industrial-portfolio 5.5.0-042901 5.5.0-043001
2024-05-08-08-58-30 uavcloud-demo cmii-uav-industrial-portfolio 5.5.0-043001 5.5.0-050801
2024-05-14-15-42-00 uavcloud-demo cmii-uav-material-warehouse 5.6.0 5.6.0-051401
2024-05-14-15-49-27 uavcloud-demo cmii-uav-platform-uas 5.6.0 5.6.0-051401
2024-05-14-15-49-31 uavcloud-demo cmii-uav-platform-uasms 5.6.0 5.6.0-051401
2024-05-14-17-30-00 uavcloud-demo cmii-uav-platform 5.6.0 5.6.0-051401
2024-05-15-09-55-03 uavcloud-demo cmii-uav-platform 5.6.0-051401 5.6.0-mr830-051501
2024-05-16-18-13-14 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-051501 5.6.0-051601
2024-05-27-09-00-19 uavcloud-demo cmii-uav-platform-media 5.6.0 5.6.0-052701
2024-05-10-19-55-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0 5.6.0-051001
2024-05-13-18-30-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-sense 5.6.0-051301
2024-06-03-17-31-36 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-sense-052201 5.6.0-060301
2024-06-04-17-42-00 uavcloud-demo cmii-uav-data-post-process 5.6.0 5.6.0-060401
2024-06-05-17-45-00 uavcloud-demo cmii-uav-data-post-process 5.6.0-060401 5.6.0-060501
2024-06-05-17-46-29 uavcloud-demo cmii-uav-data-post-process 5.6.0-060501 5.6.0-060401
2024-06-05-17-48-21 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-060301 5.6.0-060501
2024-06-06-13-53-12 uavcloud-demo cmii-uav-process 5.6.0 5.6.0-060601
2024-06-06-13-59-14 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-060501 5.6.0-060601
2024-06-12-13-40-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061101 5.6.0-061201
2024-06-12-13-45-01 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061201 5.6.0-061101
2024-06-12-13-47-35 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061101 5.6.0-061201
2024-06-13-17-23-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061202 5.6.0-061302
2024-06-14-17-34-10 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061303 5.6.0-061401
2024-06-14-17-37-15 uavcloud-demo cmii-uas-lifecycle 5.6.0 5.6.0-061401
2024-06-14-17-42-34 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061401 5.6.0-061303
2024-06-14-17-45-15 uavcloud-demo cmii-uas-lifecycle 5.6.0-061401 5.6.0
2024-06-14-17-47-17 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061303 5.6.0-061401
2024-06-14-17-49-53 uavcloud-demo cmii-uas-lifecycle 5.6.0 5.6.0-061401
2024-06-18-09-13-18 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061602 5.6.0-061801
2024-06-19-10-45-45 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-061801 5.6.0-061901
2024-06-21-10-12-00 uavcloud-demo cmii-uav-platform-dispatchh5 5.6.0 5.6.0-0621
2024-06-21-12-12-00 uavcloud-demo cmii-uav-data-post-process 5.6.0-060401 5.6.0-062101
2024-06-21-12-13-32 uavcloud-demo cmii-uav-user 5.6.0 5.6.0-062102
2024-06-21-12-18-33 uavcloud-demo cmii-uav-user 5.6.0-062101 5.6.0
2024-06-21-17-05-00 uavcloud-demo cmii-uav-platform-dispatchh5 5.6.0-0621 5.6.0-062102
2024-06-21-17-05-05 uavcloud-demo cmii-uav-platform 5.6.0-0619 5.6.0-25263-ai-0621
2024-06-21-17-35-10 uavcloud-demo cmii-uav-platform 5.6.0-25263-ai-0621 5.6.0-25263-ai-062102
2024-06-24-09-25-00 uavcloud-demo cmii-uav-platform 5.6.0-25263-ai-062102 5.6.0-25263-ai-062401
2024-06-24-09-28-26 uavcloud-demo cmii-uav-platform 5.6.0-25263-ai-062401 5.6.0-25263-ai-062102
2024-06-24-15-46-49 uavcloud-demo cmii-uav-platform-dispatchh5 5.6.0-062102 5.6.0-062401
2024-06-24-17-32-00 uavcloud-demo cmii-uav-data-post-process 5.6.0-062101 5.6.0-062401
2024-06-25-11-40-00 uavcloud-demo cmii-uav-platform 5.6.0-25263-062401 5.6.0-25263-062501
2024-06-26-11-07-00 uavcloud-demo cmii-uav-platform-uas 5.6.0-0620 5.6.0-062601
2024-06-26-11-50-00 uavcloud-demo cmii-uav-airspace 5.6.0 5.6.0-062601
2024-06-26-11-50-04 uavcloud-demo cmii-uav-platform 5.6.0-25263-062501 5.6.0-0626
2024-06-26-17-40-00 uavcloud-demo cmii-uav-material-warehouse 5.6.0 5.6.0-062601
2024-06-26-17-45-01 uavcloud-demo cmii-uav-material-warehouse 5.6.0-062601 5.6.0
2024-06-26-17-45-02 uavcloud-demo cmii-uav-tower 5.5.0 5.6.0-062601
2024-06-26-17-54-00 uavcloud-demo cmii-uav-material-warehouse 5.6.0 5.6.0-062602
2024-06-27-17-30-00 uavcloud-demo cmii-uav-developer 5.6.0 5.6.0-062701
2024-06-27-17-31-28 uavcloud-demo cmii-uav-airspace 5.6.0-062601 5.6.0-062701
2024-07-01-09-37-00 uavcloud-demo cmii-uav-platform 5.6.0-0626 5.6.0-25263-0701
2024-07-01-17-50-00 uavcloud-demo cmii-uav-platform 5.6.0-0626 5.6.0-070101
2024-07-01-17-54-39 uavcloud-demo cmii-uav-platform 5.6.0-070101 5.6.0-0626
2024-07-01-18-12-13 uavcloud-demo cmii-uav-platform 5.6.0-0626 5.6.0-070101
2024-07-01-18-19-57 uavcloud-demo cmii-uav-platform 5.6.0-070101 5.6.0-0626
2024-07-03-11-37-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-sense-070103 5.6.0-070301
2024-07-11-11-33-03 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-sense-071001 5.6.0-071101
2024-07-11-11-38-04 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071101 5.6.0-sense-071001
2024-07-11-11-39-40 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-sense-071001 5.6.0-071101
2024-07-11-11-44-41 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071101 5.6.0-sense-071001
2024-07-11-14-08-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-sense-071001 5.6.0-071102
2024-07-04-17-35-00 uavcloud-demo cmii-uav-platform-share 5.6.0-0704 5.6.0-070401
2024-07-04-17-35-06 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-070301 5.6.0-070401
2024-07-04-17-36-38 uavcloud-demo cmii-uav-platform 5.6.0-070203 5.6.0-070401
2024-07-11-16-14-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071102 5.6.0-071103
2024-07-11-16-39-40 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071103 5.6.0-071104
2024-07-11-17-08-31 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071104 5.6.0-071105
2024-07-12-09-14-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071106 5.6.0-071201
2024-07-12-11-40-00 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071201 5.6.0-071202
2024-07-15-10-05-51 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071206 5.6.0-071501
2024-07-16-17-06-59 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071501 5.6.0-071601
2024-07-23-09-35-40 uavcloud-demo cmii-uas-lifecycle 5.7.0-snapshot 5.7.0-30403-072301
2024-07-23-10-53-00 uavcloud-demo cmii-uav-platform 5.7.0 5.7.0-29267-072301
2024-07-23-13-43-35 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-0723 5.7.0-31369-yunnan-072301
2024-07-23-15-18-56 uavcloud-demo cmii-uav-platform 5.7.0-29267-072301 5.7.0
2024-07-17-14-37-11 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071601 5.6.0-071701
2024-07-17-17-45-00 uavcloud-demo cmii-uav-platform 5.6.0-29267-0717 5.6.0-071701
2024-07-17-17-45-09 uavcloud-demo cmii-uas-lifecycle 5.6.0 5.6.0-30403-071701
2024-07-17-17-48-00 uavcloud-demo cmii-uav-platform 5.6.0-071701 5.6.0-071702
2024-07-18-10-05-00 uavcloud-demo cmii-uas-lifecycle 5.6.0-30403-071701 5.6.0-30403-071801
2024-07-18-17-17-58 uavcloud-demo cmii-uav-emergency 5.6.0-0704 5.7.0
2024-07-18-17-17-59 uavcloud-demo cmii-uav-gis-server 5.6.0 5.7.0
2024-07-18-17-18-00 uavcloud-demo cmii-uav-sense-adapter 5.6.0-0716 5.7.0
2024-07-18-17-18-02 uavcloud-demo cmii-open-gateway 5.6.0 5.7.0
2024-07-18-17-18-03 uavcloud-demo cmii-uav-cloud-live 5.6.0 5.7.0
2024-07-18-17-18-04 uavcloud-demo cmii-uav-mission 5.5.0-30015-061801 5.7.0
2024-07-18-17-18-06 uavcloud-demo cmii-uav-mqtthandler 5.6.0-30067-071604 5.7.0
2024-07-18-17-18-07 uavcloud-demo cmii-uav-alarm 5.6.0 5.7.0
2024-07-18-17-18-08 uavcloud-demo cmii-uav-material-warehouse 5.6.0-062602 5.7.0
2024-07-18-17-18-10 uavcloud-demo cmii-uav-integration 5.7.0-30015-29835-071601 5.7.0
2024-07-18-17-18-11 uavcloud-demo cmii-suav-supervision 5.6.0 5.7.0
2024-07-18-17-18-12 uavcloud-demo cmii-uav-airspace 5.6.0-0704 5.7.0
2024-07-18-17-18-14 uavcloud-demo cmii-uav-logger 5.6.0 5.7.0
2024-07-18-17-18-16 uavcloud-demo cmii-uav-threedsimulation 5.5.0 5.7.0
2024-07-18-17-18-18 uavcloud-demo cmii-admin-data 5.6.0 5.7.0
2024-07-18-17-18-19 uavcloud-demo cmii-uav-industrial-portfolio 5.6.0-071701 5.7.0
2024-07-18-17-18-20 uavcloud-demo cmii-uav-process 5.6.0-060601 5.7.0
2024-07-18-17-18-22 uavcloud-demo cmii-uav-surveillance 5.6.0-30015-070801 5.7.0
2024-07-18-17-18-23 uavcloud-demo cmii-uav-user 5.6.0-0704 5.7.0
2024-07-18-17-18-24 uavcloud-demo cmii-uav-developer 5.6.0-0708 5.7.0
2024-07-18-17-18-26 uavcloud-demo cmii-uav-data-post-process 5.6.0-062401 5.7.0
2024-07-18-17-18-27 uavcloud-demo cmii-admin-gateway 5.6.0 5.7.0
2024-07-18-17-18-29 uavcloud-demo cmii-uav-gateway 5.6.0-061202 5.7.0
2024-07-18-17-18-30 uavcloud-demo cmii-uav-waypoint 5.6.0 5.7.0
2024-07-18-17-18-31 uavcloud-demo cmii-admin-user 5.6.0 5.7.0
2024-07-18-17-18-33 uavcloud-demo cmii-uav-cms 5.5.0 5.7.0
2024-07-18-17-18-34 uavcloud-demo cmii-uav-device 5.6.0-0715 5.7.0
2024-07-18-17-18-36 uavcloud-demo cmii-uav-notice 5.6.0 5.7.0
2024-07-18-17-18-37 uavcloud-demo cmii-uav-oauth 5.6.0-0704 5.7.0
2024-07-18-17-18-38 uavcloud-demo cmii-uav-tower 5.6.0-062601 5.7.0
2024-07-18-17-18-40 uavcloud-demo cmii-uav-multilink 5.5.0 5.7.0
2024-07-18-17-18-41 uavcloud-demo cmii-uav-brain 5.5.0 5.7.0
2024-07-18-17-20-49 uavcloud-demo cmii-suav-platform-supervisionh5 5.6.0 5.7.0
2024-07-18-17-20-51 uavcloud-demo cmii-uav-platform-ai-brain 5.6.0 5.7.0
2024-07-18-17-20-52 uavcloud-demo cmii-uav-platform-cms-portal 5.6.0 5.7.0
2024-07-18-17-20-53 uavcloud-demo cmii-uav-platform-open 5.6.0-0704 5.7.0
2024-07-18-17-20-55 uavcloud-demo cmii-uav-platform-share 5.6.0 5.7.0
2024-07-18-17-20-56 uavcloud-demo cmii-suav-platform-supervision 5.6.0-0708 5.7.0
2024-07-18-17-20-57 uavcloud-demo cmii-uav-platform 5.6.0-071702 5.7.0
2024-07-18-17-20-58 uavcloud-demo cmii-uav-platform-armypeople 5.6.0-28028-071102 5.7.0
2024-07-18-17-21-00 uavcloud-demo cmii-uav-platform-media 5.6.0-0710 5.7.0
2024-07-18-17-21-02 uavcloud-demo cmii-uav-platform-mws 5.6.0 5.7.0
2024-07-18-17-21-04 uavcloud-demo cmii-uav-platform-oms 5.6.0 5.7.0
2024-07-18-17-21-05 uavcloud-demo cmii-uav-platform-securityh5 5.6.0 5.7.0
2024-07-18-17-26-40 uavcloud-demo cmii-uav-brain 5.7.0 5.5.0
2024-07-18-17-28-26 uavcloud-demo cmii-uav-multilink 5.7.0 5.5.0
2024-07-18-17-35-01 uavcloud-demo cmii-uas-lifecycle 5.6.0-30403-071801 5.6.0-30403-071802
2024-07-18-17-40-02 uavcloud-demo cmii-uas-lifecycle 5.6.0-30403-071802 5.6.0-30403-071801
2024-07-18-18-24-25 uavcloud-demo cmii-admin-data 5.7.0
2024-07-18-18-24-26 uavcloud-demo cmii-uav-gateway 5.7.0
2024-07-18-18-24-27 uavcloud-demo cmii-uav-tower 5.7.0
2024-07-18-18-24-29 uavcloud-demo cmii-uav-user 5.7.0
2024-07-18-18-24-30 uavcloud-demo cmii-open-gateway 5.7.0
2024-07-18-18-24-31 uavcloud-demo cmii-uav-data-post-process 5.7.0
2024-07-18-18-24-32 uavcloud-demo cmii-uav-oauth 5.7.0
2024-07-18-18-24-34 uavcloud-demo cmii-uav-sense-adapter 5.7.0
2024-07-18-18-24-35 uavcloud-demo cmii-admin-gateway 5.7.0
2024-07-18-18-24-36 uavcloud-demo cmii-admin-user 5.7.0
2024-07-18-18-24-38 uavcloud-demo cmii-uav-alarm 5.7.0
2024-07-18-18-24-40 uavcloud-demo cmii-uav-mission 5.7.0
2024-07-18-18-24-41 uavcloud-demo cmii-uav-notice 5.7.0
2024-07-18-18-24-42 uavcloud-demo cmii-uav-multilink 5.7.0
2024-07-18-18-24-43 uavcloud-demo cmii-uav-brain 5.7.0
2024-07-18-18-24-45 uavcloud-demo cmii-uav-developer 5.7.0
2024-07-18-18-24-46 uavcloud-demo cmii-uav-mqtthandler 5.7.0
2024-07-18-18-24-48 uavcloud-demo cmii-uav-process 5.7.0
2024-07-18-18-24-49 uavcloud-demo cmii-uav-threedsimulation 5.7.0
2024-07-18-18-24-50 uavcloud-demo cmii-uav-waypoint 5.7.0
2024-07-18-18-24-54 uavcloud-demo cmii-uav-airspace 5.7.0
2024-07-18-18-24-56 uavcloud-demo cmii-uav-material-warehouse 5.7.0
2024-07-18-18-24-58 uavcloud-demo cmii-suav-supervision 5.7.0
2024-07-18-18-25-00 uavcloud-demo cmii-uav-cms 5.7.0
2024-07-18-18-25-03 uavcloud-demo cmii-uav-emergency 5.7.0
2024-07-18-18-25-08 uavcloud-demo cmii-uav-gis-server 5.7.0
2024-07-18-18-25-14 uavcloud-demo cmii-uav-surveillance 5.7.0
2024-07-18-18-25-16 uavcloud-demo cmii-uav-cloud-live 5.7.0
2024-07-18-18-25-18 uavcloud-demo cmii-uav-device 5.7.0
2024-07-18-18-25-20 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0
2024-07-18-18-25-21 uavcloud-demo cmii-uav-integration 5.7.0
2024-07-18-18-25-23 uavcloud-demo cmii-uav-logger 5.7.0
2024-07-18-18-25-25 uavcloud-demo cmii-uav-platform-oms 5.7.0
2024-07-18-18-25-27 uavcloud-demo cmii-uav-platform-open 5.7.0
2024-07-18-18-25-28 uavcloud-demo cmii-uav-platform-securityh5 5.7.0
2024-07-18-18-25-29 uavcloud-demo cmii-suav-platform-supervision 5.7.0
2024-07-18-18-25-31 uavcloud-demo cmii-uav-platform-ai-brain 5.7.0
2024-07-18-18-25-32 uavcloud-demo cmii-uav-platform-armypeople 5.7.0
2024-07-18-18-25-34 uavcloud-demo cmii-uav-platform-media 5.7.0
2024-07-18-18-25-37 uavcloud-demo cmii-uav-platform-mws 5.7.0
2024-07-18-18-25-39 uavcloud-demo cmii-suav-platform-supervisionh5 5.7.0
2024-07-18-18-25-40 uavcloud-demo cmii-uav-platform 5.7.0
2024-07-18-18-25-42 uavcloud-demo cmii-uav-platform-cms-portal 5.7.0
2024-07-18-18-25-43 uavcloud-demo cmii-uav-platform-share 5.7.0
2024-07-18-18-28-00 uavcloud-demo cmii-uav-multilink 5.5.0
2024-07-18-18-30-21 uavcloud-demo cmii-uav-brain 5.5.0
2024-07-19-09-29-48 uavcloud-demo cmii-uav-platform-armypeople 5.7.0 5.7.0-29668-071901
2024-07-19-09-54-00 uavcloud-demo cmii-uav-platform-armypeople 5.7.0-29668-071901 5.7.0
2024-08-20-17-36-40 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-081901 5.7.0-31369-yunnan-082001
2024-08-21-11-03-00 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082001 5.7.0-31369-yunnan-082101
2024-08-21-14-50-50 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082101 5.7.0-31369-yunnan-082201
2024-08-21-14-55-15 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082201 5.7.0-31369-yunnan-082102
2024-08-21-17-07-00 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082102 5.7.0-31369-yunnan-082103
2024-08-21-17-35-40 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082103 5.7.0-31369-yunnan-082104
2024-08-22-17-32-28 uavcloud-demo cmii-uav-notice 5.7.0 5.8.0
2024-08-22-17-32-29 uavcloud-demo cmii-uav-oauth 5.7.0 5.8.0
2024-08-22-17-32-30 uavcloud-demo cmii-uav-user 5.7.0 5.8.0
2024-08-22-17-32-32 uavcloud-demo cmii-open-gateway 5.7.0 5.8.0
2024-08-22-17-32-33 uavcloud-demo cmii-uav-mission 5.7.0-29766-0815 5.8.0
2024-08-22-17-32-34 uavcloud-demo cmii-uav-developer 5.7.0-0725 5.8.0
2024-08-22-17-32-35 uavcloud-demo cmii-uav-emergency 5.7.0 5.8.0
2024-08-22-17-32-36 uavcloud-demo cmii-uav-gis-server 5.7.0 5.8.0
2024-08-22-17-32-37 uavcloud-demo cmii-uav-process 5.7.0 5.8.0
2024-08-22-17-32-39 uavcloud-demo cmii-admin-data 5.7.0 5.8.0
2024-08-22-17-32-40 uavcloud-demo cmii-suav-supervision 5.7.0 5.8.0
2024-08-22-17-32-41 uavcloud-demo cmii-uav-threedsimulation 5.7.0 5.8.0
2024-08-22-17-32-42 uavcloud-demo cmii-uav-tower 5.7.0 5.8.0
2024-08-22-17-32-43 uavcloud-demo cmii-uav-device 5.7.0 5.8.0
2024-08-22-17-32-44 uavcloud-demo cmii-uav-logger 5.7.0 5.8.0
2024-08-22-17-32-46 uavcloud-demo cmii-uav-data-post-process 5.7.0 5.8.0
2024-08-22-17-32-47 uavcloud-demo cmii-uav-gateway 5.7.0 5.8.0
2024-08-22-17-32-48 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082104 5.8.0
2024-08-22-17-32-49 uavcloud-demo cmii-uav-integration 5.7.0-hw-080201 5.8.0
2024-08-22-17-32-50 uavcloud-demo cmii-admin-user 5.7.0 5.8.0
2024-08-22-17-32-51 uavcloud-demo cmii-uav-cms 5.7.0 5.8.0
2024-08-22-17-32-52 uavcloud-demo cmii-uav-sense-adapter 5.7.0-0805 5.8.0
2024-08-22-17-32-54 uavcloud-demo cmii-uav-cloud-live 5.7.0 5.8.0
2024-08-22-17-32-55 uavcloud-demo cmii-uav-mqtthandler 5.7.0-29766-0822 5.8.0
2024-08-22-17-32-56 uavcloud-demo cmii-uav-multilink 5.5.0 5.8.0
2024-08-22-17-32-57 uavcloud-demo cmii-uav-airspace 5.7.0 5.8.0
2024-08-22-17-32-58 uavcloud-demo cmii-uav-alarm 5.7.0 5.8.0
2024-08-22-17-33-00 uavcloud-demo cmii-uav-surveillance 5.7.0-29766-0815 5.8.0
2024-08-22-17-33-01 uavcloud-demo cmii-uav-brain 5.5.0 5.8.0
2024-08-22-17-33-02 uavcloud-demo cmii-uav-material-warehouse 5.7.0 5.8.0
2024-08-22-17-33-03 uavcloud-demo cmii-admin-gateway 5.7.0 5.8.0
2024-08-22-17-33-04 uavcloud-demo cmii-uav-waypoint 5.7.0-0814 5.8.0
2024-08-22-17-33-05 uavcloud-demo cmii-uav-platform-media 5.7.0 5.8.0
2024-08-22-17-33-07 uavcloud-demo cmii-uav-platform-ai-brain 5.7.0 5.8.0
2024-08-22-17-33-08 uavcloud-demo cmii-uav-platform-armypeople 5.7.0-0820 5.8.0
2024-08-22-17-33-09 uavcloud-demo cmii-uav-platform-open 5.7.0 5.8.0
2024-08-22-17-33-10 uavcloud-demo cmii-uav-platform-share 5.7.0 5.8.0
2024-08-22-17-33-12 uavcloud-demo cmii-uav-platform 5.7.0-29267-0820 5.8.0
2024-08-22-17-33-13 uavcloud-demo cmii-suav-platform-supervisionh5 5.7.0 5.8.0
2024-08-22-17-33-14 uavcloud-demo cmii-uav-platform-cms-portal 5.7.0 5.8.0
2024-08-22-17-33-15 uavcloud-demo cmii-uav-platform-mws 5.7.0 5.8.0
2024-08-22-17-33-16 uavcloud-demo cmii-uav-platform-oms 5.7.0 5.8.0
2024-08-22-17-33-18 uavcloud-demo cmii-uav-platform-securityh5 5.7.0 5.8.0
2024-08-22-17-33-19 uavcloud-demo cmii-suav-platform-supervision 5.7.0 5.8.0
2024-08-29-09-35-00 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082702 5.7.0-31369-yunnan-082901
2024-08-29-10-04-24 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082901 5.7.0-31369-yunnan-082903
2024-08-29-11-30-21 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082903 5.7.0-31369-yunnan-082904
2024-08-29-15-06-26 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082904 5.7.0-31369-yunnan-082905
2024-08-29-16-58-24 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082905 5.7.0-31369-yunnan-082906
2024-08-29-17-30-45 uavcloud-demo cmii-uas-lifecycle 5.8.0 5.7.0-082901
2024-08-30-11-03-12 uavcloud-demo cmii-uas-lifecycle 5.7.0-082902 5.7.0-snapshot
2024-08-30-14-57-00 uavcloud-demo cmii-uas-lifecycle 5.7.0-snapshot 5.7.0-083001
2024-09-02-17-02-21 uavcloud-demo cmii-uav-platform 5.8.0 5.8.0-0902
2024-09-02-18-30-00 uavcloud-demo cmii-uas-lifecycle 5.7.0-090202 5.7.0-090201
2024-09-03-09-21-43 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-082906 5.7.0-31369-yunnan-090301
2024-09-03-15-18-12 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-090301 5.7.0-31369-yunnan-090302
2024-09-03-17-22-08 uavcloud-demo cmii-uas-lifecycle 5.7.0-090201 5.7.0-090301
2024-09-03-17-23-44 uavcloud-demo cmii-uav-platform 5.8.0-0902 5.8.0-090301
2024-09-04-09-43-45 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-090302 5.7.0-31369-yunnan-090401
2024-09-05-13-52-57 uavcloud-demo cmii-uav-industrial-portfolio 5.7.0-31369-yunnan-090401 5.7.0-31369-yunnan-090501
2024-11-28-17-58-21 uavcloud-demo cmii-uas-lifecycle 6.1.0-20241125-112802 6.1.0-20241125-112803
2024-11-29-11-37-17 uavcloud-demo cmii-uas-lifecycle 6.1.0-20241125-112803 6.1.0-20241125-112901
2024-11-29-12-21-07 uavcloud-demo cmii-uav-platform 6.1.0-20241125-112801 6.1.0-20241125-112901
2024-12-02-17-56-35 uavcloud-demo cmii-uav-platform 6.1.0-20241125-112901 6.1.0-20241125-120201
2024-12-02-19-00-00 uavcloud-demo cmii-uav-platform 6.1.0-20241125-120201 6.1.0-20241125-120202
2024-12-03-10-28-48 uavcloud-demo cmii-app-release master-6.0.0-120201 6.0.0-120301
2024-12-03-10-50-51 uavcloud-demo cmii-uav-cloud-live 6.1.0-1126 6.0.0-120301
2024-12-03-10-55-52 uavcloud-demo cmii-uav-cloud-live 6.0.0-120301 6.1.0-1126
2024-12-03-10-56-05 uavcloud-demo cmii-uav-cloud-live 6.1.0-1126 6.0.0-120301
2024-12-03-10-56-41 uavcloud-demo cmii-uav-cloud-live 6.0.0-120301 6.1.0-120301
2024-12-03-13-46-38 uavcloud-demo cmii-uas-lifecycle 6.1.0-20241125-112903 6.1.0-20241125-120301
2024-12-03-14-18-11 uavcloud-demo cmii-uav-platform 6.1.0-20241125-120202 6.1.0-20241125120301
2024-12-03-18-06-52 uavcloud-demo cmii-uav-industrial-portfolio 6.1.0-20241125-112601 6.1.0-20241125-120301
2024-12-04-12-51-56 uavcloud-demo cmii-uas-lifecycle 6.1.0-20241125-120301 6.1.0-20241125-120401
2024-12-04-12-53-35 uavcloud-demo cmii-uav-mqtthandler 6.1.0-20241125 6.1.0-20241125-120401
2024-12-04-16-28-50 uavcloud-demo cmii-uav-platform 6.1.0-20241125120301 6.1.0-20241125120401
2024-12-04-17-21-25 uavcloud-demo cmii-uav-platform 6.1.0-20241125120401 6.1.0-20241125120402
2024-12-04-17-31-28 uavcloud-demo cmii-uav-platform-uasms 6.1.0-202411251202 6.1.0-202411251204
2024-12-04-17-33-20 uavcloud-demo cmii-uav-platform-uasms 6.1.0-202411251204 6.1.0-202411251204
2024-12-04-18-36-53 uavcloud-demo cmii-uav-industrial-portfolio 6.1.0-20241125-120301 6.1.0-20241125-120401
2024-12-04-18-38-34 uavcloud-demo cmii-uas-lifecycle 6.1.0-20241125-120401 6.1.0-20241125-120402
2024-12-05-15-53-02 uavcloud-demo cmii-uav-industrial-portfolio 6.1.0-20241125-120401 6.1.0-20241125-120501

View File

@@ -0,0 +1,71 @@
---
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervisionh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-ai-brain:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-emergency-rescue:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-open:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:4.1.6-24238-qingdao
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-splice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.4.0-25263
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-base:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-detection:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-logistics:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-oms:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervision:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-mws:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-qinghaitourism:4.1.0-21377-0508
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-armypeople:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-cms-portal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.3.0-hjltt
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-jiangsuwenlv:4.1.3-jiangsu-0427
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-multiterminal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-threedsimulation:5.2.0-21392
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-visualization:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-media:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-seniclive:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-security:4.1.6
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-securityh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-share:5.4.0
---
harbor.cdcyy.com.cn/cmii/cmii-uav-cloud-live:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-device:5.4.0-26905
harbor.cdcyy.com.cn/cmii/cmii-uav-material-warehouse:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-mission:5.4.0-26462-0228
harbor.cdcyy.com.cn/cmii/cmii-admin-data:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-autowaypoint:4.1.6-cm
harbor.cdcyy.com.cn/cmii/cmii-uav-data-post-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-mqtthandler:5.4.0-26768
harbor.cdcyy.com.cn/cmii/cmii-uav-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-app-release:4.2.0-validation
harbor.cdcyy.com.cn/cmii/cmii-suav-supervision:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-emergency:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-oauth:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-surveillance:5.4.0-24227
harbor.cdcyy.com.cn/cmii/cmii-admin-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-clusters:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-cms:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-depotautoreturn:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-logger:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-threedsimulation:5.1.0
harbor.cdcyy.com.cn/cmii/cmii-uav-alarm:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-developer:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-notice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-admin-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-open-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-airspace:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-kpi-monitor:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-integration:5.4.0-0228
harbor.cdcyy.com.cn/cmii/cmii-uav-tower:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-brain:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-industrial-portfolio:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-waypoint:5.4.0-26768
---1
harbor.cdcyy.com.cn/cmii/cmii-uav-gis-server:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-datasource:5.2.0-24810
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-engine:5.1.0
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-manage:5.1.0
---
harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-rtsp-operator:v5.1.0
---

View File

@@ -0,0 +1,71 @@
---
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-emergency-rescue:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-mws:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-seniclive:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-share:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervision:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-cms-portal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-detection:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-media:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-qinghaitourism:4.1.0-21377-0508
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-security:4.1.6
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-securityh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.4.0-25263
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-armypeople:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-multiterminal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-threedsimulation:5.2.0-21392
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-visualization:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-ai-brain:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-logistics:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-open:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.3.0-hjltt
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervisionh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-jiangsuwenlv:4.1.3-jiangsu-0427
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-splice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-base:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-oms:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:4.1.6-24238-qingdao
---
harbor.cdcyy.com.cn/cmii/cmii-open-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-autowaypoint:4.1.6-cm
harbor.cdcyy.com.cn/cmii/cmii-uav-cms:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-notice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-surveillance:5.4.0-24227
harbor.cdcyy.com.cn/cmii/cmii-app-release:4.2.0-validation
harbor.cdcyy.com.cn/cmii/cmii-uav-mqtthandler:5.4.0-26768
harbor.cdcyy.com.cn/cmii/cmii-admin-data:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-airspace:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-alarm:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-developer:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-material-warehouse:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-admin-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-depotautoreturn:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-device:5.4.0-26905
harbor.cdcyy.com.cn/cmii/cmii-uav-industrial-portfolio:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-oauth:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-tower:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-data-post-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-supervision:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-cloud-live:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-emergency:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-threedsimulation:5.1.0
harbor.cdcyy.com.cn/cmii/cmii-admin-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-mission:5.4.0-26462-0228
harbor.cdcyy.com.cn/cmii/cmii-uav-waypoint:5.4.0-26768
harbor.cdcyy.com.cn/cmii/cmii-uav-integration:5.4.0-0228
harbor.cdcyy.com.cn/cmii/cmii-uav-kpi-monitor:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-clusters:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-logger:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-brain:5.4.0
---
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-datasource:5.2.0-24810
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-engine:5.1.0
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-manage:5.1.0
harbor.cdcyy.com.cn/cmii/cmii-uav-gis-server:5.4.0
---
harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-srs-oss-adaptor:2023-SA
---

View File

@@ -0,0 +1,72 @@
---
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-cms-portal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-detection:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-jiangsuwenlv:4.1.3-jiangsu-0427
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-logistics:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-media:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.4.0-25263
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-mws:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-threedsimulation:5.2.0-21392
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-splice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervisionh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-ai-brain:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-armypeople:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-security:4.1.6
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-share:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-securityh5:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-suav-platform-supervision:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:4.1.6-24238-qingdao
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-emergency-rescue:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform:5.3.0-hjltt
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-oms:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-open:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-qinghaitourism:4.1.0-21377-0508
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-base:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-multiterminal:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-seniclive:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-platform-visualization:5.2.0
---
harbor.cdcyy.com.cn/cmii/cmii-uav-emergency:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-surveillance:5.4.0-24227
harbor.cdcyy.com.cn/cmii/cmii-uav-threedsimulation:5.1.0
harbor.cdcyy.com.cn/cmii/cmii-uav-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-admin-data:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-autowaypoint:4.1.6-cm
harbor.cdcyy.com.cn/cmii/cmii-uav-cloud-live:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-cms:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-logger:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-mqtthandler:5.4.0-26768
harbor.cdcyy.com.cn/cmii/cmii-uav-airspace:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-waypoint:5.4.0-26768
harbor.cdcyy.com.cn/cmii/cmii-admin-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-open-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-data-post-process:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-depotautoreturn:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-kpi-monitor:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-material-warehouse:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-clusters:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-notice:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-oauth:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-user:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-app-release:4.2.0-validation
harbor.cdcyy.com.cn/cmii/cmii-suav-supervision:5.2.0
harbor.cdcyy.com.cn/cmii/cmii-uav-brain:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-developer:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-device:5.4.0-26905
harbor.cdcyy.com.cn/cmii/cmii-admin-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-alarm:5.3.0
harbor.cdcyy.com.cn/cmii/cmii-uav-integration:5.4.0-0228
harbor.cdcyy.com.cn/cmii/cmii-uav-mission:5.4.0-26462-0228
harbor.cdcyy.com.cn/cmii/cmii-uav-tower:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-gateway:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-industrial-portfolio:5.4.0
---
harbor.cdcyy.com.cn/cmii/cmii-uav-gis-server:5.4.0
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-datasource:5.2.0-24810
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-engine:5.1.0
harbor.cdcyy.com.cn/cmii/cmii-uav-grid-manage:5.1.0
---
harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0
ossrs/srs:v5.0.195
harbor.cdcyy.com.cn/cmii/cmii-srs-oss-adaptor:2023-SA
---

171
agent-operator/main.go Normal file
View File

@@ -0,0 +1,171 @@
package main
import (
"bufio"
"flag"
"fmt"
"os"
"strings"
"wdd.io/agent-common/utils"
)
var LocalKubeConfigFile = "/root/.kube/config"
// build for offline usage
// C:\Users\wdd\go\bin\gox.exe -osarch="linux/amd64" -output "build/agent-operator_{{.OS}}_{{.Arch}}"
// C:\Users\wdd\go\bin\gox.exe -osarch="linux/amd64 linux/arm64" -output "build/agent-operator_{{.OS}}_{{.Arch}}"
// C:\Users\wddsh\go\bin\gox.exe -osarch="linux/amd64" -output "build/agent-operator_{{.OS}}_{{.Arch}}"
func BuildDefaultK8sOperator() {
// build from local LocalKubeConfigFile
if !utils.FileExists(LocalKubeConfigFile) {
log.ErrorF("%s not exits! error!", LocalKubeConfigFile)
return
}
readFile, err := os.ReadFile(LocalKubeConfigFile)
if err != nil {
log.ErrorF("error reading %s, error %s", LocalKubeConfigFile, err.Error())
return
}
op := CmiiK8sOperator{}
op.BuildCurrentClientFromConfig(readFile)
DefaultCmiiOperator = op
}
func RealProjectRunner() {
// ops
// update
//result := UpdateCmiiImageTagFromNameTagList(realNamespace, bgtg.AllCmiiImageTagList)
//result := UpdateCmiiImageTagFromNameTagMap(realNamespace, xmyd.Real540ImageTagMap)
//utils.BeautifulPrint(result)
//for _, imageFullName := range xmyd.AllCmiiImageTagList {
// appName := image.ImageFullNameToAppName(imageFullName)
// if appName == "" {
// log.InfoF("can't update %s", imageFullName)
// continue
// }
// exists := op.DeploymentExist(realNamespace, appName)
// if exists == nil {
// log.InfoF("app of %s not eixts", appName)
// continue
// }
//
// _ = op.DeploymentUpdateTag(realNamespace, appName, image.ImageFullNameToImageTag(imageFullName))
//
//}
// backup system app tag
//backendMap, frontendMap, srsMap := BackupAllCmiiDeploymentToMap(realNamespace)
//utils.BeautifulPrint(backendMap)
//utils.BeautifulPrint(frontendMap)
//utils.BeautifulPrint(srsMap)
// scale deployment
//ScaleCmiiFrontendDeploymentToDesiredReplicas(realNamespace, 1)
//ScaleCmiiBackendDeploymentToDesiredReplicas(realNamespace, 1)
// update from map
}
func CmiiRunner() {
}
var DLTUHelp = `
DLTUHelp
dltu [ossUrlPrefix] [ossFileName] [localGzipFolderOrGzipFile] [harborHostFullName] [namespace]
`
func main() {
// C:\Users\wddsh\go\bin\gox.exe -osarch="linux/amd64" -output "build/operator_{{.OS}}_{{.Arch}}"
//RealProjectRunner()
//var mode string
//flag.StringVar(&mode, "mode", "mode", "agent run mode")
//flag.Parse()
//
//BuildDefaultK8sOperator()
//
//BackupAllDeploymentFromEnvToFile(mode)
//解析命令行参数
var mode string
flag.StringVar(&mode, "mode", "mode", "agent run mode")
flag.Parse()
if mode == "image" {
BuildDefaultK8sOperator()
// 堡垒机模式 的 镜像美容
// 初始化堡垒机模式
for {
reader := bufio.NewReader(os.Stdin)
for {
fmt.Printf(DLTUHelp)
fmt.Print("enter ==> ")
text, _ := reader.ReadString('\n')
split := strings.Split(text, " ")
var result []string
for _, s := range split {
text = strings.TrimSpace(s)
if text == "" {
continue
}
result = append(result, text)
}
if len(result) != 6 {
fmt.Println("input error!")
fmt.Printf(DLTUHelp)
return
}
ossUrlPrefix := result[1]
ossFileName := result[2]
localGzipFolderOrGzipFile := result[3]
harborHostFullName := result[4]
namespace := result[5]
fmt.Println("ossUrlPrefix: ", ossUrlPrefix)
fmt.Println("ossFileName: ", ossFileName)
fmt.Println("localGzipFolderOrGzipFile: ", localGzipFolderOrGzipFile)
fmt.Println("harborHostFullName: ", harborHostFullName)
fmt.Println("namespace: ", namespace)
fmt.Println()
downloadFromOss := true
if ossFileName == "0" {
downloadFromOss = false
}
// DLTU
targetImageFullNameList := A_DownloadLoadTagUpload(downloadFromOss, ossUrlPrefix, ossFileName, localGzipFolderOrGzipFile, harborHostFullName)
// 是否需要更新
if namespace != "" {
for _, targetImageFullName := range targetImageFullNameList {
if !DefaultCmiiOperator.DeploymentUpdateTagByImageFullName(namespace, targetImageFullName) {
fmt.Printf("[Update] update [%s] [%s] failed", namespace, targetImageFullName)
}
}
}
fmt.Println()
}
}
} else if mode == "operator" {
}
}

View File

@@ -0,0 +1,215 @@
package minio
import (
"os"
"strings"
"wdd.io/agent-common/logger"
"github.com/minio/minio-go"
"wdd.io/agent-common/utils"
)
type CmiiMinioOperator struct {
LocalMinioOperator *MinioOperator
PublicMinioOperator *MinioOperator
DemoMinioOperator *MinioOperator
}
var DefaultCmiiMinioOperator = newInstance()
var log = logger.Log
func newInstance() *CmiiMinioOperator {
op := &CmiiMinioOperator{}
op.buildCmiiMinioOperator()
return op
}
const (
DefaultLocalEndpoint = "10.250.0.100:9000"
DefaultPublicEndpoint = "42.192.52.227:9000"
DefaultDemoEndpoint = "oss.demo.uavcmlc.com"
DefaultAccessKeyID = "cmii"
DefaultSecretAccessKey = "B#923fC7mk"
DefaultOctopusBucketName = "octopus"
DefaultOssUrlPrefix = "https://oss.demo.uavcmlc.com:18000/cmlc-installation/tmp/"
)
func (op *CmiiMinioOperator) buildCmiiMinioOperator() {
if op.LocalMinioOperator == nil {
op.LocalMinioOperator = &MinioOperator{
MinioEndpoint: DefaultLocalEndpoint,
EndpointSecure: false,
AccessKeyID: DefaultAccessKeyID,
SecretAccessKey: DefaultSecretAccessKey,
Client: nil,
}
op.LocalMinioOperator.BuildMinioOperator()
}
if op.PublicMinioOperator == nil {
op.PublicMinioOperator = &MinioOperator{
MinioEndpoint: DefaultPublicEndpoint,
EndpointSecure: false,
AccessKeyID: DefaultAccessKeyID,
SecretAccessKey: DefaultSecretAccessKey,
Client: nil,
}
op.PublicMinioOperator.BuildMinioOperator()
}
if op.DemoMinioOperator == nil {
op.DemoMinioOperator = &MinioOperator{
MinioEndpoint: DefaultDemoEndpoint,
EndpointSecure: true,
AccessKeyID: DefaultAccessKeyID,
SecretAccessKey: DefaultSecretAccessKey,
Client: nil,
}
op.DemoMinioOperator.BuildMinioOperator()
}
log.DebugF("[buildCmiiMinioOperator] - build client success !")
}
func (op *CmiiMinioOperator) UploadToLocalOctopus(filePath, fileName string) bool {
return op.LocalMinioOperator.UploadFile(DefaultOctopusBucketName, filePath, fileName)
}
func (op *CmiiMinioOperator) UploadToPublicOctopus(filePath, fileName string) bool {
return op.PublicMinioOperator.UploadFile(DefaultOctopusBucketName, filePath, fileName)
}
func (op *CmiiMinioOperator) UploadToDemo(bucketName, filePath, fileName string) bool {
return op.DemoMinioOperator.UploadFile(bucketName, filePath, fileName)
}
type MinioOperator struct {
MinioEndpoint string
EndpointSecure bool
AccessKeyID string
SecretAccessKey string
Client *minio.Client
}
func (op *MinioOperator) BuildMinioOperator() {
op.MinioEndpoint = strings.TrimPrefix(op.MinioEndpoint, "http://")
op.MinioEndpoint = strings.TrimPrefix(op.MinioEndpoint, "https://")
if strings.Contains(op.MinioEndpoint, "/") {
op.MinioEndpoint = strings.Split(op.MinioEndpoint, "/")[0]
}
client, err := minio.New(op.MinioEndpoint, op.AccessKeyID, op.SecretAccessKey, op.EndpointSecure)
if err != nil {
log.ErrorF("Failed to create client: %v", err)
}
log.DebugF("endpoint: %s accessKeyId: %s secretAccessKey: %s", op.MinioEndpoint, op.AccessKeyID, op.SecretAccessKey)
op.Client = client
}
func (op *MinioOperator) ListFileInBucket(bucketName string) {
// 使用ListObjectsV2获取bucket中的所有文件名。
doneChan := make(chan struct{})
objectInfo := op.Client.ListObjectsV2(bucketName, "", false, doneChan)
for object := range objectInfo {
utils.BeautifulPrint(object)
}
}
func (op *MinioOperator) DownloadFileFromOssFullUrl(ossFullUrl string, filePath string) bool {
log.InfoF("[DownloadFileFromOssFullUrl] - download from %s", ossFullUrl)
// https://oss.demo.uavcmlc.com:18000/cmlc-installation/tmp/docker.tar.gz
ossFullUrl = strings.TrimPrefix(ossFullUrl, "http://")
ossFullUrl = strings.TrimPrefix(ossFullUrl, "https://")
// oss.demo.uavcmlc.com:18000/cmlc-installation/tmp/docker.tar.gz
split := strings.Split(ossFullUrl, "/")
if len(split) < 2 {
log.ErrorF("DownloadFileFromOssFullUrl - split error len < 2 !")
return false
}
ossFullUrl = strings.TrimPrefix(ossFullUrl, split[0]+"/")
bucketName := split[1]
fileName := strings.TrimPrefix(ossFullUrl, bucketName)
return op.DownloadFile(bucketName, filePath, fileName)
}
// DownloadFile fileNameWithPrefix格式为 tmp/123/123.txt
func (op *MinioOperator) DownloadFile(bucketName, filePath, fileNameWithPrefix string) bool {
separator := os.PathSeparator
if !strings.HasSuffix(filePath, string(separator)) {
filePath += string(separator)
}
fileNameWithPrefix = strings.TrimPrefix(fileNameWithPrefix, "/")
// 获取下载的真实文件名称 123.txt
realFileName := fileNameWithPrefix
if strings.Contains(fileNameWithPrefix, "/") {
realFileName = strings.Split(fileNameWithPrefix, "/")[len(strings.Split(fileNameWithPrefix, "/"))-1]
}
log.InfoF("[DownloadFile] - download from [%s] to [%s]", op.MinioEndpoint+"/"+bucketName+"/"+fileNameWithPrefix, filePath+realFileName)
err := op.Client.FGetObject(bucketName, fileNameWithPrefix, filePath+realFileName, minio.GetObjectOptions{})
if err != nil {
log.ErrorF("[DownloadFile] - download %s error %s", filePath+realFileName, err.Error())
return false
}
return true
}
// UploadFile bucketNameWithSuffix格式为 cmlc-installation/tmp/123 的格式
func (op *MinioOperator) UploadFile(bucketNameWithSuffix, filePath, fileName string) bool {
separator := os.PathSeparator
if !strings.HasSuffix(filePath, string(separator)) {
filePath += string(separator)
}
fileName = strings.TrimPrefix(fileName, "/")
bucketNameWithSuffix = strings.TrimPrefix(bucketNameWithSuffix, "/")
oldBucketName := bucketNameWithSuffix
realFileName := fileName
// 解析bucket上传的真实名称
if strings.Contains(bucketNameWithSuffix, "/") {
bucketNameWithSuffix = strings.Split(bucketNameWithSuffix, "/")[0]
fileName = strings.TrimPrefix(oldBucketName, bucketNameWithSuffix) + "/" + realFileName
}
// 使用PutObject上传文件
// fileName ==> tmp/123/123.txt
// realFileName ==> 123.txt
log.InfoF("[UploadFile] - upload from [%s] to [%s]", filePath+realFileName, op.MinioEndpoint+"/"+bucketNameWithSuffix+fileName)
n, err := op.Client.FPutObject(bucketNameWithSuffix, fileName, filePath+realFileName, minio.PutObjectOptions{})
if err != nil {
log.ErrorF("[UploadFile] - upload [%s] to [%s] error %s", filePath+realFileName, op.MinioEndpoint+"/"+bucketNameWithSuffix+"/"+fileName, err.Error())
return false
}
log.InfoF("[UploadFile] - uploaded [%s] of size %d", filePath+realFileName, n)
return true
}

View File

@@ -0,0 +1,23 @@
package minio
import "testing"
func TestCmiiMinioOperator_UploadToDemo(t *testing.T) {
DefaultCmiiMinioOperator.UploadToDemo("cmlc-installation", "/home/wdd/Downloads/", "go1.22.1.linux-amd64.tar.gz")
}
func TestMinioOperator_DownloadFile(t *testing.T) {
DefaultCmiiMinioOperator.DemoMinioOperator.DownloadFile("cmlc-installation", "C:\\Users\\wddsh\\Documents\\Visual Studio 2022", "tmp/cmii-srs-oss-adaptor=2023-SA=2024-04-11=847.tar.gz")
}
func TestMinioOperator_UploadFile(t *testing.T) {
DefaultCmiiMinioOperator.DemoMinioOperator.UploadFile("cmlc-installation/tmp", "C:\\Users\\wddsh\\Documents\\Visual Studio 2022", "cmii-srs-oss-adaptor=2023-SA=2024-04-11=847.tar.gz")
}
func TestMinioOperator_DownloadFileFromOssFullUrl(t *testing.T) {
DefaultCmiiMinioOperator.DemoMinioOperator.DownloadFileFromOssFullUrl("https://oss.demo.uavcmlc.com:18000/cmlc-installation/tmp/cmlc=cmii=cmii-srs-oss-adaptor=2023-SA.tar.gz", "C:\\Users\\wddsh\\Documents\\Visual Studio 2022")
}

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -0,0 +1,307 @@
package tools
import (
"encoding/json"
"fmt"
"io"
"strings"
"time"
units "github.com/docker/go-units"
"github.com/moby/term"
"github.com/morikuni/aec"
)
// RFC3339NanoFixed is time.RFC3339Nano with nanoseconds padded using zeros to
// ensure the formatted time isalways the same number of characters.
const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
// JSONError wraps a concrete Code and Message, Code is
// an integer error code, Message is the error message.
type JSONError struct {
Code int `json:"code,omitempty"`
Message string `json:"message,omitempty"`
}
func (e *JSONError) Error() string {
return e.Message
}
// JSONProgress describes a progress message in a JSON stream.
type JSONProgress struct {
// Current is the current status and value of the progress made towards Total.
Current int64 `json:"current,omitempty"`
// Total is the end value describing when we made 100% progress for an operation.
Total int64 `json:"total,omitempty"`
// Start is the initial value for the operation.
Start int64 `json:"start,omitempty"`
// HideCounts. if true, hides the progress count indicator (xB/yB).
HideCounts bool `json:"hidecounts,omitempty"`
// Units is the unit to print for progress. It defaults to "bytes" if empty.
Units string `json:"units,omitempty"`
// terminalFd is the fd of the current terminal, if any. It is used
// to get the terminal width.
terminalFd uintptr
// nowFunc is used to override the current time in tests.
nowFunc func() time.Time
// winSize is used to override the terminal width in tests.
winSize int
}
func (p *JSONProgress) String() string {
var (
width = p.width()
pbBox string
numbersBox string
timeLeftBox string
)
if p.Current <= 0 && p.Total <= 0 {
return ""
}
if p.Total <= 0 {
switch p.Units {
case "":
return fmt.Sprintf("%8v", units.HumanSize(float64(p.Current)))
default:
return fmt.Sprintf("%d %s", p.Current, p.Units)
}
}
percentage := int(float64(p.Current)/float64(p.Total)*100) / 2
if percentage > 50 {
percentage = 50
}
if width > 110 {
// this number can't be negative gh#7136
numSpaces := 0
if 50-percentage > 0 {
numSpaces = 50 - percentage
}
pbBox = fmt.Sprintf("[%s>%s] ", strings.Repeat("=", percentage), strings.Repeat(" ", numSpaces))
}
switch {
case p.HideCounts:
case p.Units == "": // no units, use bytes
current := units.HumanSize(float64(p.Current))
total := units.HumanSize(float64(p.Total))
numbersBox = fmt.Sprintf("%8v/%v", current, total)
if p.Current > p.Total {
// remove total display if the reported current is wonky.
numbersBox = fmt.Sprintf("%8v", current)
}
default:
numbersBox = fmt.Sprintf("%d/%d %s", p.Current, p.Total, p.Units)
if p.Current > p.Total {
// remove total display if the reported current is wonky.
numbersBox = fmt.Sprintf("%d %s", p.Current, p.Units)
}
}
if p.Current > 0 && p.Start > 0 && percentage < 50 {
fromStart := p.now().Sub(time.Unix(p.Start, 0))
perEntry := fromStart / time.Duration(p.Current)
left := time.Duration(p.Total-p.Current) * perEntry
left = (left / time.Second) * time.Second
if width > 50 {
timeLeftBox = " " + left.String()
}
}
return pbBox + numbersBox + timeLeftBox
}
// now returns the current time in UTC, but can be overridden in tests
// by setting JSONProgress.nowFunc to a custom function.
func (p *JSONProgress) now() time.Time {
if p.nowFunc != nil {
return p.nowFunc()
}
return time.Now().UTC()
}
// width returns the current terminal's width, but can be overridden
// in tests by setting JSONProgress.winSize to a non-zero value.
func (p *JSONProgress) width() int {
if p.winSize != 0 {
return p.winSize
}
ws, err := term.GetWinsize(p.terminalFd)
if err == nil {
return int(ws.Width)
}
return 200
}
// JSONMessage defines a message struct. It describes
// the created time, where it from, status, ID of the
// message. It's used for docker events.
type JSONMessage struct {
Stream string `json:"stream,omitempty"`
Status string `json:"status,omitempty"`
Progress *JSONProgress `json:"progressDetail,omitempty"`
ProgressMessage string `json:"progress,omitempty"` // deprecated
ID string `json:"id,omitempty"`
From string `json:"from,omitempty"`
Time int64 `json:"time,omitempty"`
TimeNano int64 `json:"timeNano,omitempty"`
Error *JSONError `json:"errorDetail,omitempty"`
ErrorMessage string `json:"error,omitempty"` // deprecated
// Aux contains out-of-band data, such as digests for push signing and image id after building.
Aux *json.RawMessage `json:"aux,omitempty"`
}
func clearLine(out io.Writer) {
eraseMode := aec.EraseModes.All
cl := aec.EraseLine(eraseMode)
fmt.Fprint(out, cl)
}
func cursorUp(out io.Writer, l uint) {
fmt.Fprint(out, aec.Up(l))
}
func cursorDown(out io.Writer, l uint) {
fmt.Fprint(out, aec.Down(l))
}
// Display prints the JSONMessage to out. If isTerminal is true, it erases
// the entire current line when displaying the progressbar. It returns an
// error if the [JSONMessage.Error] field is non-nil.
func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error {
if jm.Error != nil {
return jm.Error
}
var endl string
if isTerminal && jm.Stream == "" && jm.Progress != nil {
clearLine(out)
endl = "\r"
fmt.Fprint(out, endl)
} else if jm.Progress != nil && jm.Progress.String() != "" { // disable progressbar in non-terminal
return nil
}
if jm.TimeNano != 0 {
fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(RFC3339NanoFixed))
} else if jm.Time != 0 {
fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(RFC3339NanoFixed))
}
if jm.ID != "" {
fmt.Fprintf(out, "%s: ", jm.ID)
}
if jm.From != "" {
fmt.Fprintf(out, "(from %s) ", jm.From)
}
if jm.Progress != nil && isTerminal {
fmt.Fprintf(out, "%s %s%s", jm.Status, jm.Progress.String(), endl)
} else if jm.ProgressMessage != "" { // deprecated
fmt.Fprintf(out, "%s %s%s", jm.Status, jm.ProgressMessage, endl)
} else if jm.Stream != "" {
fmt.Fprintf(out, "%s%s", jm.Stream, endl)
} else {
fmt.Fprintf(out, "%s%s\n", jm.Status, endl)
}
return nil
}
// DisplayJSONMessagesStream reads a JSON message stream from in, and writes
// each [JSONMessage] to out. It returns an error if an invalid JSONMessage
// is received, or if a JSONMessage containers a non-zero [JSONMessage.Error].
//
// Presentation of the JSONMessage depends on whether a terminal is attached,
// and on the terminal width. Progress bars ([JSONProgress]) are suppressed
// on narrower terminals (< 110 characters).
//
// - isTerminal describes if out is a terminal, in which case it prints
// a newline ("\n") at the end of each line and moves the cursor while
// displaying.
// - terminalFd is the fd of the current terminal (if any), and used
// to get the terminal width.
// - auxCallback allows handling the [JSONMessage.Aux] field. It is
// called if a JSONMessage contains an Aux field, in which case
// DisplayJSONMessagesStream does not present the JSONMessage.
func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(JSONMessage)) error {
var (
dec = json.NewDecoder(in)
ids = make(map[string]uint)
)
for {
var diff uint
var jm JSONMessage
if err := dec.Decode(&jm); err != nil {
if err == io.EOF {
break
}
return err
}
if jm.Aux != nil {
if auxCallback != nil {
auxCallback(jm)
}
continue
}
if jm.Progress != nil {
jm.Progress.terminalFd = terminalFd
}
if jm.ID != "" && (jm.Progress != nil || jm.ProgressMessage != "") {
line, ok := ids[jm.ID]
if !ok {
// NOTE: This approach of using len(id) to
// figure out the number of lines of history
// only works as long as we clear the history
// when we output something that's not
// accounted for in the map, such as a line
// with no ID.
line = uint(len(ids))
ids[jm.ID] = line
if isTerminal {
fmt.Fprintf(out, "\n")
}
}
diff = uint(len(ids)) - line
if isTerminal {
cursorUp(out, diff)
}
} else {
// When outputting something that isn't progress
// output, clear the history of previous lines. We
// don't want progress entries from some previous
// operation to be updated (for example, pull -a
// with multiple tags).
ids = make(map[string]uint)
}
err := jm.Display(out, isTerminal)
if jm.ID != "" && isTerminal {
cursorDown(out, diff)
}
if err != nil {
return err
}
}
return nil
}
// Stream is an io.Writer for output with utilities to get the output's file
// descriptor and to detect wether it's a terminal.
//
// it is subset of the streams.Out type in
// https://pkg.go.dev/github.com/docker/cli@v20.10.17+incompatible/cli/streams#Out
type Stream interface {
io.Writer
FD() uintptr
IsTerminal() bool
}
// DisplayJSONMessagesToStream prints json messages to the output Stream. It is
// used by the Docker CLI to print JSONMessage streams.
func DisplayJSONMessagesToStream(in io.Reader, stream Stream, auxCallback func(JSONMessage)) error {
return DisplayJSONMessagesStream(in, stream, stream.FD(), stream.IsTerminal(), auxCallback)
}