From 0d3bb30eed52ff35a9eb005d0233dc764f23eeb6 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Wed, 22 Jan 2025 15:09:43 +0800 Subject: [PATCH] =?UTF-8?q?[agent-go]-=E7=AE=80=E5=8C=96Agent=20=E5=89=94?= =?UTF-8?q?=E9=99=A4Harbor=20K8s=20Image=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent-go/a_executor/AppFunction.go | 2120 +++++++++--------- agent-go/a_executor/BaseFunction.go | 36 + agent-go/a_executor/BasicFunction.go | 34 +- agent-go/a_executor/CommandExecutor.go | 36 +- agent-go/a_executor/HarborExecutor.go | 823 +++---- agent-go/a_executor/ImageFunction.go | 682 +++--- agent-go/a_executor/K8sFunction.go | 915 ++++---- agent-go/a_executor/beans/SSHConfig.go | 203 ++ agent-go/a_executor/beans/SshKeyConfig.go | 71 - agent-go/a_init/AgentInitialization.go | 1 + agent-go/a_init/BastionInitializaion.go | 6 +- agent-go/go.mod | 56 +- agent-go/go.sum | 249 +- agent-go/main.go | 1 + agent-operator/CmiiK8sHigherOperator_test.go | 2 +- 15 files changed, 2569 insertions(+), 2666 deletions(-) create mode 100644 agent-go/a_executor/beans/SSHConfig.go delete mode 100755 agent-go/a_executor/beans/SshKeyConfig.go diff --git a/agent-go/a_executor/AppFunction.go b/agent-go/a_executor/AppFunction.go index d6ea97d..f1050de 100755 --- a/agent-go/a_executor/AppFunction.go +++ b/agent-go/a_executor/AppFunction.go @@ -1,14 +1,5 @@ package a_executor -import ( - "fmt" - "net" - "regexp" - "sort" - "strconv" - "time" -) - type OctopusFunc interface { Command(baseFuncName string, funcArgs ...string) []string @@ -22,1088 +13,1087 @@ type AppFunc interface { } var AppExecuteErrorLogPrefix = []string{"App指令执行错误! => "} -var nfsDataPath = "/var/lib/docker/nfs_data" func (op *AgentOsOperator) Deploy(appFuncName string, funcArgs ...string) (bool, []string) { - var resultOK bool - var result []string + //var resultOK bool + //var result []string - switch appFuncName { - case "DEPLOY_CHRONY_SERVER": - resultOK, result = op.installChronyByDockerExec(funcArgs) - break - case "DEPLOY_RKE": - resultOK, result = op.deployRke(funcArgs) - break - case "DEPLOY_K8S_DASHBOARD": - resultOK, result = op.deployK8sDashboard(funcArgs) - break - case "DEPLOY_K8S_NAMESPACE": - resultOK, result = op.deployK8sNamespace(funcArgs) - break - case "DEPLOY_MINIO": - resultOK, result = op.deployMinio(funcArgs) - break - case "DEPLOY_NFS": - resultOK, result = op.deployNFS(funcArgs) - break - case "DEPLOY_TEST_NFS": - resultOK, result = op.deployTestNFS(funcArgs) - break - case "DEPLOY_K8S_PVC": - resultOK, result = op.deployPVC(funcArgs) - break - case "DEPLOY_STORAGE_CLASS": - break - case "DEPLOY_K8S_MYSQL": - resultOK, result = op.deployMySQL(funcArgs) - break - //case "LOAD_MYSQL_INIT_SCRIPT": - // resultOK, result = op.loadMysqlInitScript(funcArgs) + //switch appFuncName { + //case "DEPLOY_CHRONY_SERVER": + // resultOK, result = op.installChronyByDockerExec(funcArgs) // break - case "checkMySQL": - resultOK, result = op.checkMySQL(funcArgs) - break - case "DEPLOY_K8S_MIDDLEWARES": - resultOK, result = op.deployMiddlewares(funcArgs) - break - case "DEPLOY_K8S_REDIS": - resultOK, result = op.deployRedis(funcArgs) - break - case "DEPLOY_INGRESS": - resultOK, result = op.deployIngress(funcArgs) - break - case "DEPLOY_FRONTEND": - resultOK, result = op.deployFront(funcArgs) - break - case "INIT_MINIO": - resultOK, result = op.initMinio(funcArgs) - break - case "DEPLOY_K8S_SRS": - resultOK, result = op.deploySRS(funcArgs) - break - case "deployGDR": - resultOK, result = op.deployGDR(funcArgs) - break - case "MODIFY_NACOS": - resultOK, result = op.modifyNacos(funcArgs) - break - case "DEPLOY_BACKEND": - resultOK, result = op.deployBackend(funcArgs) - break - default: - op.ok(funcArgs) - } + //case "DEPLOY_RKE": + // resultOK, result = op.deployRke(funcArgs) + // break + //case "DEPLOY_K8S_DASHBOARD": + // resultOK, result = op.deployK8sDashboard(funcArgs) + // break + //case "DEPLOY_K8S_NAMESPACE": + // resultOK, result = op.deployK8sNamespace(funcArgs) + // break + //case "DEPLOY_MINIO": + // resultOK, result = op.deployMinio(funcArgs) + // break + //case "DEPLOY_NFS": + // resultOK, result = op.deployNFS(funcArgs) + // break + //case "DEPLOY_TEST_NFS": + // resultOK, result = op.deployTestNFS(funcArgs) + // break + //case "DEPLOY_K8S_PVC": + // resultOK, result = op.deployPVC(funcArgs) + // break + //case "DEPLOY_STORAGE_CLASS": + // break + //case "DEPLOY_K8S_MYSQL": + // resultOK, result = op.deployMySQL(funcArgs) + // break + ////case "LOAD_MYSQL_INIT_SCRIPT": + //// resultOK, result = op.loadMysqlInitScript(funcArgs) + //// break + //case "checkMySQL": + // resultOK, result = op.checkMySQL(funcArgs) + // break + //case "DEPLOY_K8S_MIDDLEWARES": + // resultOK, result = op.deployMiddlewares(funcArgs) + // break + //case "DEPLOY_K8S_REDIS": + // resultOK, result = op.deployRedis(funcArgs) + // break + //case "DEPLOY_INGRESS": + // resultOK, result = op.deployIngress(funcArgs) + // break + //case "DEPLOY_FRONTEND": + // resultOK, result = op.deployFront(funcArgs) + // break + //case "INIT_MINIO": + // resultOK, result = op.initMinio(funcArgs) + // break + //case "DEPLOY_K8S_SRS": + // resultOK, result = op.deploySRS(funcArgs) + // break + //case "deployGDR": + // resultOK, result = op.deployGDR(funcArgs) + // break + //case "MODIFY_NACOS": + // resultOK, result = op.modifyNacos(funcArgs) + // break + //case "DEPLOY_BACKEND": + // resultOK, result = op.deployBackend(funcArgs) + // break + //default: + // op.ok(funcArgs) + //} // debug - log.DebugF("app deploy of %s result is %v", appFuncName, result) + log.DebugF("app deploy of %s result is %v", appFuncName, "null function!") - return resultOK, result + return true, []string{} } -func CheckAppInstallFolder() (bool, []string) { - if !BasicCreateFolder("/root/wdd/install") { - return false, []string{ - "[CheckAppInstallFolder] - install folder create failed !", - } - } - - return true, nil -} - -func (op *AgentOsOperator) deployRke(funcArgs []string) (bool, []string) { - - var ok bool - var resultLog []string - // download rke - // download kubectl - // download rke-cluster.yml - ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"rke", "/usr/local/bin/rke") - if !ok { - return false, resultLog - } - ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"kubectl", "/usr/local/bin/kubectl") - if !ok { - return false, resultLog - } - ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"rke-cluster-template.yaml", "/root/wdd/cluster.yml") - if !ok { - return false, resultLog - } - - AllCompleteExecutor([][]string{ - { - "chmod", - "+x", - "/usr/local/bin/rke", - }, - { - "chmod", - "+x", - "/usr/local/bin/kubectl", - }, - }) - - if !BasicCreateFolder("/root/.kube") { - return false, []string{ - "[deployRke] - folder [/root/.kube] create error!", - } - } - - // replace ip addr - parseIP := net.ParseIP(funcArgs[0]) - if parseIP == nil { - return false, []string{ - "[deployRke] - ip args error !", - } - } - if !BasicReplace("/root/wdd/cluster.yml", "A1C2IP", funcArgs[0]) { - log.ErrorF("[deployRke] - rke config replace error !") - } - - return true, []string{ - "[deployRke] - rke dependency download success !", - } -} - -func (op *AgentOsOperator) deployK8sDashboard(funcArgs []string) (bool, []string) { - - // check folder - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // download template file - k8sDashBoardYamlFile := "/root/wdd/install/k8s-dashboard.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+"k8s-dashboard-template.yaml", k8sDashBoardYamlFile) - if !ok { - return false, resultLog - } - - // kubectl - - // replace - parseIP := net.ParseIP(funcArgs[0]) - if parseIP == nil { - return false, []string{ - "[deployK8sDashboard] - ip args error !", - } - } - BasicReplace(k8sDashBoardYamlFile, "A1C2IP", funcArgs[0]) - - // up - applyExec, resultLog := KubectlApplyExec(k8sDashBoardYamlFile) - if !applyExec { - return false, resultLog - } - - // check deployment ok - if !K8sCheckDeploymentStatusTimeout("kubernetes-dashboard", "kube-system", 120) { - return false, []string{ - "[deployK8sDashboard] - deployment run error !", - } - } - - return true, nil -} - -func (op *AgentOsOperator) deployK8sNamespace(funcArgs []string) (bool, []string) { - - if !K8sCreateNamespace(funcArgs[1]) { - return false, []string{ - fmt.Sprintf("Namespace of [%s] create error!", funcArgs[1]), - } - } - - return true, []string{ - fmt.Sprintf("Namespace of [%s] create success !", funcArgs[1]), - } -} - -func (op *AgentOsOperator) deployMinio(funcArgs []string) (bool, []string) { - minioTemplateFileName := "minio-docker-compose.yaml" - result := append(AppExecuteErrorLogPrefix, "部署MINIO") - // 逻辑为接收执行,但是会报错 - - // 环境判定 - commandExist, commandName := BasicCommandExistsBatch([]string{ - "docker-compose", - }) - if !commandExist { - result = append(result, "命令不存在", commandName) - return false, result - } - // 磁盘空间足够 - // 目录存在 - - // 下载模板文件 - if !PureResultSingleExecute([]string{ - "wget", - "-q", - op.OssOfflinePrefix + "/" + minioTemplateFileName, - }) { - result = append(result, "下载模板文件") - return false, result - } - // 根据参数 A1C2IP 替换 - if !BasicReplace(minioTemplateFileName, "A1C2IP", funcArgs[0]) { - result = append(result, "替换IP信息") - return false, result - } - - // 启动服务 - if !PureResultSingleExecute([]string{ - "docker-compose", - "-f", - minioTemplateFileName, - "up", - "-d", - }) { - result = append(result, "启动minio失败!") - return false, result - } - - // 成功启动 - return true, []string{ - "MINIO安装成功!", - "输入如下命令查看启动情况: ", - "docker-compose logs minio1", - } -} - -func (op *AgentOsOperator) deployNFS(funcArgs []string) (bool, []string) { - - nfsTemplateFile := "k8s-nfs-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署NFS") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 创建目录修改权限 - if !BasicFolderExists(nfsDataPath) { - return false, []string{ - fmt.Sprintf("[deployNFS] - folder of [ %s ] not exist ! nfs not installed ", nfsDataPath), - } - } - - // 下载模板文件 - k8sNFSYamlFile := "/root/wdd/install/k8s-nfs.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) - if !ok { - return false, resultLog - } - - // 根据参数 A1C2IP 替换 - ip := net.ParseIP(funcArgs[0]) - if ip == nil { - return false, append(result, - "ip args error !") - } - if !BasicReplace(k8sNFSYamlFile, "N1C2IP", funcArgs[0]) { - result = append(result, "替换IP信息") - return false, result - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sNFSYamlFile) - if !exec { - return false, strings - } - - // check running status - if !K8sCheckDeploymentStatusTimeout("nfs-client-provisioner", "kube-system", 60) { - return false, []string{ - "[deployNFS] - nfs running error !", - } - } - - // 成功启动 - return true, []string{ - "NFS部署成功!", - } -} - -func (op *AgentOsOperator) deployTestNFS(funcArgs []string) (bool, []string) { - - nfsTemplateFile := "k8s-nfs-test-template.yaml" - result := append(AppExecuteErrorLogPrefix, "测试NFS部署") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sNFSYamlFile := "/root/wdd/install/k8s-nfs-test.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) - if !ok { - return false, resultLog - } - // 根据参数 A1C2IP 替换 - ip := net.ParseIP(funcArgs[0]) - if ip == nil { - return false, append(result, - "ip args error !") - } - if !BasicReplace(k8sNFSYamlFile, "N1C2IP", funcArgs[0]) { - result = append(result, "替换IP信息") - return false, result - } - - // 启动服务 - // 启动服务 - exec, strings := KubectlApplyExec(k8sNFSYamlFile) - if !exec { - return false, strings - } - - // 测试文件是否存在 - commandExecutor, _ := HardCodeCommandExecutor("test -f " + nfsDataPath + "/default-test-claim-pvc*/NFS-CREATE-SUCCESS") - if !commandExecutor { - log.WarnF("[deployTestNFS] - test nfs file write error !") - } - - if !K8sCheckPodStatusTimeout("test-pod", "default", 30) { - return false, []string{ - "[deployTestNFS] - test pod create failed !", - } - } - - // 成功启动 - return true, []string{ - "[deployTestNFS] - NFS 测试功能正常!", - } -} - -func (op *AgentOsOperator) deployPVC(funcArgs []string) (bool, []string) { - - pvcTemplateFile := "k8s-pvc-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署PVC") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sPvcYamlFile := "/root/wdd/install/k8s-pvc.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+pvcTemplateFile, k8sPvcYamlFile) - if !ok { - return false, resultLog - } - // 根据参数 A1C2IP 替换 - if !BasicReplace(k8sPvcYamlFile, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - // 替换版本号 - if !BasicReplace(k8sPvcYamlFile, "KIMMY", funcArgs[6]) { - log.WarnF("[deployPVC] - pvc config version replace error , expected => %s", funcArgs[6]) - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sPvcYamlFile) - if !exec { - return false, strings - } - - // check status - ok, pvcList := K8sListPVCInNamespace(funcArgs[1]) - if !ok { - return false, []string{ - "[deployPVC] - pvc list error ! can not check status !", - } - } - - for _, pvcName := range pvcList { - if !K8sCheckPVCStatusTimeOut(pvcName, funcArgs[1], 30) { - return false, []string{ - fmt.Sprintf("[deployPVC] - pvc [%s] in namepsace [%s] running error !", pvcName, funcArgs[1]), - } - } - } - - // 成功启动 - return true, append(pvcList, "PVC部署成功!") -} - -func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) { - - mysqlTemplate := "k8s-mysql-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署 MySQL !") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sMysqlYamlFile := "/root/wdd/install/k8s-mysql.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+mysqlTemplate, k8sMysqlYamlFile) - if !ok { - return false, resultLog - } - // 根据参数 A1C2IP 替换 - ip := net.ParseIP(funcArgs[0]) - if ip == nil { - return false, append(result, - "ip args error !") - } - if !BasicReplace(k8sMysqlYamlFile, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - - // 替换SUPREME信 - if !BasicReplace(k8sMysqlYamlFile, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sMysqlYamlFile) - if !exec { - return false, append(result, strings...) - } - - // check mysql - if !K8sCheckPodStatusTimeout("helm-mysql-0", funcArgs[1], 180) { - return false, []string{ - "helm-mysql-0 启动失败!", - } - } - - // 成功启动 - return true, []string{ - "MySQL部署成功!", - } -} - -//func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) { +//func CheckAppInstallFolder() (bool, []string) { +// if !BasicCreateFolder("/root/wdd/install") { +// return false, []string{ +// "[CheckAppInstallFolder] - install folder create failed !", +// } +// } // +// return true, nil +//} +// +//func (op *AgentOsOperator) deployRke(funcArgs []string) (bool, []string) { +// +// var ok bool +// var resultLog []string +// // download rke +// // download kubectl +// // download rke-cluster.yml +// ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"rke", "/usr/local/bin/rke") +// if !ok { +// return false, resultLog +// } +// ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"kubectl", "/usr/local/bin/kubectl") +// if !ok { +// return false, resultLog +// } +// ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"rke-cluster-template.yaml", "/root/wdd/cluster.yml") +// if !ok { +// return false, resultLog +// } +// +// AllCompleteExecutor([][]string{ +// { +// "chmod", +// "+x", +// "/usr/local/bin/rke", +// }, +// { +// "chmod", +// "+x", +// "/usr/local/bin/kubectl", +// }, +// }) +// +// if !BasicCreateFolder("/root/.kube") { +// return false, []string{ +// "[deployRke] - folder [/root/.kube] create error!", +// } +// } +// +// // replace ip addr +// parseIP := net.ParseIP(funcArgs[0]) +// if parseIP == nil { +// return false, []string{ +// "[deployRke] - ip args error !", +// } +// } +// if !BasicReplace("/root/wdd/cluster.yml", "A1C2IP", funcArgs[0]) { +// log.ErrorF("[deployRke] - rke config replace error !") +// } +// +// return true, []string{ +// "[deployRke] - rke dependency download success !", +// } +//} +// +//func (op *AgentOsOperator) deployK8sDashboard(funcArgs []string) (bool, []string) { +// +// // check folder // folder, i := CheckAppInstallFolder() // if !folder { // return false, i // } // -// // download offline sql list -// if len(funcArgs) <= 7 { -// return false, []string{ -// "[loadMysqlInitScript]- MySQL初始化参数有误! 无法进行初始化", -// } -// } -// -// jackeyLove := funcArgs[7] -// if !strings.HasSuffix(jackeyLove, "tar") { -// return false, []string{ -// "[loadMysqlInitScript]- jackeyLove 有误!", -// } -// } -// log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove) -// -// jackeyLoveLocalPrefix := "/root/wdd/jackeylove/" -// PureResultSingleExecute([]string{ -// "rm", -// "-f", -// jackeyLoveLocalPrefix, -// }) -// BasicCreateFolder(jackeyLoveLocalPrefix) -// -// jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0] -// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove) +// // download template file +// k8sDashBoardYamlFile := "/root/wdd/install/k8s-dashboard.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+"k8s-dashboard-template.yaml", k8sDashBoardYamlFile) // if !ok { -// return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!") +// return false, resultLog // } // -// // unzip -// if !PureResultSingleExecute([]string{ -// "tar", -// "-vxf", -// jackeyLoveLocalPrefix + jackeyLove, -// "-C", -// jackeyLoveLocalPrefix, -// }) { -// return false, []string{ -// "[loadMysqlInitScript]- jackeyLove unzip error !", -// } -// } +// // kubectl // -// // list all sql file and sort and convert to []string -// files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder) -// if err != nil { -// return false, []string{ -// "[loadMysqlInitScript]- read unzipped jackeylove error !", -// } -// } -// -// var jackeyLoveFileList []string -// for _, file := range files { -// if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" { -// jackeyLoveFileList = append(jackeyLoveFileList, file.Name()) -// } -// } -// -// // sort for numeric order -// sortFileNames(jackeyLoveFileList) -// var jackeyLoveFileAbsolutePath []string -// for _, jackeyLoveFile := range jackeyLoveFileList { -// jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile) -// } -// -// log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath) -// -// // dispatch mysql execution command -// jackeyLoveIP := funcArgs[0] -// parseIP := net.ParseIP(jackeyLoveIP) +// // replace +// parseIP := net.ParseIP(funcArgs[0]) // if parseIP == nil { // return false, []string{ -// "[loadMysqlInitScript]- ip config error !", +// "[deployK8sDashboard] - ip args error !", // } // } -// load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath) -// if !load { +// BasicReplace(k8sDashBoardYamlFile, "A1C2IP", funcArgs[0]) +// +// // up +// applyExec, resultLog := KubectlApplyExec(k8sDashBoardYamlFile) +// if !applyExec { +// return false, resultLog +// } +// +// // check deployment ok +// if !K8sCheckDeploymentStatusTimeout("kubernetes-dashboard", "kube-system", 120) { +// return false, []string{ +// "[deployK8sDashboard] - deployment run error !", +// } +// } +// +// return true, nil +//} +// +//func (op *AgentOsOperator) deployK8sNamespace(funcArgs []string) (bool, []string) { +// +// if !K8sCreateNamespace(funcArgs[1]) { +// return false, []string{ +// fmt.Sprintf("Namespace of [%s] create error!", funcArgs[1]), +// } +// } +// +// return true, []string{ +// fmt.Sprintf("Namespace of [%s] create success !", funcArgs[1]), +// } +//} +// +//func (op *AgentOsOperator) deployMinio(funcArgs []string) (bool, []string) { +// minioTemplateFileName := "minio-docker-compose.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署MINIO") +// // 逻辑为接收执行,但是会报错 +// +// // 环境判定 +// commandExist, commandName := BasicCommandExistsBatch([]string{ +// "docker-compose", +// }) +// if !commandExist { +// result = append(result, "命令不存在", commandName) +// return false, result +// } +// // 磁盘空间足够 +// // 目录存在 +// +// // 下载模板文件 +// if !PureResultSingleExecute([]string{ +// "wget", +// "-q", +// op.OssOfflinePrefix + "/" + minioTemplateFileName, +// }) { +// result = append(result, "下载模板文件") +// return false, result +// } +// // 根据参数 A1C2IP 替换 +// if !BasicReplace(minioTemplateFileName, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换IP信息") // return false, result // } // -// return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !") +// // 启动服务 +// if !PureResultSingleExecute([]string{ +// "docker-compose", +// "-f", +// minioTemplateFileName, +// "up", +// "-d", +// }) { +// result = append(result, "启动minio失败!") +// return false, result +// } +// +// // 成功启动 +// return true, []string{ +// "MINIO安装成功!", +// "输入如下命令查看启动情况: ", +// "docker-compose logs minio1", +// } +//} +// +//func (op *AgentOsOperator) deployNFS(funcArgs []string) (bool, []string) { +// +// nfsTemplateFile := "k8s-nfs-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署NFS") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 创建目录修改权限 +// if !BasicFolderExists(nfsDataPath) { +// return false, []string{ +// fmt.Sprintf("[deployNFS] - folder of [ %s ] not exist ! nfs not installed ", nfsDataPath), +// } +// } +// +// // 下载模板文件 +// k8sNFSYamlFile := "/root/wdd/install/k8s-nfs.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) +// if !ok { +// return false, resultLog +// } +// +// // 根据参数 A1C2IP 替换 +// ip := net.ParseIP(funcArgs[0]) +// if ip == nil { +// return false, append(result, +// "ip args error !") +// } +// if !BasicReplace(k8sNFSYamlFile, "N1C2IP", funcArgs[0]) { +// result = append(result, "替换IP信息") +// return false, result +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sNFSYamlFile) +// if !exec { +// return false, strings +// } +// +// // check running status +// if !K8sCheckDeploymentStatusTimeout("nfs-client-provisioner", "kube-system", 60) { +// return false, []string{ +// "[deployNFS] - nfs running error !", +// } +// } +// +// // 成功启动 +// return true, []string{ +// "NFS部署成功!", +// } +//} +// +//func (op *AgentOsOperator) deployTestNFS(funcArgs []string) (bool, []string) { +// +// nfsTemplateFile := "k8s-nfs-test-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "测试NFS部署") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sNFSYamlFile := "/root/wdd/install/k8s-nfs-test.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) +// if !ok { +// return false, resultLog +// } +// // 根据参数 A1C2IP 替换 +// ip := net.ParseIP(funcArgs[0]) +// if ip == nil { +// return false, append(result, +// "ip args error !") +// } +// if !BasicReplace(k8sNFSYamlFile, "N1C2IP", funcArgs[0]) { +// result = append(result, "替换IP信息") +// return false, result +// } +// +// // 启动服务 +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sNFSYamlFile) +// if !exec { +// return false, strings +// } +// +// // 测试文件是否存在 +// commandExecutor, _ := HardCodeCommandExecutor("test -f " + nfsDataPath + "/default-test-claim-pvc*/NFS-CREATE-SUCCESS") +// if !commandExecutor { +// log.WarnF("[deployTestNFS] - test nfs file write error !") +// } +// +// if !K8sCheckPodStatusTimeout("test-pod", "default", 30) { +// return false, []string{ +// "[deployTestNFS] - test pod create failed !", +// } +// } +// +// // 成功启动 +// return true, []string{ +// "[deployTestNFS] - NFS 测试功能正常!", +// } +//} +// +//func (op *AgentOsOperator) deployPVC(funcArgs []string) (bool, []string) { +// +// pvcTemplateFile := "k8s-pvc-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署PVC") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sPvcYamlFile := "/root/wdd/install/k8s-pvc.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+pvcTemplateFile, k8sPvcYamlFile) +// if !ok { +// return false, resultLog +// } +// // 根据参数 A1C2IP 替换 +// if !BasicReplace(k8sPvcYamlFile, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// // 替换版本号 +// if !BasicReplace(k8sPvcYamlFile, "KIMMY", funcArgs[6]) { +// log.WarnF("[deployPVC] - pvc config version replace error , expected => %s", funcArgs[6]) +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sPvcYamlFile) +// if !exec { +// return false, strings +// } +// +// // check status +// ok, pvcList := K8sListPVCInNamespace(funcArgs[1]) +// if !ok { +// return false, []string{ +// "[deployPVC] - pvc list error ! can not check status !", +// } +// } +// +// for _, pvcName := range pvcList { +// if !K8sCheckPVCStatusTimeOut(pvcName, funcArgs[1], 30) { +// return false, []string{ +// fmt.Sprintf("[deployPVC] - pvc [%s] in namepsace [%s] running error !", pvcName, funcArgs[1]), +// } +// } +// } +// +// // 成功启动 +// return true, append(pvcList, "PVC部署成功!") +//} +// +//func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) { +// +// mysqlTemplate := "k8s-mysql-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署 MySQL !") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sMysqlYamlFile := "/root/wdd/install/k8s-mysql.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+mysqlTemplate, k8sMysqlYamlFile) +// if !ok { +// return false, resultLog +// } +// // 根据参数 A1C2IP 替换 +// ip := net.ParseIP(funcArgs[0]) +// if ip == nil { +// return false, append(result, +// "ip args error !") +// } +// if !BasicReplace(k8sMysqlYamlFile, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// +// // 替换SUPREME信 +// if !BasicReplace(k8sMysqlYamlFile, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sMysqlYamlFile) +// if !exec { +// return false, append(result, strings...) +// } +// +// // check mysql +// if !K8sCheckPodStatusTimeout("helm-mysql-0", funcArgs[1], 180) { +// return false, []string{ +// "helm-mysql-0 启动失败!", +// } +// } +// +// // 成功启动 +// return true, []string{ +// "MySQL部署成功!", +// } +//} +// +////func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) { +//// +//// folder, i := CheckAppInstallFolder() +//// if !folder { +//// return false, i +//// } +//// +//// // download offline sql list +//// if len(funcArgs) <= 7 { +//// return false, []string{ +//// "[loadMysqlInitScript]- MySQL初始化参数有误! 无法进行初始化", +//// } +//// } +//// +//// jackeyLove := funcArgs[7] +//// if !strings.HasSuffix(jackeyLove, "tar") { +//// return false, []string{ +//// "[loadMysqlInitScript]- jackeyLove 有误!", +//// } +//// } +//// log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove) +//// +//// jackeyLoveLocalPrefix := "/root/wdd/jackeylove/" +//// PureResultSingleExecute([]string{ +//// "rm", +//// "-f", +//// jackeyLoveLocalPrefix, +//// }) +//// BasicCreateFolder(jackeyLoveLocalPrefix) +//// +//// jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0] +//// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove) +//// if !ok { +//// return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!") +//// } +//// +//// // unzip +//// if !PureResultSingleExecute([]string{ +//// "tar", +//// "-vxf", +//// jackeyLoveLocalPrefix + jackeyLove, +//// "-C", +//// jackeyLoveLocalPrefix, +//// }) { +//// return false, []string{ +//// "[loadMysqlInitScript]- jackeyLove unzip error !", +//// } +//// } +//// +//// // list all sql file and sort and convert to []string +//// files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder) +//// if err != nil { +//// return false, []string{ +//// "[loadMysqlInitScript]- read unzipped jackeylove error !", +//// } +//// } +//// +//// var jackeyLoveFileList []string +//// for _, file := range files { +//// if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" { +//// jackeyLoveFileList = append(jackeyLoveFileList, file.Name()) +//// } +//// } +//// +//// // sort for numeric order +//// sortFileNames(jackeyLoveFileList) +//// var jackeyLoveFileAbsolutePath []string +//// for _, jackeyLoveFile := range jackeyLoveFileList { +//// jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile) +//// } +//// +//// log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath) +//// +//// // dispatch mysql execution command +//// jackeyLoveIP := funcArgs[0] +//// parseIP := net.ParseIP(jackeyLoveIP) +//// if parseIP == nil { +//// return false, []string{ +//// "[loadMysqlInitScript]- ip config error !", +//// } +//// } +//// load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath) +//// if !load { +//// return false, result +//// } +//// +//// return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !") +//// +////} +// +//func sortFileNames(fileNames []string) { +// re := regexp.MustCompile(`(\d+)_`) +// sort.Slice(fileNames, func(i, j int) bool { +// numStr1 := re.FindStringSubmatch(fileNames[i]) +// numStr2 := re.FindStringSubmatch(fileNames[j]) +// +// num1, _ := strconv.Atoi(numStr1[1]) +// num2, _ := strconv.Atoi(numStr2[1]) +// +// return num1 < num2 +// }) +//} +// +//func (op *AgentOsOperator) checkMySQL(funcArgs []string) (bool, []string) { +// +// if !K8sCheckPodStatusTimeout("helm-mysql-0", funcArgs[0], 180) { +// return false, []string{ +// "helm-mysql 启动失败!", +// } +// } +// +// return true, nil +//} +// +//func (op *AgentOsOperator) deployMiddlewares(funcArgs []string) (bool, []string) { +// +// middlewaresTemplate := "k8s-middleware-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署 所有的中间件 !") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sMiddlewaresYamlFile := "/root/wdd/install/k8s-middlewares.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+middlewaresTemplate, k8sMiddlewaresYamlFile) +// if !ok { +// return false, resultLog +// } +// +// // 根据参数 A1C2IP 替换 +// ip := net.ParseIP(funcArgs[0]) +// if ip == nil { +// return false, append(result, +// "[deployMiddlewares] - ip args error !") +// } +// if !BasicReplace(k8sMiddlewaresYamlFile, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// +// if !BasicReplace(k8sMiddlewaresYamlFile, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// +// // 替换版本号 +// if !BasicReplace(k8sMiddlewaresYamlFile, "KIMMY", funcArgs[6]) { +// log.WarnF("[deployMiddlewares] - pvc config version replace error , expected => %s", funcArgs[6]) +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sMiddlewaresYamlFile) +// if !exec { +// return false, append(result, strings...) +// } +// +// // check status +// podNameList := []string{ +// "helm-rabbitmq-0", +// "helm-mongo-0", +// "helm-emqxs-0", +// "helm-nacos-0", +// } +// for _, podName := range podNameList { +// if !K8sCheckPodStatusTimeout(podName, funcArgs[1], 180) { +// return false, []string{ +// fmt.Sprintf("[deployMiddlewares] - Namepsace [%s] Pod [%s] 启动失败!", funcArgs[1], podName), +// } +// } +// } +// +// // 成功启动 +// return true, append(podNameList, +// "[deployMiddlewares] - 中间件部署成功!", +// ) +// +//} +// +//func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) { +// +// redisTemplate := "k8s-redis-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署 redis !") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sRedisYamlFile := "/root/wdd/install/k8s-redis.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+redisTemplate, k8sRedisYamlFile) +// if !ok { +// return false, resultLog +// } +// +// // 根据参数 A1C2IP 替换 +// ip := net.ParseIP(funcArgs[0]) +// if ip == nil { +// return false, append(result, +// "ip args error !") +// } +// if !BasicReplace(k8sRedisYamlFile, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// +// if !BasicReplace(k8sRedisYamlFile, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sRedisYamlFile) +// if !exec { +// return false, append(result, strings...) +// } +// +// // check status +// if !K8sCheckPodStatusTimeout("helm-redis-master-0", funcArgs[1], 120) { +// return false, []string{ +// "[deployRedis] - redis-master running failed ! please cheak !", +// } +// } +// +// if !K8sCheckPodStatusTimeout("helm-redis-replicas-0", funcArgs[1], 120) { +// return false, []string{ +// "[deployRedis] - redis-replicas running failed ! please check !", +// } +// } +// +// // todo should I check ingress exists ? +// +// // 成功启动 +// return true, []string{ +// "Redis 部署成功!", +// } +// +//} +// +//func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) { +// +// ingressTemplate := "k8s-ingress-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署 Ingress !") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sIngressYamlFile := "/root/wdd/install/k8s-ingress.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+ingressTemplate, k8sIngressYamlFile) +// if !ok { +// return false, resultLog +// } +// +// // 根据参数 A1C2IP 替换 +// parseIP := net.ParseIP(funcArgs[0]) +// if parseIP == nil { +// return false, append(result, "ip args error !") +// } +// if !BasicReplace(k8sIngressYamlFile, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// if !BasicReplace(k8sIngressYamlFile, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// parseIP = net.ParseIP(funcArgs[3]) +// if parseIP == nil { +// return false, append(result, "替换A1C1IP信息 ip args error !") +// } +// if !BasicReplace(k8sIngressYamlFile, "A1C1IP", funcArgs[3]) { +// result = append(result, "替换A1C1IP信息") +// return false, result +// } +// if !BasicReplace(k8sIngressYamlFile, "A1C1JS", funcArgs[4]) { +// result = append(result, "替换A1C1JS信息") +// return false, result +// } +// if !BasicReplace(k8sIngressYamlFile, "KIMMY", funcArgs[6]) { +// result = append(result, "替换KIMMY信息") +// return false, result +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sIngressYamlFile) +// if !exec { +// return false, append(result, strings...) +// } +// +// // 成功启动 +// return true, []string{ +// "Ingress 部署成功!", +// } +//} +// +//func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) { +// +// fontTemplate := "k8s-front-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署 前端服务 !") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sFrontYamlFilePath := "/root/wdd/install/k8s-front.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+fontTemplate, k8sFrontYamlFilePath) +// if !ok { +// return false, resultLog +// } +// +// // 根据参数 A1C2IP 替换 +// parseIP := net.ParseIP(funcArgs[0]) +// if parseIP == nil { +// return false, append(result, "ip args error !") +// } +// if !BasicReplace(k8sFrontYamlFilePath, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// if !BasicReplace(k8sFrontYamlFilePath, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// if !BasicReplace(k8sFrontYamlFilePath, "KIMMY", funcArgs[6]) { +// result = append(result, "替换KIMMY信息") +// return false, result +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sFrontYamlFilePath) +// if !exec { +// return false, append(result, strings...) +// } +// +// // check all front end pod exits! +// +// // 成功启动 +// return true, []string{ +// "前端服务 部署成功!", +// } +// +//} +// +//func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) { +// +// initMinioTemplate := "minio-init.sh" +// result := append(AppExecuteErrorLogPrefix, "进行MINIO初始化服务 !") +// +// // 环境判定 +// commandExist, commandName := BasicCommandExistsBatch([]string{ +// "kubectl", +// }) +// if !commandExist { +// result = append(result, "命令不存在", commandName) +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// if !PureResultSingleExecute([]string{ +// "wget", +// "-q", +// op.OssOfflinePrefix + "/" + initMinioTemplate, +// }) { +// result = append(result, "下载模板文件") +// return false, result +// } +// // 根据参数 A1C2IP 替换 +// if !BasicReplace(initMinioTemplate, "SUPREME", funcArgs[0]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// parseIP := net.ParseIP(funcArgs[0]) +// if parseIP == nil { +// return false, append(result, "ip args error !") +// } +// if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// parseIP = net.ParseIP(funcArgs[5]) +// if parseIP == nil { +// return false, append(result, "ip args error !") +// } +// if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[5]) { +// result = append(result, "替换M2D2IP信息") +// return false, result +// } +// +// // 启动服务 +// if !PureResultSingleExecute([]string{ +// "kubectl", +// "apply", +// "-f", +// initMinioTemplate, +// }) { +// result = append(result, "MINIO 初始化 失败!") +// return false, result +// } +// +// // 成功启动 +// return true, []string{ +// "MINIO 初始化 成功!", +// } +// +//} +// +//func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) { +// +// srsTemplate := "k8s-srs-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "开始部署SRS服务!") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sSRSYamlFilePath := "/root/wdd/install/k8s-srs.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+srsTemplate, k8sSRSYamlFilePath) +// if !ok { +// return false, resultLog +// } +// +// // 根据参数 A1C2IP 替换 +// if !BasicReplace(k8sSRSYamlFilePath, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// parseIP := net.ParseIP(funcArgs[0]) +// if parseIP == nil { +// return false, append(result, "ip args error !", funcArgs[0]) +// } +// if !BasicReplace(k8sSRSYamlFilePath, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// +// // A1C1IP +// parseIP = net.ParseIP(funcArgs[3]) +// if parseIP == nil { +// return false, append(result, "ip args error !", funcArgs[3]) +// } +// if !BasicReplace(k8sSRSYamlFilePath, "A1C1IP", funcArgs[3]) { +// result = append(result, "替换A1C1IP信息") +// return false, result +// } +// if !BasicReplace(k8sSRSYamlFilePath, "A1C1JS", funcArgs[4]) { +// result = append(result, "替换A1C1JS信息") +// return false, result +// } +// +// // M2D2IP +// parseIP = net.ParseIP(funcArgs[5]) +// if parseIP == nil { +// return false, append(result, "ip args error !", funcArgs[5]) +// } +// if !BasicReplace(k8sSRSYamlFilePath, "M2D2IP", funcArgs[5]) { +// result = append(result, "替换M2D2IP信息") +// return false, result +// } +// +// if !BasicReplace(k8sSRSYamlFilePath, "KIMMY", funcArgs[6]) { +// result = append(result, "替换KIMMY信息") +// return false, result +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sSRSYamlFilePath) +// if !exec { +// return false, append(result, strings...) +// } +// +// // check pod ok +// if !K8sCheckPodStatusTimeout("helm-live-srs-rtc-0", funcArgs[1], 120) { +// return false, []string{ +// "helm-live-srs-rtc-0 run failed !", +// } +// } +// if !K8sCheckDeploymentStatusTimeout("helm-live-op-v2", funcArgs[1], 120) { +// return false, []string{ +// "helm-live-op-v2 run failed !", +// } +// } +// +// // 成功启动 +// return true, []string{ +// "部署 SRS 成功!", +// } +// +//} +// +//func (op *AgentOsOperator) deployGDR(funcArgs []string) (bool, []string) { +// +// return true, []string{ +// "请手动进行GDR的部署工作!", +// } +// +//} +// +//func (op *AgentOsOperator) modifyNacos(funcArgs []string) (bool, []string) { +// +// log.Info("请开始进行Nacos的配置修改工作!") +// log.Info("请开始进行Nacos的配置修改工作!") +// +// after := time.After(120 * time.Second) +// +// <-after +// +// msg := "等待Nacos的配置结束!" +// log.Info(msg) +// +// return true, []string{msg} +//} +// +//func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) { +// +// backendTemplate := "k8s-backend-template.yaml" +// result := append(AppExecuteErrorLogPrefix, "部署 后端 服务 !") +// +// // 环境判定 +// if !BasicCommandExistByPath("kubectl") { +// result = append(result, "命令不存在", "kubectl") +// return false, result +// } +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // 下载模板文件 +// k8sBackendYamlFilePath := "/root/wdd/install/k8s-backend.yaml" +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+backendTemplate, k8sBackendYamlFilePath) +// if !ok { +// return false, resultLog +// } +// +// // 根据参数 A1C2IP 替换 +// parseIP := net.ParseIP(funcArgs[0]) +// if parseIP == nil { +// return false, append(result, "ip args error !") +// } +// if !BasicReplace(k8sBackendYamlFilePath, "A1C2IP", funcArgs[0]) { +// result = append(result, "替换A1C2IP信息") +// return false, result +// } +// if !BasicReplace(k8sBackendYamlFilePath, "SUPREME", funcArgs[1]) { +// result = append(result, "替换SUPREME信息") +// return false, result +// } +// if !BasicReplace(k8sBackendYamlFilePath, "KIMMY", funcArgs[6]) { +// result = append(result, "替换KIMMY信息") +// return false, result +// } +// +// // 启动服务 +// exec, strings := KubectlApplyExec(k8sBackendYamlFilePath) +// if !exec { +// return false, append(result, strings...) +// } +// +// // check all front end pod exits! +// +// // 成功启动 +// return true, []string{ +// "后端服务 部署成功!", +// } // //} - -func sortFileNames(fileNames []string) { - re := regexp.MustCompile(`(\d+)_`) - sort.Slice(fileNames, func(i, j int) bool { - numStr1 := re.FindStringSubmatch(fileNames[i]) - numStr2 := re.FindStringSubmatch(fileNames[j]) - - num1, _ := strconv.Atoi(numStr1[1]) - num2, _ := strconv.Atoi(numStr2[1]) - - return num1 < num2 - }) -} - -func (op *AgentOsOperator) checkMySQL(funcArgs []string) (bool, []string) { - - if !K8sCheckPodStatusTimeout("helm-mysql-0", funcArgs[0], 180) { - return false, []string{ - "helm-mysql 启动失败!", - } - } - - return true, nil -} - -func (op *AgentOsOperator) deployMiddlewares(funcArgs []string) (bool, []string) { - - middlewaresTemplate := "k8s-middleware-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署 所有的中间件 !") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sMiddlewaresYamlFile := "/root/wdd/install/k8s-middlewares.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+middlewaresTemplate, k8sMiddlewaresYamlFile) - if !ok { - return false, resultLog - } - - // 根据参数 A1C2IP 替换 - ip := net.ParseIP(funcArgs[0]) - if ip == nil { - return false, append(result, - "[deployMiddlewares] - ip args error !") - } - if !BasicReplace(k8sMiddlewaresYamlFile, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - - if !BasicReplace(k8sMiddlewaresYamlFile, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - - // 替换版本号 - if !BasicReplace(k8sMiddlewaresYamlFile, "KIMMY", funcArgs[6]) { - log.WarnF("[deployMiddlewares] - pvc config version replace error , expected => %s", funcArgs[6]) - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sMiddlewaresYamlFile) - if !exec { - return false, append(result, strings...) - } - - // check status - podNameList := []string{ - "helm-rabbitmq-0", - "helm-mongo-0", - "helm-emqxs-0", - "helm-nacos-0", - } - for _, podName := range podNameList { - if !K8sCheckPodStatusTimeout(podName, funcArgs[1], 180) { - return false, []string{ - fmt.Sprintf("[deployMiddlewares] - Namepsace [%s] Pod [%s] 启动失败!", funcArgs[1], podName), - } - } - } - - // 成功启动 - return true, append(podNameList, - "[deployMiddlewares] - 中间件部署成功!", - ) - -} - -func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) { - - redisTemplate := "k8s-redis-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署 redis !") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sRedisYamlFile := "/root/wdd/install/k8s-redis.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+redisTemplate, k8sRedisYamlFile) - if !ok { - return false, resultLog - } - - // 根据参数 A1C2IP 替换 - ip := net.ParseIP(funcArgs[0]) - if ip == nil { - return false, append(result, - "ip args error !") - } - if !BasicReplace(k8sRedisYamlFile, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - - if !BasicReplace(k8sRedisYamlFile, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sRedisYamlFile) - if !exec { - return false, append(result, strings...) - } - - // check status - if !K8sCheckPodStatusTimeout("helm-redis-master-0", funcArgs[1], 120) { - return false, []string{ - "[deployRedis] - redis-master running failed ! please cheak !", - } - } - - if !K8sCheckPodStatusTimeout("helm-redis-replicas-0", funcArgs[1], 120) { - return false, []string{ - "[deployRedis] - redis-replicas running failed ! please check !", - } - } - - // todo should I check ingress exists ? - - // 成功启动 - return true, []string{ - "Redis 部署成功!", - } - -} - -func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) { - - ingressTemplate := "k8s-ingress-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署 Ingress !") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sIngressYamlFile := "/root/wdd/install/k8s-ingress.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+ingressTemplate, k8sIngressYamlFile) - if !ok { - return false, resultLog - } - - // 根据参数 A1C2IP 替换 - parseIP := net.ParseIP(funcArgs[0]) - if parseIP == nil { - return false, append(result, "ip args error !") - } - if !BasicReplace(k8sIngressYamlFile, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - if !BasicReplace(k8sIngressYamlFile, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - parseIP = net.ParseIP(funcArgs[3]) - if parseIP == nil { - return false, append(result, "替换A1C1IP信息 ip args error !") - } - if !BasicReplace(k8sIngressYamlFile, "A1C1IP", funcArgs[3]) { - result = append(result, "替换A1C1IP信息") - return false, result - } - if !BasicReplace(k8sIngressYamlFile, "A1C1JS", funcArgs[4]) { - result = append(result, "替换A1C1JS信息") - return false, result - } - if !BasicReplace(k8sIngressYamlFile, "KIMMY", funcArgs[6]) { - result = append(result, "替换KIMMY信息") - return false, result - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sIngressYamlFile) - if !exec { - return false, append(result, strings...) - } - - // 成功启动 - return true, []string{ - "Ingress 部署成功!", - } -} - -func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) { - - fontTemplate := "k8s-front-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署 前端服务 !") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sFrontYamlFilePath := "/root/wdd/install/k8s-front.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+fontTemplate, k8sFrontYamlFilePath) - if !ok { - return false, resultLog - } - - // 根据参数 A1C2IP 替换 - parseIP := net.ParseIP(funcArgs[0]) - if parseIP == nil { - return false, append(result, "ip args error !") - } - if !BasicReplace(k8sFrontYamlFilePath, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - if !BasicReplace(k8sFrontYamlFilePath, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - if !BasicReplace(k8sFrontYamlFilePath, "KIMMY", funcArgs[6]) { - result = append(result, "替换KIMMY信息") - return false, result - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sFrontYamlFilePath) - if !exec { - return false, append(result, strings...) - } - - // check all front end pod exits! - - // 成功启动 - return true, []string{ - "前端服务 部署成功!", - } - -} - -func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) { - - initMinioTemplate := "minio-init.sh" - result := append(AppExecuteErrorLogPrefix, "进行MINIO初始化服务 !") - - // 环境判定 - commandExist, commandName := BasicCommandExistsBatch([]string{ - "kubectl", - }) - if !commandExist { - result = append(result, "命令不存在", commandName) - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - if !PureResultSingleExecute([]string{ - "wget", - "-q", - op.OssOfflinePrefix + "/" + initMinioTemplate, - }) { - result = append(result, "下载模板文件") - return false, result - } - // 根据参数 A1C2IP 替换 - if !BasicReplace(initMinioTemplate, "SUPREME", funcArgs[0]) { - result = append(result, "替换SUPREME信息") - return false, result - } - parseIP := net.ParseIP(funcArgs[0]) - if parseIP == nil { - return false, append(result, "ip args error !") - } - if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - parseIP = net.ParseIP(funcArgs[5]) - if parseIP == nil { - return false, append(result, "ip args error !") - } - if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[5]) { - result = append(result, "替换M2D2IP信息") - return false, result - } - - // 启动服务 - if !PureResultSingleExecute([]string{ - "kubectl", - "apply", - "-f", - initMinioTemplate, - }) { - result = append(result, "MINIO 初始化 失败!") - return false, result - } - - // 成功启动 - return true, []string{ - "MINIO 初始化 成功!", - } - -} - -func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) { - - srsTemplate := "k8s-srs-template.yaml" - result := append(AppExecuteErrorLogPrefix, "开始部署SRS服务!") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sSRSYamlFilePath := "/root/wdd/install/k8s-srs.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+srsTemplate, k8sSRSYamlFilePath) - if !ok { - return false, resultLog - } - - // 根据参数 A1C2IP 替换 - if !BasicReplace(k8sSRSYamlFilePath, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - parseIP := net.ParseIP(funcArgs[0]) - if parseIP == nil { - return false, append(result, "ip args error !", funcArgs[0]) - } - if !BasicReplace(k8sSRSYamlFilePath, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - - // A1C1IP - parseIP = net.ParseIP(funcArgs[3]) - if parseIP == nil { - return false, append(result, "ip args error !", funcArgs[3]) - } - if !BasicReplace(k8sSRSYamlFilePath, "A1C1IP", funcArgs[3]) { - result = append(result, "替换A1C1IP信息") - return false, result - } - if !BasicReplace(k8sSRSYamlFilePath, "A1C1JS", funcArgs[4]) { - result = append(result, "替换A1C1JS信息") - return false, result - } - - // M2D2IP - parseIP = net.ParseIP(funcArgs[5]) - if parseIP == nil { - return false, append(result, "ip args error !", funcArgs[5]) - } - if !BasicReplace(k8sSRSYamlFilePath, "M2D2IP", funcArgs[5]) { - result = append(result, "替换M2D2IP信息") - return false, result - } - - if !BasicReplace(k8sSRSYamlFilePath, "KIMMY", funcArgs[6]) { - result = append(result, "替换KIMMY信息") - return false, result - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sSRSYamlFilePath) - if !exec { - return false, append(result, strings...) - } - - // check pod ok - if !K8sCheckPodStatusTimeout("helm-live-srs-rtc-0", funcArgs[1], 120) { - return false, []string{ - "helm-live-srs-rtc-0 run failed !", - } - } - if !K8sCheckDeploymentStatusTimeout("helm-live-op-v2", funcArgs[1], 120) { - return false, []string{ - "helm-live-op-v2 run failed !", - } - } - - // 成功启动 - return true, []string{ - "部署 SRS 成功!", - } - -} - -func (op *AgentOsOperator) deployGDR(funcArgs []string) (bool, []string) { - - return true, []string{ - "请手动进行GDR的部署工作!", - } - -} - -func (op *AgentOsOperator) modifyNacos(funcArgs []string) (bool, []string) { - - log.Info("请开始进行Nacos的配置修改工作!") - log.Info("请开始进行Nacos的配置修改工作!") - - after := time.After(120 * time.Second) - - <-after - - msg := "等待Nacos的配置结束!" - log.Info(msg) - - return true, []string{msg} -} - -func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) { - - backendTemplate := "k8s-backend-template.yaml" - result := append(AppExecuteErrorLogPrefix, "部署 后端 服务 !") - - // 环境判定 - if !BasicCommandExistByPath("kubectl") { - result = append(result, "命令不存在", "kubectl") - return false, result - } - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // 下载模板文件 - k8sBackendYamlFilePath := "/root/wdd/install/k8s-backend.yaml" - ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+backendTemplate, k8sBackendYamlFilePath) - if !ok { - return false, resultLog - } - - // 根据参数 A1C2IP 替换 - parseIP := net.ParseIP(funcArgs[0]) - if parseIP == nil { - return false, append(result, "ip args error !") - } - if !BasicReplace(k8sBackendYamlFilePath, "A1C2IP", funcArgs[0]) { - result = append(result, "替换A1C2IP信息") - return false, result - } - if !BasicReplace(k8sBackendYamlFilePath, "SUPREME", funcArgs[1]) { - result = append(result, "替换SUPREME信息") - return false, result - } - if !BasicReplace(k8sBackendYamlFilePath, "KIMMY", funcArgs[6]) { - result = append(result, "替换KIMMY信息") - return false, result - } - - // 启动服务 - exec, strings := KubectlApplyExec(k8sBackendYamlFilePath) - if !exec { - return false, append(result, strings...) - } - - // check all front end pod exits! - - // 成功启动 - return true, []string{ - "后端服务 部署成功!", - } - -} diff --git a/agent-go/a_executor/BaseFunction.go b/agent-go/a_executor/BaseFunction.go index f668f4a..908bc46 100755 --- a/agent-go/a_executor/BaseFunction.go +++ b/agent-go/a_executor/BaseFunction.go @@ -12,6 +12,7 @@ import ( ) var OctopusAgentInstallPrefix = "/root/wdd/" +var nfsDataPath = "/var/lib/docker/nfs_data" type BaseFunc interface { @@ -500,6 +501,41 @@ func (op *AgentOsOperator) InstallDefaultSshBastion() (bool, []string) { } } +func (op *AgentOsOperator) ModifySSHConfigBastion() (bool, []string) { + // 替换sshd文件 + sshdConfigFile := "/etc/ssh/sshd_config" + sshConfigBackupFile := "/etc/ssh/sshd_config_wdd_back" + + // 只备份第一次 + if !BasicFileExistAndNotNull(sshConfigBackupFile) { + BasicAppendOverwriteContentToFile(sshdConfigFile, sshConfigBackupFile) + } + + // AllowTcpForwarding yes + // AllowAgentForwarding yes + // X11Forwarding yes + // StrictMode no + // PermitRootLogin yes + // PasswordAuthentication yes + // PubkeyAuthentication yes + + // 直接使用默认的sshd_config配置 + if !BasicAppendOverwriteContentToFile(beans.DefaultSshdConfig, sshdConfigFile) { + return false, []string{ + "error write default sshd config to sshd file", + } + } + + ok, resultLog := BasicSystemdRestart("sshd") + if !ok { + return false, []string{ + "sshd restart failed ! please check !", + } + } + + return true, resultLog +} + func (op *AgentOsOperator) removeDocker() [][]string { removeDockerLine := append(op.RemoveCommandPrefix, []string{ diff --git a/agent-go/a_executor/BasicFunction.go b/agent-go/a_executor/BasicFunction.go index d9358eb..863a03e 100755 --- a/agent-go/a_executor/BasicFunction.go +++ b/agent-go/a_executor/BasicFunction.go @@ -583,6 +583,34 @@ func BasicSystemdUp(serviceName string) (ok bool, resultLog []string) { return resultOK, resultLog } +// BasicSystemdRestart 使用Systemd 重启 服务,会判定服务器是否存在 +func BasicSystemdRestart(serviceName string) (ok bool, resultLog []string) { + + if !strings.HasSuffix(serviceName, ".service") { + serviceName = serviceName + ".service" + } + // 检查是否存在 + existService := BasicFileExistInFolder(serviceName, "/lib/systemd/system/", + "/etc/systemd/system") + if !existService { + return true, []string{ + serviceName, + "该服务不存在!", + } + } + + // 关闭 + var restartCommand = []string{ + "systemctl", + "restart", + serviceName, + } + + resultOK := PureResultSingleExecute(restartCommand) + + return resultOK, resultLog +} + // BasicTransPipelineCommand 转换手写的管道命令为可执行的形式 func BasicTransPipelineCommand(pipelineString string) (pipelineCommand [][]string) { @@ -839,10 +867,8 @@ func BasicAppendContentToFile(content string, targetFile string) bool { // BasicAppendOverwriteContentToFile 向目标文件中写入一些内容,覆盖源文件 func BasicAppendOverwriteContentToFile(content string, targetFile string) bool { - err := os.Remove(targetFile) - if err != nil { - log.WarnF("[BasicAppendOverwriteContentToFile] - Error removing file: %s , error is %s", targetFile, err.Error()) - } + // 删除文件,直接覆写 + _ = os.Remove(targetFile) return BasicAppendContentToFile(content, targetFile) } diff --git a/agent-go/a_executor/CommandExecutor.go b/agent-go/a_executor/CommandExecutor.go index 58d7a66..12698d6 100755 --- a/agent-go/a_executor/CommandExecutor.go +++ b/agent-go/a_executor/CommandExecutor.go @@ -102,25 +102,33 @@ func Execute(em *ExecutionMessage) (bool, []string) { } else if strings.HasPrefix(em.ExecutionType, "HARBOR") { // harbor function - if em.FuncContent == nil || len(em.FuncContent) <= 1 { - ok = false - resultLog = []string{ - "[Harbor Execute] - functions args is wrong!", - } + //if em.FuncContent == nil || len(em.FuncContent) <= 1 { + // ok = false + // resultLog = []string{ + // "[Harbor Execute] - functions args is wrong!", + // } + //} + //// Harbor Execute + //ok, resultLog = HarborOperatorCache.Exec(em.FuncContent[0], em.FuncContent[1:]...) + ok = true + resultLog = []string{ + "null function!", } - // Harbor Execute - ok, resultLog = HarborOperatorCache.Exec(em.FuncContent[0], em.FuncContent[1:]...) } else if strings.HasPrefix(em.ExecutionType, "IMAGE") { // image function - if em.FuncContent == nil || len(em.FuncContent) <= 1 { - ok = false - resultLog = []string{ - "[Harbor Execute] - functions args is wrong!", - } + //if em.FuncContent == nil || len(em.FuncContent) <= 1 { + // ok = false + // resultLog = []string{ + // "[Harbor Execute] - functions args is wrong!", + // } + //} + //// Harbor Execute + //ok, resultLog = AgentOsOperatorCache.Sync(em.FuncContent[0], em.FuncContent[1:]...) + ok = true + resultLog = []string{ + "null function!", } - // Harbor Execute - ok, resultLog = AgentOsOperatorCache.Sync(em.FuncContent[0], em.FuncContent[1:]...) } else { // deprecated // shell command diff --git a/agent-go/a_executor/HarborExecutor.go b/agent-go/a_executor/HarborExecutor.go index a2c76f9..18ff0ef 100755 --- a/agent-go/a_executor/HarborExecutor.go +++ b/agent-go/a_executor/HarborExecutor.go @@ -1,413 +1,414 @@ package a_executor -import ( - "context" - "encoding/json" - "fmt" - "os" - "strconv" - "strings" - - "github.com/mittwald/goharbor-client/v5/apiv2" - "github.com/mittwald/goharbor-client/v5/apiv2/model" -) - -type HarborOperator struct { - SourceHarborHost string `json:"sourceHarborHost,omitempty"` - - TargetHarborHost string `json:"targetHarborHost,omitempty"` - - HarborPort string `json:"harborPort,omitempty"` - - HarborAdminUser string `json:"harborAdminUser,omitempty"` - - HarborAdminPass string `json:"harborAdminPass,omitempty"` - - TargetHarborClient *apiv2.RESTClient - - SourceHarborClient *apiv2.RESTClient -} - -// NewHarborOperator 返回一个带有默认HarborAdminPass的HarborOperator实例 -func NewHarborOperator() *HarborOperator { - return &HarborOperator{ - HarborPort: "8033", - HarborAdminUser: "admin", // 设置默认值 - HarborAdminPass: "V2ryStr@ngPss", // 设置默认值 - } -} - -// HarborOperatorCache 饿汉式单例 -var HarborOperatorCache = NewHarborOperator() -var OctopusReplicationPolicyName = "octopus-sync-replication" - -func (hOp *HarborOperator) Exec(baseFuncName string, funcArgs ...string) (bool, []string) { - // 参见 HarborFunctionEnum - - resultOk := true - var resultLog []string - - switch baseFuncName { - case "CREATE_PROJECT": - resultOk, resultLog = hOp.CreateProjectExec(funcArgs) - break - case "LIST_PROJECT": - resultOk, resultLog = hOp.ListProjectExec(funcArgs) - break - case "SYNC_PROJECT_BETWEEN_HARBOR": - resultOk, resultLog = hOp.SyncProjectExec(funcArgs) - break - case "SYNC_STATUS_HARBOR": - resultOk, resultLog = hOp.SyncStatusExec(funcArgs) - break - } - - return resultOk, resultLog -} - -func (hOp *HarborOperator) CreateProjectExec(funcArgs []string) (bool, []string) { - - if hOp.TargetHarborClient == nil { - - ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) - if !ok { - return false, []string{ - "[Harbor Create Project] - Error !", - } - } - hOp.TargetHarborClient = createClient - } - client := hOp.TargetHarborClient - - // create project - // 定义你想要创建的仓库(项目)的详细信息 - - log.Debug("[Harbor Create Project] - create project !") - needToCreateProjectNameList := []string{"cmii", "rancher"} - // 使用客户端创建项目 - ctx := context.Background() - for _, projectName := range needToCreateProjectNameList { - - log.DebugF("start to create proect => %s", projectName) - projectReq := &model.ProjectReq{ - ProjectName: projectName, // 仓库名称 - Metadata: &model.ProjectMetadata{ - Public: "true", // 是否是公开的 - }, - } - - exists, _ := client.ProjectExists(ctx, projectName) - if !exists { - - err := client.NewProject(ctx, projectReq) - if err != nil { - errorLog := fmt.Sprintf("Error creating project %s: %s\n", projectName, err.Error()) - return false, []string{errorLog} - } - } - - log.DebugF("[Harbor Create Project] - Project %s already exists ! continue ", projectName) - - } - - successLog := "[Harbor CreateProjectExec] - Project Create Success !" - log.Info(successLog) - - return true, []string{successLog} -} - -// todo refresh HarborClient不一定有端口 -func (hOp *HarborOperator) CheckAndBuildHarborClient(targetHarborHost string, targetHarborPort string, isTarget bool) (bool, *apiv2.RESTClient) { - - log.InfoF("[Harbor Client Create] - start to create harbor client %s", targetHarborHost) - - if targetHarborPort == "" { - targetHarborPort = hOp.HarborPort - } - - if isTarget { - hOp.TargetHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/" - log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.TargetHarborHost) - } else { - hOp.SourceHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/" - log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.SourceHarborHost) - } - - // check connection - var client *apiv2.RESTClient - var err error - if isTarget { - client, err = apiv2.NewRESTClientForHost(hOp.TargetHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil) - } else { - client, err = apiv2.NewRESTClientForHost(hOp.SourceHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil) - } - if err != nil { - errorLog := fmt.Sprintf("Error creating REST client: %s\n", err.Error()) - log.Error(errorLog) - return false, nil - } - - return true, client -} - -func (hOp *HarborOperator) ListProjectExec(funcArgs []string) (bool, []string) { - - if hOp.TargetHarborClient == nil { - ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) - if !ok { - return false, []string{ - "[Harbor Create Project ] - Error !", - } - } - hOp.TargetHarborClient = createClient - } - client := hOp.TargetHarborClient - - // 使用客户端列出所有项目 - ctx := context.Background() - projects, err := client.ListProjects(ctx, "") - if err != nil { - fmt.Printf("Error listing projects: %v\n", err) - os.Exit(1) - } - - // 打印所有项目的信息 - for _, project := range projects { - fmt.Printf("Project ID: %d, Name: %s, Public: %v\n", project.ProjectID, project.Name, project.Metadata.Public) - } - - marshal, _ := json.Marshal(projects) - - return true, []string{ - fmt.Sprintf("List Projects of %s ", hOp.TargetHarborHost), - string(marshal), - } -} - -func (hOp *HarborOperator) SyncProjectExec(funcArgs []string) (bool, []string) { - - if hOp.TargetHarborClient == nil { - ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) - if !ok { - return false, []string{ - "[Harbor Sync Project ] - Error !", - } - } - hOp.TargetHarborClient = createClient - } - targetClient := hOp.TargetHarborClient - - if hOp.SourceHarborClient == nil { - realHost := funcArgs[1] - realPort := "" - if strings.Contains(funcArgs[1], ":") { - split := strings.Split(funcArgs[1], ":") - realHost = split[0] - realPort = split[1] - } - ok, createClient := hOp.CheckAndBuildHarborClient(realHost, realPort, false) - if !ok { - return false, []string{ - "[Harbor Sync Project ] - Error !", - } - } - hOp.SourceHarborClient = createClient - } - - needToSynchronizedProject := funcArgs[2] - log.InfoF("[Harbor Sync Project ] - start to sync harbor project => %s", needToSynchronizedProject) - - log.DebugF("[Harbor Sync Project ] - start to check projects all exists!") - ctx := context.Background() - - // check both source and target harbor project exists - needToCreateProjectNameList := []string{"rancher", "cmii"} - - for _, projectName := range needToCreateProjectNameList { - syncNotExistHarborProjectError := []string{ - "[Harbor Sync Project ] - project not exists !", - } - exists, _ := targetClient.ProjectExists(ctx, projectName) - if !exists { - return false, append(syncNotExistHarborProjectError, "targetClient") - } - } - - OctopusSourceHarborName := "octopus-source" - - // add source registry to destination harbor - log.InfoF("[Harbor Sync Project ] - start to create source harbor endpoints => %s", hOp.SourceHarborHost) - - log.Debug("[Harbor Sync Project ] - start to delete exist replication policy !") - policies, _ := targetClient.ListReplicationPolicies(ctx) - if policies != nil { - for _, policy := range policies { - if policy.Name == OctopusReplicationPolicyName { - err := targetClient.DeleteReplicationPolicyByID(ctx, policy.ID) - if err != nil { - log.ErrorF("[Harbor Sync Project ] - delete exists replication policy failed ! => %v ", policy) - } - } - } - } - - log.Debug("[Harbor Sync Project ] - start to delete exist exist harbor endpoints !") - exitRegistry, _ := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName) - if exitRegistry != nil { - log.Debug("[Harbor Sync Project ] - source endpoints already exists ! delete it !") - err := targetClient.DeleteRegistryByID(ctx, exitRegistry.ID) - if err != nil { - log.ErrorF("[Harbor Sync Project ] - source endpoints delete failed ! => %v ", exitRegistry) - } - } - - // todo cqga failed - octopusSourceRegistry := &model.Registry{ - Credential: &model.RegistryCredential{ - AccessKey: "admin", - AccessSecret: "V2ryStr@ngPss", - Type: "basic", - }, - Insecure: true, - Name: OctopusSourceHarborName, // 源 Harbor 实例的注册表 ID,通常为 0 - Type: "harbor", - URL: strings.Split(hOp.SourceHarborHost, "/api")[0], - } - err := targetClient.NewRegistry(ctx, octopusSourceRegistry) - if err != nil { - sprintf := fmt.Sprintf("[SyncProjectExec] - source endpoints create failed ! => %s", err.Error()) - log.Error(sprintf) - return false, []string{sprintf} - } - - // get the real one for it's ID - realOctopusSourceRegistry, err := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName) - if err != nil { - sprintf := fmt.Sprintf("[SyncProjectExec] - get target registry id failed ! => %s", err.Error()) - log.Error(sprintf) - return false, []string{sprintf} - } - - // 创建复制策略 - octopusReplicationPolicy := &model.ReplicationPolicy{ - CopyByChunk: nil, - Deletion: false, - Description: "", - DestNamespace: "", // 可以指定目标 Harbor 中的特定项目,如果为空,则使用源项目名称 - DestNamespaceReplaceCount: nil, - SrcRegistry: &model.Registry{ - ID: realOctopusSourceRegistry.ID, - }, - DestRegistry: &model.Registry{ - ID: 0, - }, - Enabled: true, - Filters: []*model.ReplicationFilter{ - { - Type: "name", - Value: needToSynchronizedProject + "/**", - }, - }, - ID: 0, - Name: OctopusReplicationPolicyName, - Override: true, - ReplicateDeletion: false, - Speed: nil, - Trigger: &model.ReplicationTrigger{ - Type: "manual", // 可以是 "manual", "scheduled", 或 "event_based" - // 如果是 "scheduled",还需要设置 Cron 表达式 - // TriggerSettings: &model.TriggerSettings{Cron: "0 * * * *"}, - }, - } - - // 在源 Harbor 中创建复制策略 - log.InfoF("[Harbor Sync Project ] - Start To Sync Project => %s !", needToSynchronizedProject) - - err = targetClient.NewReplicationPolicy(ctx, octopusReplicationPolicy.DestRegistry, octopusReplicationPolicy.SrcRegistry, octopusReplicationPolicy.Deletion, octopusReplicationPolicy.Override, octopusReplicationPolicy.Enabled, octopusReplicationPolicy.Filters, octopusReplicationPolicy.Trigger, octopusReplicationPolicy.DestNamespace, octopusReplicationPolicy.Name, octopusReplicationPolicy.Name) - - if err != nil { - syncErrorMessage := fmt.Sprintf("[Harbor Sync Project ] - Sync Project [ %s ] Failed ! Error is => %s\n", needToSynchronizedProject, err.Error()) - log.Error(syncErrorMessage) - return false, []string{ - syncErrorMessage, - } - } - - realOctopusReplicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName) - if err != nil { - return false, []string{ - "[Harbor Sync Project ] - failed to get the realOctopusReplicationPolicy!", - err.Error(), - } - } - - err = targetClient.TriggerReplicationExecution(ctx, &model.StartReplicationExecution{ - PolicyID: realOctopusReplicationPolicy.ID, - }) - if err != nil { - return false, []string{ - "[ Harbor Sync Project ] - failed to start the harbor sync execution !", - err.Error(), - } - } - - return true, []string{ - fmt.Sprintf("[ Harbor Sync Project ] - sync project [ %s ] started !", needToSynchronizedProject), - } -} - -func (hOp *HarborOperator) SyncStatusExec(funcArgs []string) (bool, []string) { - - if hOp.TargetHarborClient == nil { - ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) - if !ok { - return false, []string{ - "[ Sync Status ] - Error !", - } - } - hOp.TargetHarborClient = createClient - } - targetClient := hOp.TargetHarborClient - - ctx := context.Background() - // check replication policy exists - - replicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName) - if err != nil { - return false, []string{ - "[ Sync Status ] - get replication error !", - err.Error(), - } - } - - // list execution status - replicationExecutions, err := targetClient.ListReplicationExecutions(ctx, &replicationPolicy.ID, nil, nil) - if err != nil { - return false, []string{ - "[ Sync Status ] - replication has no sync work !", - err.Error(), - } - } - - // find the newest one only have one here - for _, execution := range replicationExecutions { - if !strings.HasPrefix(execution.Status, "Succeed") { - bytes, _ := json.Marshal(execution) - log.InfoF("[sync status]- status are => %v", string(bytes)) - // report status - return false, []string{ - fmt.Sprintf("[sync status] - not complete ! progress is => %s %%", - strconv.FormatFloat(float64(execution.Succeed)/float64(execution.Total)*100, 'f', 2, 64)), - } - } - } - - return true, []string{ - "[sync status]- sync completed !", - } -} - -func (hOp *HarborOperator) Command(baseFuncName string, funcArgs ...string) []string { - - return nil -} +// +//import ( +// "context" +// "encoding/json" +// "fmt" +// "os" +// "strconv" +// "strings" +// +// "github.com/mittwald/goharbor-client/v5/apiv2" +// "github.com/mittwald/goharbor-client/v5/apiv2/model" +//) +// +//type HarborOperator struct { +// SourceHarborHost string `json:"sourceHarborHost,omitempty"` +// +// TargetHarborHost string `json:"targetHarborHost,omitempty"` +// +// HarborPort string `json:"harborPort,omitempty"` +// +// HarborAdminUser string `json:"harborAdminUser,omitempty"` +// +// HarborAdminPass string `json:"harborAdminPass,omitempty"` +// +// TargetHarborClient *apiv2.RESTClient +// +// SourceHarborClient *apiv2.RESTClient +//} +// +//// NewHarborOperator 返回一个带有默认HarborAdminPass的HarborOperator实例 +//func NewHarborOperator() *HarborOperator { +// return &HarborOperator{ +// HarborPort: "8033", +// HarborAdminUser: "admin", // 设置默认值 +// HarborAdminPass: "V2ryStr@ngPss", // 设置默认值 +// } +//} +// +//// HarborOperatorCache 饿汉式单例 +//var HarborOperatorCache = NewHarborOperator() +//var OctopusReplicationPolicyName = "octopus-sync-replication" +// +//func (hOp *HarborOperator) Exec(baseFuncName string, funcArgs ...string) (bool, []string) { +// // 参见 HarborFunctionEnum +// +// resultOk := true +// var resultLog []string +// +// switch baseFuncName { +// case "CREATE_PROJECT": +// resultOk, resultLog = hOp.CreateProjectExec(funcArgs) +// break +// case "LIST_PROJECT": +// resultOk, resultLog = hOp.ListProjectExec(funcArgs) +// break +// case "SYNC_PROJECT_BETWEEN_HARBOR": +// resultOk, resultLog = hOp.SyncProjectExec(funcArgs) +// break +// case "SYNC_STATUS_HARBOR": +// resultOk, resultLog = hOp.SyncStatusExec(funcArgs) +// break +// } +// +// return resultOk, resultLog +//} +// +//func (hOp *HarborOperator) CreateProjectExec(funcArgs []string) (bool, []string) { +// +// if hOp.TargetHarborClient == nil { +// +// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) +// if !ok { +// return false, []string{ +// "[Harbor Create Project] - Error !", +// } +// } +// hOp.TargetHarborClient = createClient +// } +// client := hOp.TargetHarborClient +// +// // create project +// // 定义你想要创建的仓库(项目)的详细信息 +// +// log.Debug("[Harbor Create Project] - create project !") +// needToCreateProjectNameList := []string{"cmii", "rancher"} +// // 使用客户端创建项目 +// ctx := context.Background() +// for _, projectName := range needToCreateProjectNameList { +// +// log.DebugF("start to create proect => %s", projectName) +// projectReq := &model.ProjectReq{ +// ProjectName: projectName, // 仓库名称 +// Metadata: &model.ProjectMetadata{ +// Public: "true", // 是否是公开的 +// }, +// } +// +// exists, _ := client.ProjectExists(ctx, projectName) +// if !exists { +// +// err := client.NewProject(ctx, projectReq) +// if err != nil { +// errorLog := fmt.Sprintf("Error creating project %s: %s\n", projectName, err.Error()) +// return false, []string{errorLog} +// } +// } +// +// log.DebugF("[Harbor Create Project] - Project %s already exists ! continue ", projectName) +// +// } +// +// successLog := "[Harbor CreateProjectExec] - Project Create Success !" +// log.Info(successLog) +// +// return true, []string{successLog} +//} +// +//// todo refresh HarborClient不一定有端口 +//func (hOp *HarborOperator) CheckAndBuildHarborClient(targetHarborHost string, targetHarborPort string, isTarget bool) (bool, *apiv2.RESTClient) { +// +// log.InfoF("[Harbor Client Create] - start to create harbor client %s", targetHarborHost) +// +// if targetHarborPort == "" { +// targetHarborPort = hOp.HarborPort +// } +// +// if isTarget { +// hOp.TargetHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/" +// log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.TargetHarborHost) +// } else { +// hOp.SourceHarborHost = "http://" + targetHarborHost + ":" + targetHarborPort + "/api/" +// log.DebugF("[Harbor Client Create] - harbor host is => %s", hOp.SourceHarborHost) +// } +// +// // check connection +// var client *apiv2.RESTClient +// var err error +// if isTarget { +// client, err = apiv2.NewRESTClientForHost(hOp.TargetHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil) +// } else { +// client, err = apiv2.NewRESTClientForHost(hOp.SourceHarborHost, hOp.HarborAdminUser, hOp.HarborAdminPass, nil) +// } +// if err != nil { +// errorLog := fmt.Sprintf("Error creating REST client: %s\n", err.Error()) +// log.Error(errorLog) +// return false, nil +// } +// +// return true, client +//} +// +//func (hOp *HarborOperator) ListProjectExec(funcArgs []string) (bool, []string) { +// +// if hOp.TargetHarborClient == nil { +// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) +// if !ok { +// return false, []string{ +// "[Harbor Create Project ] - Error !", +// } +// } +// hOp.TargetHarborClient = createClient +// } +// client := hOp.TargetHarborClient +// +// // 使用客户端列出所有项目 +// ctx := context.Background() +// projects, err := client.ListProjects(ctx, "") +// if err != nil { +// fmt.Printf("Error listing projects: %v\n", err) +// os.Exit(1) +// } +// +// // 打印所有项目的信息 +// for _, project := range projects { +// fmt.Printf("Project ID: %d, Name: %s, Public: %v\n", project.ProjectID, project.Name, project.Metadata.Public) +// } +// +// marshal, _ := json.Marshal(projects) +// +// return true, []string{ +// fmt.Sprintf("List Projects of %s ", hOp.TargetHarborHost), +// string(marshal), +// } +//} +// +//func (hOp *HarborOperator) SyncProjectExec(funcArgs []string) (bool, []string) { +// +// if hOp.TargetHarborClient == nil { +// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) +// if !ok { +// return false, []string{ +// "[Harbor Sync Project ] - Error !", +// } +// } +// hOp.TargetHarborClient = createClient +// } +// targetClient := hOp.TargetHarborClient +// +// if hOp.SourceHarborClient == nil { +// realHost := funcArgs[1] +// realPort := "" +// if strings.Contains(funcArgs[1], ":") { +// split := strings.Split(funcArgs[1], ":") +// realHost = split[0] +// realPort = split[1] +// } +// ok, createClient := hOp.CheckAndBuildHarborClient(realHost, realPort, false) +// if !ok { +// return false, []string{ +// "[Harbor Sync Project ] - Error !", +// } +// } +// hOp.SourceHarborClient = createClient +// } +// +// needToSynchronizedProject := funcArgs[2] +// log.InfoF("[Harbor Sync Project ] - start to sync harbor project => %s", needToSynchronizedProject) +// +// log.DebugF("[Harbor Sync Project ] - start to check projects all exists!") +// ctx := context.Background() +// +// // check both source and target harbor project exists +// needToCreateProjectNameList := []string{"rancher", "cmii"} +// +// for _, projectName := range needToCreateProjectNameList { +// syncNotExistHarborProjectError := []string{ +// "[Harbor Sync Project ] - project not exists !", +// } +// exists, _ := targetClient.ProjectExists(ctx, projectName) +// if !exists { +// return false, append(syncNotExistHarborProjectError, "targetClient") +// } +// } +// +// OctopusSourceHarborName := "octopus-source" +// +// // add source registry to destination harbor +// log.InfoF("[Harbor Sync Project ] - start to create source harbor endpoints => %s", hOp.SourceHarborHost) +// +// log.Debug("[Harbor Sync Project ] - start to delete exist replication policy !") +// policies, _ := targetClient.ListReplicationPolicies(ctx) +// if policies != nil { +// for _, policy := range policies { +// if policy.Name == OctopusReplicationPolicyName { +// err := targetClient.DeleteReplicationPolicyByID(ctx, policy.ID) +// if err != nil { +// log.ErrorF("[Harbor Sync Project ] - delete exists replication policy failed ! => %v ", policy) +// } +// } +// } +// } +// +// log.Debug("[Harbor Sync Project ] - start to delete exist exist harbor endpoints !") +// exitRegistry, _ := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName) +// if exitRegistry != nil { +// log.Debug("[Harbor Sync Project ] - source endpoints already exists ! delete it !") +// err := targetClient.DeleteRegistryByID(ctx, exitRegistry.ID) +// if err != nil { +// log.ErrorF("[Harbor Sync Project ] - source endpoints delete failed ! => %v ", exitRegistry) +// } +// } +// +// // todo cqga failed +// octopusSourceRegistry := &model.Registry{ +// Credential: &model.RegistryCredential{ +// AccessKey: "admin", +// AccessSecret: "V2ryStr@ngPss", +// Type: "basic", +// }, +// Insecure: true, +// Name: OctopusSourceHarborName, // 源 Harbor 实例的注册表 ID,通常为 0 +// Type: "harbor", +// URL: strings.Split(hOp.SourceHarborHost, "/api")[0], +// } +// err := targetClient.NewRegistry(ctx, octopusSourceRegistry) +// if err != nil { +// sprintf := fmt.Sprintf("[SyncProjectExec] - source endpoints create failed ! => %s", err.Error()) +// log.Error(sprintf) +// return false, []string{sprintf} +// } +// +// // get the real one for it's ID +// realOctopusSourceRegistry, err := targetClient.GetRegistryByName(ctx, OctopusSourceHarborName) +// if err != nil { +// sprintf := fmt.Sprintf("[SyncProjectExec] - get target registry id failed ! => %s", err.Error()) +// log.Error(sprintf) +// return false, []string{sprintf} +// } +// +// // 创建复制策略 +// octopusReplicationPolicy := &model.ReplicationPolicy{ +// CopyByChunk: nil, +// Deletion: false, +// Description: "", +// DestNamespace: "", // 可以指定目标 Harbor 中的特定项目,如果为空,则使用源项目名称 +// DestNamespaceReplaceCount: nil, +// SrcRegistry: &model.Registry{ +// ID: realOctopusSourceRegistry.ID, +// }, +// DestRegistry: &model.Registry{ +// ID: 0, +// }, +// Enabled: true, +// Filters: []*model.ReplicationFilter{ +// { +// Type: "name", +// Value: needToSynchronizedProject + "/**", +// }, +// }, +// ID: 0, +// Name: OctopusReplicationPolicyName, +// Override: true, +// ReplicateDeletion: false, +// Speed: nil, +// Trigger: &model.ReplicationTrigger{ +// Type: "manual", // 可以是 "manual", "scheduled", 或 "event_based" +// // 如果是 "scheduled",还需要设置 Cron 表达式 +// // TriggerSettings: &model.TriggerSettings{Cron: "0 * * * *"}, +// }, +// } +// +// // 在源 Harbor 中创建复制策略 +// log.InfoF("[Harbor Sync Project ] - Start To Sync Project => %s !", needToSynchronizedProject) +// +// err = targetClient.NewReplicationPolicy(ctx, octopusReplicationPolicy.DestRegistry, octopusReplicationPolicy.SrcRegistry, octopusReplicationPolicy.Deletion, octopusReplicationPolicy.Override, octopusReplicationPolicy.Enabled, octopusReplicationPolicy.Filters, octopusReplicationPolicy.Trigger, octopusReplicationPolicy.DestNamespace, octopusReplicationPolicy.Name, octopusReplicationPolicy.Name) +// +// if err != nil { +// syncErrorMessage := fmt.Sprintf("[Harbor Sync Project ] - Sync Project [ %s ] Failed ! Error is => %s\n", needToSynchronizedProject, err.Error()) +// log.Error(syncErrorMessage) +// return false, []string{ +// syncErrorMessage, +// } +// } +// +// realOctopusReplicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName) +// if err != nil { +// return false, []string{ +// "[Harbor Sync Project ] - failed to get the realOctopusReplicationPolicy!", +// err.Error(), +// } +// } +// +// err = targetClient.TriggerReplicationExecution(ctx, &model.StartReplicationExecution{ +// PolicyID: realOctopusReplicationPolicy.ID, +// }) +// if err != nil { +// return false, []string{ +// "[ Harbor Sync Project ] - failed to start the harbor sync execution !", +// err.Error(), +// } +// } +// +// return true, []string{ +// fmt.Sprintf("[ Harbor Sync Project ] - sync project [ %s ] started !", needToSynchronizedProject), +// } +//} +// +//func (hOp *HarborOperator) SyncStatusExec(funcArgs []string) (bool, []string) { +// +// if hOp.TargetHarborClient == nil { +// ok, createClient := hOp.CheckAndBuildHarborClient(funcArgs[0], "", true) +// if !ok { +// return false, []string{ +// "[ Sync Status ] - Error !", +// } +// } +// hOp.TargetHarborClient = createClient +// } +// targetClient := hOp.TargetHarborClient +// +// ctx := context.Background() +// // check replication policy exists +// +// replicationPolicy, err := targetClient.GetReplicationPolicyByName(ctx, OctopusReplicationPolicyName) +// if err != nil { +// return false, []string{ +// "[ Sync Status ] - get replication error !", +// err.Error(), +// } +// } +// +// // list execution status +// replicationExecutions, err := targetClient.ListReplicationExecutions(ctx, &replicationPolicy.ID, nil, nil) +// if err != nil { +// return false, []string{ +// "[ Sync Status ] - replication has no sync work !", +// err.Error(), +// } +// } +// +// // find the newest one only have one here +// for _, execution := range replicationExecutions { +// if !strings.HasPrefix(execution.Status, "Succeed") { +// bytes, _ := json.Marshal(execution) +// log.InfoF("[sync status]- status are => %v", string(bytes)) +// // report status +// return false, []string{ +// fmt.Sprintf("[sync status] - not complete ! progress is => %s %%", +// strconv.FormatFloat(float64(execution.Succeed)/float64(execution.Total)*100, 'f', 2, 64)), +// } +// } +// } +// +// return true, []string{ +// "[sync status]- sync completed !", +// } +//} +// +//func (hOp *HarborOperator) Command(baseFuncName string, funcArgs ...string) []string { +// +// return nil +//} diff --git a/agent-go/a_executor/ImageFunction.go b/agent-go/a_executor/ImageFunction.go index e992bf7..35ebe0e 100755 --- a/agent-go/a_executor/ImageFunction.go +++ b/agent-go/a_executor/ImageFunction.go @@ -1,346 +1,340 @@ package a_executor -import ( - "fmt" - "strings" - "wdd.io/agent-common/image" -) - -var LocalGzipImageFolderPrefix = "/var/lib/docker/image_sync/" -var DefaultSocks5ProxyUser = "zeaslity" -var DefaultSocks5ProxyPass = "password" - -func (op *AgentOsOperator) Sync(baseFuncName string, funcArgs ...string) (bool, []string) { - resultOk := false - var errorLog []string - - switch baseFuncName { - - case "DOWNLOAD_DOCKER_IMAGE": - resultOk, errorLog = op.downloadDockerImage(funcArgs) - break - case "COMPRESS_IMAGE_TO_GZIP": - resultOk, errorLog = op.compressImageToGzip(funcArgs) - break - case "UPLOAD_GZIP_TO_OSS": - resultOk, errorLog = op.uploadGzipFileToOss(funcArgs) - break - case "DOWNLOAD_GZIP_IMAGE_FILE": - resultOk, errorLog = op.downloadGzipImageFile(funcArgs) - break - case "LOAD_DOCKER_IMAGE_FROM_GZIP": - resultOk, errorLog = op.loadDockerImageFromGzip(funcArgs) - break - case "PUSH_IMAGE_TO_TARGET_HARBOR": - resultOk, errorLog = op.pushImageToTargetHarbor(funcArgs) - break - case "UPDATE_IMAGE_TAG": - resultOk, errorLog = op.updateImageTag(funcArgs) - break - default: - resultOk, errorLog = op.okExec(funcArgs) - } - - return resultOk, errorLog -} - -func (op *AgentOsOperator) downloadDockerImage(funcArgs []string) (bool, []string) { - // funcArgs are imageFullName gzipFolderPrefix gzipFileName ossUrlPrefix namespace newImageTag - - if !BasicCommandExistByPath("docker") { - return false, []string{ - "docker not exits !", - } - } - imageFullName := funcArgs[0] - log.InfoF("[downloadDockerImage]- start to pull docker image %s", imageFullName) - - // login - if strings.HasPrefix(imageFullName, image.CmiiHarborPrefix) { - HardCodeCommandExecutor("docker login -u rad02_drone -p Drone@1234 harbor.cdcyy.com.cn") - } - - if !PureResultSingleExecute([]string{ - "docker", - "pull", - imageFullName, - }) { - return false, []string{ - "docker pull failed of " + imageFullName, - } - } - - if !BasicDockerImageExistByFullName(funcArgs[0]) { - return false, []string{ - "image not exits ! unknown error happened!", - } - } - return true, []string{ - imageFullName, - } -} - -func (op *AgentOsOperator) compressImageToGzip(funcArgs []string) (bool, []string) { - if !BasicCommandExistByPath("docker") { - return false, []string{ - "docker not exits !", - } - } - if !BasicCommandExistByPath("gzip") { - return false, []string{ - "gzip not exits !", - } - } - - gzipFolderPrefix := funcArgs[1] - if !BasicFolderExists(gzipFolderPrefix) { - BasicCreateFolder(gzipFolderPrefix) - } - - imageFullName := funcArgs[0] - if !BasicDockerImageExistByFullName(imageFullName) { - return false, []string{ - "image not exits !", - } - } - - if !strings.HasSuffix(gzipFolderPrefix, "/") { - gzipFolderPrefix += "/" - } - - gzipImageFromFullName := image.ImageFullNameToGzipFileName(imageFullName) - dockerSaveCommand := "docker save " + imageFullName + " | gzip > " + gzipFolderPrefix + gzipImageFromFullName - - executor, i := HardCodeCommandExecutor(dockerSaveCommand) - if !executor { - return false, i - } - - if !BasicFileExistAndNotNull(gzipFolderPrefix + gzipImageFromFullName) { - return false, []string{ - "gzip of ile error ", - } - } - - return true, []string{ - gzipImageFromFullName, - } -} - -func (op *AgentOsOperator) uploadGzipFileToOss(funcArgs []string) (bool, []string) { - - if !BasicCommandExistByPath("mc") { - return false, []string{ - "mc not exits!", - } - } - - gzipFolderPrefix := funcArgs[1] - gzipImageFromFullName := funcArgs[2] - - ok, resultLog := HardCodeCommandExecutor("mc --insecure alias set demo https://oss.ig-demo.uavcmlc.com cmii B#923fC7mk") - //ok, resultLog = HardCodeCommandExecutor("mc alias list") - - PureResultSingleExecute([]string{ - "mc", - "rm", - "demo/cmlc-installation/tmp/" + gzipImageFromFullName, - }) - - ok, resultLog = AllCommandExecutor([]string{ - "mc", - "cp", - gzipFolderPrefix + gzipImageFromFullName, - "demo/cmlc-installation/tmp/" + gzipImageFromFullName, - }) - if !ok { - return false, resultLog - } - - find, _ := BasicFindContentInCommandOutput("mc ls demo/cmlc-installation/tmp/", gzipImageFromFullName) - if !find { - return false, []string{ - "demo oss can't find gzip file !", - } - } - - return true, []string{ - gzipImageFromFullName, - } - -} - -func (op *AgentOsOperator) downloadGzipImageFile(funcArgs []string) (bool, []string) { - - ossUrlPrefix := funcArgs[3] - gzipImageFromFullName := funcArgs[2] - proxyUrl := funcArgs[4] - - // create folder - BasicCreateFolder(LocalGzipImageFolderPrefix) - - // remove file - desFile := LocalGzipImageFolderPrefix + gzipImageFromFullName - - if !BasicRemoveFileOrFolder(desFile) { - return false, []string{ - "file already exits ! can't remove it!", - } - } - - //var download bool - //var downloadLog []string - //if proxyUrl == "" { - // download, downloadLog = BasicDownloadFileByCurl(ossUrlPrefix+gzipImageFromFullName, desFile) - //} else { - // = BasicDownloadFileWithProxy(ossUrlPrefix+gzipImageFromFullName, proxyUrl, desFile) - //} - - download, downloadLog := BasicDownloadFile(ossUrlPrefix+gzipImageFromFullName, proxyUrl, DefaultSocks5ProxyUser, DefaultSocks5ProxyPass, desFile) - if !download { - return false, downloadLog - } - - return true, []string{ - desFile, - } -} - -func (op *AgentOsOperator) loadDockerImageFromGzip(funcArgs []string) (bool, []string) { - gzipImageFromFullName := funcArgs[2] - - if !BasicFileExistAndNotNull(LocalGzipImageFolderPrefix + gzipImageFromFullName) { - return false, []string{ - LocalGzipImageFolderPrefix + gzipImageFromFullName, - "local gzip file not exits!", - } - } - - hardCodeCommand := "docker load < " + LocalGzipImageFolderPrefix + gzipImageFromFullName - executor, i := HardCodeCommandExecutor(hardCodeCommand) - if !executor { - return false, i - } - - if !BasicDockerImageExistByFullName(funcArgs[0]) { - return false, []string{ - "docker load from gzip file error ! image not exits!", - funcArgs[0], - } - } - - return true, nil -} -func (op *AgentOsOperator) pushImageToTargetHarbor(funcArgs []string) (bool, []string) { - - targetHarborHost := funcArgs[5] - imageFullName := funcArgs[0] - - if !strings.Contains(targetHarborHost, "8033") { - targetHarborHost += ":8033" - } - - targetImageFullName := image.ImageNameToTargetImageFullName(imageFullName, targetHarborHost) - - if !PureResultSingleExecute([]string{ - "docker", - "tag", - imageFullName, - targetImageFullName, - }) { - return false, []string{ - "docker tag error!", - } - } - if strings.HasPrefix(targetImageFullName, image.CmiiHarborPrefix) { - HardCodeCommandExecutor("docker login -u rad02_drone -p Drone@1234 harbor.cdcyy.com.cn") - } else { - HardCodeCommandExecutor("docker login -u admin -p V2ryStr@ngPss " + targetHarborHost) - } - - ok, resultLog := AllCommandExecutor([]string{ - "docker", - "push", - targetImageFullName, - }) - if !ok { - return false, resultLog - } - - return true, []string{ - targetImageFullName, - } -} - -func (op *AgentOsOperator) updateImageTag(funcArgs []string) (bool, []string) { - namespace := funcArgs[6] - imageFullName := funcArgs[0] - if !strings.HasPrefix(imageFullName, image.CmiiHarborPrefix) { - return false, []string{ - "cant update this image !", - } - } - appName := image.ImageFullNameToAppName(imageFullName) - newTag := image.ImageFullNameToImageTag(imageFullName) - - sprintf := fmt.Sprintf("start to update [%s] image tag [%s] to [%s]", namespace, appName, newTag) - log.Info(sprintf) - - update, resultLog := K8sDeploymentUpdateTag(namespace, appName, newTag) - if !update { - return false, []string{ - sprintf, - } - } - return true, []string{ - resultLog, - } -} - -func (op *AgentOsOperator) updateImageTagByFile(funcArgs []string) (bool, []string) { - namespace := funcArgs[6] - //targetImageFullName := funcArgs[7] - proxyUrl := funcArgs[4] - if !BasicCommandExistByPath("kubectl") { - return false, []string{ - "kubectl not exits !", - } - } - imageFullName := funcArgs[0] - if !strings.HasPrefix(imageFullName, image.CmiiHarborPrefix) { - return false, []string{ - "cant update this image !", - } - } - appName := image.ImageFullNameToAppName(imageFullName) - - // 2024年4月7日 修改为 exec file的模式 - folderPrefix := "/root/wdd/update/" - BasicCreateFolder(folderPrefix) - - updateFileName := "update-app-tag.sh" - if !BasicFileExistAndNotNull(folderPrefix + updateFileName) { - // kubectl update tag file not exits! - download, downloadLog := BasicDownloadFile(AgentOsOperatorCache.OssOfflinePrefix+updateFileName, proxyUrl, DefaultSocks5ProxyUser, DefaultSocks5ProxyPass, folderPrefix+updateFileName) - - if !download { - return false, downloadLog - } - } - - PureResultSingleExecute([]string{ - "chomd", - "+x", - folderPrefix + updateFileName, - }) - - newTag := image.ImageFullNameToImageTag(imageFullName) - log.InfoF("start do update %s %s to %s", namespace, appName, newTag) - updateCommand := "bash " + folderPrefix + updateFileName + namespace + appName + newTag - executor, i := HardCodeCommandExecutor(updateCommand) - if !executor { - return false, i - } - - return true, i -} +//var LocalGzipImageFolderPrefix = "/var/lib/docker/image_sync/" +//var DefaultSocks5ProxyUser = "zeaslity" +//var DefaultSocks5ProxyPass = "password" +// +//func (op *AgentOsOperator) Sync(baseFuncName string, funcArgs ...string) (bool, []string) { +// resultOk := false +// var errorLog []string +// +// switch baseFuncName { +// +// case "DOWNLOAD_DOCKER_IMAGE": +// resultOk, errorLog = op.downloadDockerImage(funcArgs) +// break +// case "COMPRESS_IMAGE_TO_GZIP": +// resultOk, errorLog = op.compressImageToGzip(funcArgs) +// break +// case "UPLOAD_GZIP_TO_OSS": +// resultOk, errorLog = op.uploadGzipFileToOss(funcArgs) +// break +// case "DOWNLOAD_GZIP_IMAGE_FILE": +// resultOk, errorLog = op.downloadGzipImageFile(funcArgs) +// break +// case "LOAD_DOCKER_IMAGE_FROM_GZIP": +// resultOk, errorLog = op.loadDockerImageFromGzip(funcArgs) +// break +// case "PUSH_IMAGE_TO_TARGET_HARBOR": +// resultOk, errorLog = op.pushImageToTargetHarbor(funcArgs) +// break +// case "UPDATE_IMAGE_TAG": +// resultOk, errorLog = op.updateImageTag(funcArgs) +// break +// default: +// resultOk, errorLog = op.okExec(funcArgs) +// } +// +// return resultOk, errorLog +//} +// +//func (op *AgentOsOperator) downloadDockerImage(funcArgs []string) (bool, []string) { +// // funcArgs are imageFullName gzipFolderPrefix gzipFileName ossUrlPrefix namespace newImageTag +// +// if !BasicCommandExistByPath("docker") { +// return false, []string{ +// "docker not exits !", +// } +// } +// imageFullName := funcArgs[0] +// log.InfoF("[downloadDockerImage]- start to pull docker image %s", imageFullName) +// +// // login +// if strings.HasPrefix(imageFullName, image.CmiiHarborPrefix) { +// HardCodeCommandExecutor("docker login -u rad02_drone -p Drone@1234 harbor.cdcyy.com.cn") +// } +// +// if !PureResultSingleExecute([]string{ +// "docker", +// "pull", +// imageFullName, +// }) { +// return false, []string{ +// "docker pull failed of " + imageFullName, +// } +// } +// +// if !BasicDockerImageExistByFullName(funcArgs[0]) { +// return false, []string{ +// "image not exits ! unknown error happened!", +// } +// } +// return true, []string{ +// imageFullName, +// } +//} +// +//func (op *AgentOsOperator) compressImageToGzip(funcArgs []string) (bool, []string) { +// if !BasicCommandExistByPath("docker") { +// return false, []string{ +// "docker not exits !", +// } +// } +// if !BasicCommandExistByPath("gzip") { +// return false, []string{ +// "gzip not exits !", +// } +// } +// +// gzipFolderPrefix := funcArgs[1] +// if !BasicFolderExists(gzipFolderPrefix) { +// BasicCreateFolder(gzipFolderPrefix) +// } +// +// imageFullName := funcArgs[0] +// if !BasicDockerImageExistByFullName(imageFullName) { +// return false, []string{ +// "image not exits !", +// } +// } +// +// if !strings.HasSuffix(gzipFolderPrefix, "/") { +// gzipFolderPrefix += "/" +// } +// +// gzipImageFromFullName := image.ImageFullNameToGzipFileName(imageFullName) +// dockerSaveCommand := "docker save " + imageFullName + " | gzip > " + gzipFolderPrefix + gzipImageFromFullName +// +// executor, i := HardCodeCommandExecutor(dockerSaveCommand) +// if !executor { +// return false, i +// } +// +// if !BasicFileExistAndNotNull(gzipFolderPrefix + gzipImageFromFullName) { +// return false, []string{ +// "gzip of ile error ", +// } +// } +// +// return true, []string{ +// gzipImageFromFullName, +// } +//} +// +//func (op *AgentOsOperator) uploadGzipFileToOss(funcArgs []string) (bool, []string) { +// +// if !BasicCommandExistByPath("mc") { +// return false, []string{ +// "mc not exits!", +// } +// } +// +// gzipFolderPrefix := funcArgs[1] +// gzipImageFromFullName := funcArgs[2] +// +// ok, resultLog := HardCodeCommandExecutor("mc --insecure alias set demo https://oss.ig-demo.uavcmlc.com cmii B#923fC7mk") +// //ok, resultLog = HardCodeCommandExecutor("mc alias list") +// +// PureResultSingleExecute([]string{ +// "mc", +// "rm", +// "demo/cmlc-installation/tmp/" + gzipImageFromFullName, +// }) +// +// ok, resultLog = AllCommandExecutor([]string{ +// "mc", +// "cp", +// gzipFolderPrefix + gzipImageFromFullName, +// "demo/cmlc-installation/tmp/" + gzipImageFromFullName, +// }) +// if !ok { +// return false, resultLog +// } +// +// find, _ := BasicFindContentInCommandOutput("mc ls demo/cmlc-installation/tmp/", gzipImageFromFullName) +// if !find { +// return false, []string{ +// "demo oss can't find gzip file !", +// } +// } +// +// return true, []string{ +// gzipImageFromFullName, +// } +// +//} +// +//func (op *AgentOsOperator) downloadGzipImageFile(funcArgs []string) (bool, []string) { +// +// ossUrlPrefix := funcArgs[3] +// gzipImageFromFullName := funcArgs[2] +// proxyUrl := funcArgs[4] +// +// // create folder +// BasicCreateFolder(LocalGzipImageFolderPrefix) +// +// // remove file +// desFile := LocalGzipImageFolderPrefix + gzipImageFromFullName +// +// if !BasicRemoveFileOrFolder(desFile) { +// return false, []string{ +// "file already exits ! can't remove it!", +// } +// } +// +// //var download bool +// //var downloadLog []string +// //if proxyUrl == "" { +// // download, downloadLog = BasicDownloadFileByCurl(ossUrlPrefix+gzipImageFromFullName, desFile) +// //} else { +// // = BasicDownloadFileWithProxy(ossUrlPrefix+gzipImageFromFullName, proxyUrl, desFile) +// //} +// +// download, downloadLog := BasicDownloadFile(ossUrlPrefix+gzipImageFromFullName, proxyUrl, DefaultSocks5ProxyUser, DefaultSocks5ProxyPass, desFile) +// if !download { +// return false, downloadLog +// } +// +// return true, []string{ +// desFile, +// } +//} +// +//func (op *AgentOsOperator) loadDockerImageFromGzip(funcArgs []string) (bool, []string) { +// gzipImageFromFullName := funcArgs[2] +// +// if !BasicFileExistAndNotNull(LocalGzipImageFolderPrefix + gzipImageFromFullName) { +// return false, []string{ +// LocalGzipImageFolderPrefix + gzipImageFromFullName, +// "local gzip file not exits!", +// } +// } +// +// hardCodeCommand := "docker load < " + LocalGzipImageFolderPrefix + gzipImageFromFullName +// executor, i := HardCodeCommandExecutor(hardCodeCommand) +// if !executor { +// return false, i +// } +// +// if !BasicDockerImageExistByFullName(funcArgs[0]) { +// return false, []string{ +// "docker load from gzip file error ! image not exits!", +// funcArgs[0], +// } +// } +// +// return true, nil +//} +//func (op *AgentOsOperator) pushImageToTargetHarbor(funcArgs []string) (bool, []string) { +// +// targetHarborHost := funcArgs[5] +// imageFullName := funcArgs[0] +// +// if !strings.Contains(targetHarborHost, "8033") { +// targetHarborHost += ":8033" +// } +// +// targetImageFullName := image.ImageNameToTargetImageFullName(imageFullName, targetHarborHost) +// +// if !PureResultSingleExecute([]string{ +// "docker", +// "tag", +// imageFullName, +// targetImageFullName, +// }) { +// return false, []string{ +// "docker tag error!", +// } +// } +// if strings.HasPrefix(targetImageFullName, image.CmiiHarborPrefix) { +// HardCodeCommandExecutor("docker login -u rad02_drone -p Drone@1234 harbor.cdcyy.com.cn") +// } else { +// HardCodeCommandExecutor("docker login -u admin -p V2ryStr@ngPss " + targetHarborHost) +// } +// +// ok, resultLog := AllCommandExecutor([]string{ +// "docker", +// "push", +// targetImageFullName, +// }) +// if !ok { +// return false, resultLog +// } +// +// return true, []string{ +// targetImageFullName, +// } +//} +// +//func (op *AgentOsOperator) updateImageTag(funcArgs []string) (bool, []string) { +// namespace := funcArgs[6] +// imageFullName := funcArgs[0] +// if !strings.HasPrefix(imageFullName, image.CmiiHarborPrefix) { +// return false, []string{ +// "cant update this image !", +// } +// } +// appName := image.ImageFullNameToAppName(imageFullName) +// newTag := image.ImageFullNameToImageTag(imageFullName) +// +// sprintf := fmt.Sprintf("start to update [%s] image tag [%s] to [%s]", namespace, appName, newTag) +// log.Info(sprintf) +// +// update, resultLog := K8sDeploymentUpdateTag(namespace, appName, newTag) +// if !update { +// return false, []string{ +// sprintf, +// } +// } +// return true, []string{ +// resultLog, +// } +//} +// +//func (op *AgentOsOperator) updateImageTagByFile(funcArgs []string) (bool, []string) { +// namespace := funcArgs[6] +// //targetImageFullName := funcArgs[7] +// proxyUrl := funcArgs[4] +// if !BasicCommandExistByPath("kubectl") { +// return false, []string{ +// "kubectl not exits !", +// } +// } +// imageFullName := funcArgs[0] +// if !strings.HasPrefix(imageFullName, image.CmiiHarborPrefix) { +// return false, []string{ +// "cant update this image !", +// } +// } +// appName := image.ImageFullNameToAppName(imageFullName) +// +// // 2024年4月7日 修改为 exec file的模式 +// folderPrefix := "/root/wdd/update/" +// BasicCreateFolder(folderPrefix) +// +// updateFileName := "update-app-tag.sh" +// if !BasicFileExistAndNotNull(folderPrefix + updateFileName) { +// // kubectl update tag file not exits! +// download, downloadLog := BasicDownloadFile(AgentOsOperatorCache.OssOfflinePrefix+updateFileName, proxyUrl, DefaultSocks5ProxyUser, DefaultSocks5ProxyPass, folderPrefix+updateFileName) +// +// if !download { +// return false, downloadLog +// } +// } +// +// PureResultSingleExecute([]string{ +// "chomd", +// "+x", +// folderPrefix + updateFileName, +// }) +// +// newTag := image.ImageFullNameToImageTag(imageFullName) +// log.InfoF("start do update %s %s to %s", namespace, appName, newTag) +// updateCommand := "bash " + folderPrefix + updateFileName + namespace + appName + newTag +// executor, i := HardCodeCommandExecutor(updateCommand) +// if !executor { +// return false, i +// } +// +// return true, i +//} diff --git a/agent-go/a_executor/K8sFunction.go b/agent-go/a_executor/K8sFunction.go index c1fd92e..d85ecbe 100755 --- a/agent-go/a_executor/K8sFunction.go +++ b/agent-go/a_executor/K8sFunction.go @@ -1,459 +1,460 @@ package a_executor -import ( - "context" - "fmt" - v1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/clientcmd" - "os" - "strings" - "sync" - "time" - image2 "wdd.io/agent-common/image" -) - -var k8sConfigFilePath = "/root/wdd/kube_config_cluster.yml" -var k8sClient = newK8sClientInstance() - -func newK8sClientInstance() *kubernetes.Clientset { - once := sync.Once{} - - if !BasicFileExistAndNotNull(k8sConfigFilePath) { - log.WarnF("[newK8sClientInstance] - k8s config %s does not exist ! ", k8sConfigFilePath) - return nil - } - - var client *kubernetes.Clientset - once.Do(func() { - // 使用kubeconfig文件初始化客户端 - config, err := clientcmd.BuildConfigFromFlags("", k8sConfigFilePath) - if err != nil { - log.ErrorF("[newK8sClientInstance] - load from %s error !", k8sConfigFilePath) - - } - - client, err = kubernetes.NewForConfig(config) - if err != nil { - log.Error("[newK8sClientInstance] - create k8s client error !") - } - }) - - return client -} - -func K8sCheckPodStatusTimeout(specificPod string, supreme string, waitTimeOut int) bool { - - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return false - } - } - - // 设置超时时间和时间间隔 - timeout := time.After(time.Duration(waitTimeOut) * time.Second) - tick := time.Tick(5 * time.Second) - - // 监控Pod状态 - for { - select { - case <-timeout: - log.ErrorF("[K8sCheckPodStatusTimeout] - 命名空间: [%s], Pod名称: [%s], 状态: 失败!", supreme, specificPod) - return false - case <-tick: - pod, err := k8sClient.CoreV1().Pods(supreme).Get(context.TODO(), specificPod, metav1.GetOptions{}) - if err != nil { - log.ErrorF("[K8sCheckPodStatusTimeout] - 命名空间: [%s], Pod名称: [%s], 获取Pod信息失败 !", supreme, err.Error()) - } else { - log.DebugF("[K8sCheckPodStatusTimeout] - 命名空间: [%s], Pod名称: [%s], 状态: [%s]", supreme, pod.Name, pod.Status.Phase) - if pod.Status.Phase == corev1.PodRunning || pod.Status.Phase == corev1.PodSucceeded { - return true - } - } - } - } -} - -func K8sCheckDeploymentStatusTimeout(specificDeployment string, supreme string, waitTimeOut int) bool { - - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return false - } - } - - // 设置超时时间和时间间隔 - timeout := time.After(time.Duration(waitTimeOut) * time.Second) - tick := time.Tick(5 * time.Second) - - // 监控Pod状态 - for { - select { - case <-timeout: - log.ErrorF("[K8sCheckDeploymentStatusTimeout] - 命名空间: %s, Deployment名称: %s, 状态: 失败!\n", supreme, specificDeployment) - return false - case <-tick: - deployment, err := k8sClient.AppsV1().Deployments(supreme).Get(context.TODO(), specificDeployment, metav1.GetOptions{}) - if err != nil { - log.ErrorF("[K8sCheckDeploymentStatusTimeout] - 命名空间: [%s], Deployment 名称: [%s], 获取Deployment信息失败 !", supreme, err.Error()) - } else { - log.DebugF("[K8sCheckDeploymentStatusTimeout] - 命名空间: [ %s ], Deployment: [ %s ] 还有Pods未处于Running状态 (Ready: %d, Total: %d)\n", supreme, deployment.Name, deployment.Status.ReadyReplicas, deployment.Status.Replicas) - - if deployment.Status.ReadyReplicas == deployment.Status.Replicas { - return true - } - - } - } - } -} - -func K8sDeploymentUpdateTag(supreme, appName, newTag string) (bool, string) { - - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return false, "" - } - } - - if newTag == "" { - log.WarnF("[K8sDeploymentUpdateTag] - can not update image tag to null!") - return false, "" - } - - deployment := K8sDeploymentExists(supreme, appName) - if deployment == nil { - return false, "" - } - - updateResultLog := "" - - containers := deployment.Spec.Template.Spec.Containers - - // 只支持container的数量为1的形式 - container := containers[0] - - oldName := container.Image - split := strings.Split(container.Image, ":") - if strings.HasPrefix(container.Image, image2.CmiiHarborPrefix) { - // harbor - container.Image = split[0] + ":" + newTag - } else if strings.Contains(container.Image, "8033") { - // 192.168.6.6:8033/rancher/k8s-dns-sidecar:v1.0.2 - // 重新拼接 - container.Image = split[0] + ":" + split[1] + ":" + newTag - } - log.DebugF("[DeploymentUpdateTag] - update [%s] [%s] from [%s] to [%s]", deployment.Namespace, appName, oldName, container.Image) - - // 更新Cmii BIZ_GROUP - tagVersion := newTag - if strings.Contains(newTag, "-") { - tagVersion = strings.Split(newTag, "-")[0] - } - envList := container.Env - for index, envVar := range envList { - if envVar.Name == "IMAGE_VERSION" { - envList[index].Value = tagVersion - } - if envVar.Name == "BIZ_CONFIG_GROUP" { - envList[index].Value = tagVersion - } - if envVar.Name == "SYS_CONFIG_GROUP" { - envList[index].Value = tagVersion - } - } - log.DebugF("[DeploymentUpdateTag] - update env IMAGE_VERSION to [%s]", tagVersion) - - // 赋值回去 很关键 - deployment.Spec.Template.Spec.Containers[0] = container - - // update - _, err := k8sClient.AppsV1().Deployments(deployment.Namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}) - if err != nil { - sprintf := fmt.Sprintf("[DeploymentUpdateTag] - update [%s] [%s] from [%s] to [%s] error ! %s", deployment.Namespace, appName, split[1], container.Image, err.Error()) - log.Error(sprintf) - return false, sprintf - - } - - return true, updateResultLog -} - -func K8sDeploymentExists(supreme, appName string) *v1.Deployment { - - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return nil - } - } - - deployment, err := k8sClient.AppsV1().Deployments(supreme).Get(context.TODO(), appName, metav1.GetOptions{}) - if err != nil { - log.ErrorF("[DeploymentExist] - deployments [%s] [%s] not exists ! %s", supreme, appName, err.Error()) - return nil - } - - return deployment -} - -func K8sListPVCInNamespace(supreme string) (bool, []string) { - - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return false, []string{ - "[K8sListPVCInNamespace] - k8s client not exits !", - } - } - } - - pvcs, err := k8sClient.CoreV1().PersistentVolumeClaims(supreme).List(context.TODO(), metav1.ListOptions{}) - if err != nil { - log.ErrorF("[K8sListPVCInNamespace] - error list pvc list in namespace %s", supreme) - return false, nil - } - - var pvcList []string - for _, pvc := range pvcs.Items { - pvcList = append(pvcList, pvc.Name) - } - - log.DebugF("K8sListPVCInNamespace - all pvc in namespace of [ %s ] are %v", supreme, pvcList) - return true, pvcList -} - -func K8sCheckPVCStatusTimeOut(specificPvcName string, supreme string, waitTimeOut int) bool { - - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return false - } - } - - // 设置超时时间和时间间隔 - timeout := time.After(time.Duration(waitTimeOut) * time.Second) - tick := time.Tick(5 * time.Second) - - // 监控Pod状态 - for { - select { - case <-timeout: - log.ErrorF("[K8sCheckPVCStatusTimeOut] - 命名空间: %s, PVC 名称: %s, 状态: 失败! ", supreme, specificPvcName) - return false - case <-tick: - pvc, err := k8sClient.CoreV1().PersistentVolumeClaims(supreme).Get(context.TODO(), specificPvcName, metav1.GetOptions{}) - if err != nil { - log.ErrorF("[K8sCheckPVCStatusTimeOut] - 命名空间: [ %s ], 获取 PVC [%s] 信息失败: %s ", supreme, specificPvcName, err.Error()) - } - - if pvc.Status.Phase == corev1.ClaimBound { - log.DebugF("[K8sCheckPVCStatusTimeOut] - PVC %s in namespace %s is running", specificPvcName, supreme) - return true - } else { - log.WarnF("[K8sCheckPVCStatusTimeOut] - PVC %s in namespace %s run failed !", specificPvcName, supreme) - return false - } - } - } -} - -func KubectlCheckPodStatus(specific string, supreme string) bool { - - if !BasicCommandExists("kubectl") { - log.Error("kubectl命令不存在,无法查看Pod状态,请查看!") - } - - ok, resultLog := AllCommandExecutor([]string{ - "kubectl", "-n", supreme, "get", "pod", specific, "-o", "jsonpath='{.status.phase}'", - }) - if !ok { - return false - } - - for _, resultLine := range resultLog { - if strings.HasPrefix(resultLine, "Running") { - return true - } - } - - return false -} - -func KubectlApplyExec(resourcesYamlFile string) (bool, []string) { - - // check kubectl - if !BasicCommandExistByPath("kubectl") { - return false, []string{ - "[KubectlApplyExec] - kubectl command not exist !", - } - } - - // check resourcesYamlFile - if !BasicFileExistAndNotNull(resourcesYamlFile) { - return false, []string{ - fmt.Sprintf("[KubectlApplyExec] - wrong resourcesYamlFile %s not exist !", resourcesYamlFile), - } - } - - // apply -f - ok, resultLog := AllCommandExecutor([]string{ - "/usr/local/bin/kubectl", - "apply", - "-f", - resourcesYamlFile, - }) - if !ok { - return false, resultLog - } - - return true, append(resultLog, - fmt.Sprintf("[KubectlApplyExec] - %s apply success!", resourcesYamlFile)) -} - -func KubectlDeleteExec(resourcesYamlFile string) (bool, []string) { - - // check kubectl - if !BasicCommandExistByPath("kubectl") { - return false, []string{ - "[KubectlDeleteExec] - kubectl command not exist !", - } - } - - // check resourcesYamlFile - if !BasicFileExistAndNotNull(resourcesYamlFile) { - return false, []string{ - fmt.Sprintf("[KubectlDeleteExec] - wrong resourcesYamlFile %s not exist !", resourcesYamlFile), - } - } - - // apply -f - ok, resultLog := AllCommandExecutor([]string{ - "/usr/local/bin/kubectl", - "delete", - "-f", - resourcesYamlFile, - }) - if !ok { - return false, resultLog - } - - return true, append(resultLog, - fmt.Sprintf("[KubectlDeleteExec] - %s delete success!", resourcesYamlFile)) -} - -func K8sCreateNamespace(namespaceName string) bool { - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return false - } - } - - namespace, err := k8sClient.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{}) - if err == nil { - log.InfoF("[K8sCreateNamespace] - namespace of [%s] already exists!", namespaceName) - return true - } - - // create namespace - // 创建命名空间对象 - namespace = &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: namespaceName, - }, - } - // 使用客户端创建命名空间 - namespace, err = k8sClient.CoreV1().Namespaces().Create(context.TODO(), namespace, metav1.CreateOptions{}) - if err != nil { - log.ErrorF("Error getting namespace: %s ", err.Error()) - return false - } - - // check namespace exists - // 尝试获取名为 "xxg" 的命名空间 - namespace, err = k8sClient.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{}) - // 如果返回错误,需要判断是因为命名空间不存在还是其他错误 - if err != nil { - if errors.IsNotFound(err) { - log.ErrorF("Namespace %s cant be got !", namespaceName) - return false - } else { - log.ErrorF("Error retrieving namespace: %s\n", err.Error()) - } - return false - } - - log.DebugF("Namespace %s create successful !", namespaceName) - return true -} - -func K8sGetDashBoardAuthKey() bool { - - if k8sClient == nil { - // this should be the first call of k8s function - k8sClient = newK8sClientInstance() - if k8sClient == nil { - log.ErrorF("k8s client is nil, run k8s function error !") - return false - } - } - - // 获取 kube-system 命名空间的 secrets 列表 - secrets, err := k8sClient.CoreV1().Secrets("kube-system").List(context.TODO(), metav1.ListOptions{}) - if err != nil { - fmt.Printf("Error retrieving secrets from kube-system namespace: %s\n", err.Error()) - os.Exit(1) - } - - // 过滤出名为 admin-user 的 secret - var adminUserSecretName string - for _, secret := range secrets.Items { - if strings.Contains(secret.Name, "admin-user") { - adminUserSecretName = secret.Name - break - } - } - - if adminUserSecretName == "" { - fmt.Println("No admin-user secret found") - os.Exit(1) - } - - // 获取并打印特定的 secret 描述信息 - secret, err := k8sClient.CoreV1().Secrets("kube-system").Get(context.TODO(), adminUserSecretName, metav1.GetOptions{}) - if err != nil { - fmt.Printf("Error retrieving secret %s: %s\n", adminUserSecretName, err.Error()) - os.Exit(1) - } - - // 打印 secret 的详细信息,根据需要格式化输出 - fmt.Printf("Name: %s\nNamespace: %s\nData:\n", secret.Name, secret.Namespace) - for key, value := range secret.Data { - fmt.Printf("%s: %s\n", key, value) - } - - return false - -} +// +//import ( +// "context" +// "fmt" +// v1 "k8s.io/api/apps/v1" +// corev1 "k8s.io/api/core/v1" +// "k8s.io/apimachinery/pkg/api/errors" +// metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +// "k8s.io/client-go/kubernetes" +// "k8s.io/client-go/tools/clientcmd" +// "os" +// "strings" +// "sync" +// "time" +// image2 "wdd.io/agent-common/image" +//) +// +//var k8sConfigFilePath = "/root/wdd/kube_config_cluster.yml" +//var k8sClient = newK8sClientInstance() +// +//func newK8sClientInstance() *kubernetes.Clientset { +// once := sync.Once{} +// +// if !BasicFileExistAndNotNull(k8sConfigFilePath) { +// log.WarnF("[newK8sClientInstance] - k8s config %s does not exist ! ", k8sConfigFilePath) +// return nil +// } +// +// var client *kubernetes.Clientset +// once.Do(func() { +// // 使用kubeconfig文件初始化客户端 +// config, err := clientcmd.BuildConfigFromFlags("", k8sConfigFilePath) +// if err != nil { +// log.ErrorF("[newK8sClientInstance] - load from %s error !", k8sConfigFilePath) +// +// } +// +// client, err = kubernetes.NewForConfig(config) +// if err != nil { +// log.Error("[newK8sClientInstance] - create k8s client error !") +// } +// }) +// +// return client +//} +// +//func K8sCheckPodStatusTimeout(specificPod string, supreme string, waitTimeOut int) bool { +// +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return false +// } +// } +// +// // 设置超时时间和时间间隔 +// timeout := time.After(time.Duration(waitTimeOut) * time.Second) +// tick := time.Tick(5 * time.Second) +// +// // 监控Pod状态 +// for { +// select { +// case <-timeout: +// log.ErrorF("[K8sCheckPodStatusTimeout] - 命名空间: [%s], Pod名称: [%s], 状态: 失败!", supreme, specificPod) +// return false +// case <-tick: +// pod, err := k8sClient.CoreV1().Pods(supreme).Get(context.TODO(), specificPod, metav1.GetOptions{}) +// if err != nil { +// log.ErrorF("[K8sCheckPodStatusTimeout] - 命名空间: [%s], Pod名称: [%s], 获取Pod信息失败 !", supreme, err.Error()) +// } else { +// log.DebugF("[K8sCheckPodStatusTimeout] - 命名空间: [%s], Pod名称: [%s], 状态: [%s]", supreme, pod.Name, pod.Status.Phase) +// if pod.Status.Phase == corev1.PodRunning || pod.Status.Phase == corev1.PodSucceeded { +// return true +// } +// } +// } +// } +//} +// +//func K8sCheckDeploymentStatusTimeout(specificDeployment string, supreme string, waitTimeOut int) bool { +// +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return false +// } +// } +// +// // 设置超时时间和时间间隔 +// timeout := time.After(time.Duration(waitTimeOut) * time.Second) +// tick := time.Tick(5 * time.Second) +// +// // 监控Pod状态 +// for { +// select { +// case <-timeout: +// log.ErrorF("[K8sCheckDeploymentStatusTimeout] - 命名空间: %s, Deployment名称: %s, 状态: 失败!\n", supreme, specificDeployment) +// return false +// case <-tick: +// deployment, err := k8sClient.AppsV1().Deployments(supreme).Get(context.TODO(), specificDeployment, metav1.GetOptions{}) +// if err != nil { +// log.ErrorF("[K8sCheckDeploymentStatusTimeout] - 命名空间: [%s], Deployment 名称: [%s], 获取Deployment信息失败 !", supreme, err.Error()) +// } else { +// log.DebugF("[K8sCheckDeploymentStatusTimeout] - 命名空间: [ %s ], Deployment: [ %s ] 还有Pods未处于Running状态 (Ready: %d, Total: %d)\n", supreme, deployment.Name, deployment.Status.ReadyReplicas, deployment.Status.Replicas) +// +// if deployment.Status.ReadyReplicas == deployment.Status.Replicas { +// return true +// } +// +// } +// } +// } +//} +// +//func K8sDeploymentUpdateTag(supreme, appName, newTag string) (bool, string) { +// +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return false, "" +// } +// } +// +// if newTag == "" { +// log.WarnF("[K8sDeploymentUpdateTag] - can not update image tag to null!") +// return false, "" +// } +// +// deployment := K8sDeploymentExists(supreme, appName) +// if deployment == nil { +// return false, "" +// } +// +// updateResultLog := "" +// +// containers := deployment.Spec.Template.Spec.Containers +// +// // 只支持container的数量为1的形式 +// container := containers[0] +// +// oldName := container.Image +// split := strings.Split(container.Image, ":") +// if strings.HasPrefix(container.Image, image2.CmiiHarborPrefix) { +// // harbor +// container.Image = split[0] + ":" + newTag +// } else if strings.Contains(container.Image, "8033") { +// // 192.168.6.6:8033/rancher/k8s-dns-sidecar:v1.0.2 +// // 重新拼接 +// container.Image = split[0] + ":" + split[1] + ":" + newTag +// } +// log.DebugF("[DeploymentUpdateTag] - update [%s] [%s] from [%s] to [%s]", deployment.Namespace, appName, oldName, container.Image) +// +// // 更新Cmii BIZ_GROUP +// tagVersion := newTag +// if strings.Contains(newTag, "-") { +// tagVersion = strings.Split(newTag, "-")[0] +// } +// envList := container.Env +// for index, envVar := range envList { +// if envVar.Name == "IMAGE_VERSION" { +// envList[index].Value = tagVersion +// } +// if envVar.Name == "BIZ_CONFIG_GROUP" { +// envList[index].Value = tagVersion +// } +// if envVar.Name == "SYS_CONFIG_GROUP" { +// envList[index].Value = tagVersion +// } +// } +// log.DebugF("[DeploymentUpdateTag] - update env IMAGE_VERSION to [%s]", tagVersion) +// +// // 赋值回去 很关键 +// deployment.Spec.Template.Spec.Containers[0] = container +// +// // update +// _, err := k8sClient.AppsV1().Deployments(deployment.Namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}) +// if err != nil { +// sprintf := fmt.Sprintf("[DeploymentUpdateTag] - update [%s] [%s] from [%s] to [%s] error ! %s", deployment.Namespace, appName, split[1], container.Image, err.Error()) +// log.Error(sprintf) +// return false, sprintf +// +// } +// +// return true, updateResultLog +//} +// +//func K8sDeploymentExists(supreme, appName string) *v1.Deployment { +// +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return nil +// } +// } +// +// deployment, err := k8sClient.AppsV1().Deployments(supreme).Get(context.TODO(), appName, metav1.GetOptions{}) +// if err != nil { +// log.ErrorF("[DeploymentExist] - deployments [%s] [%s] not exists ! %s", supreme, appName, err.Error()) +// return nil +// } +// +// return deployment +//} +// +//func K8sListPVCInNamespace(supreme string) (bool, []string) { +// +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return false, []string{ +// "[K8sListPVCInNamespace] - k8s client not exits !", +// } +// } +// } +// +// pvcs, err := k8sClient.CoreV1().PersistentVolumeClaims(supreme).List(context.TODO(), metav1.ListOptions{}) +// if err != nil { +// log.ErrorF("[K8sListPVCInNamespace] - error list pvc list in namespace %s", supreme) +// return false, nil +// } +// +// var pvcList []string +// for _, pvc := range pvcs.Items { +// pvcList = append(pvcList, pvc.Name) +// } +// +// log.DebugF("K8sListPVCInNamespace - all pvc in namespace of [ %s ] are %v", supreme, pvcList) +// return true, pvcList +//} +// +//func K8sCheckPVCStatusTimeOut(specificPvcName string, supreme string, waitTimeOut int) bool { +// +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return false +// } +// } +// +// // 设置超时时间和时间间隔 +// timeout := time.After(time.Duration(waitTimeOut) * time.Second) +// tick := time.Tick(5 * time.Second) +// +// // 监控Pod状态 +// for { +// select { +// case <-timeout: +// log.ErrorF("[K8sCheckPVCStatusTimeOut] - 命名空间: %s, PVC 名称: %s, 状态: 失败! ", supreme, specificPvcName) +// return false +// case <-tick: +// pvc, err := k8sClient.CoreV1().PersistentVolumeClaims(supreme).Get(context.TODO(), specificPvcName, metav1.GetOptions{}) +// if err != nil { +// log.ErrorF("[K8sCheckPVCStatusTimeOut] - 命名空间: [ %s ], 获取 PVC [%s] 信息失败: %s ", supreme, specificPvcName, err.Error()) +// } +// +// if pvc.Status.Phase == corev1.ClaimBound { +// log.DebugF("[K8sCheckPVCStatusTimeOut] - PVC %s in namespace %s is running", specificPvcName, supreme) +// return true +// } else { +// log.WarnF("[K8sCheckPVCStatusTimeOut] - PVC %s in namespace %s run failed !", specificPvcName, supreme) +// return false +// } +// } +// } +//} +// +//func KubectlCheckPodStatus(specific string, supreme string) bool { +// +// if !BasicCommandExists("kubectl") { +// log.Error("kubectl命令不存在,无法查看Pod状态,请查看!") +// } +// +// ok, resultLog := AllCommandExecutor([]string{ +// "kubectl", "-n", supreme, "get", "pod", specific, "-o", "jsonpath='{.status.phase}'", +// }) +// if !ok { +// return false +// } +// +// for _, resultLine := range resultLog { +// if strings.HasPrefix(resultLine, "Running") { +// return true +// } +// } +// +// return false +//} +// +//func KubectlApplyExec(resourcesYamlFile string) (bool, []string) { +// +// // check kubectl +// if !BasicCommandExistByPath("kubectl") { +// return false, []string{ +// "[KubectlApplyExec] - kubectl command not exist !", +// } +// } +// +// // check resourcesYamlFile +// if !BasicFileExistAndNotNull(resourcesYamlFile) { +// return false, []string{ +// fmt.Sprintf("[KubectlApplyExec] - wrong resourcesYamlFile %s not exist !", resourcesYamlFile), +// } +// } +// +// // apply -f +// ok, resultLog := AllCommandExecutor([]string{ +// "/usr/local/bin/kubectl", +// "apply", +// "-f", +// resourcesYamlFile, +// }) +// if !ok { +// return false, resultLog +// } +// +// return true, append(resultLog, +// fmt.Sprintf("[KubectlApplyExec] - %s apply success!", resourcesYamlFile)) +//} +// +//func KubectlDeleteExec(resourcesYamlFile string) (bool, []string) { +// +// // check kubectl +// if !BasicCommandExistByPath("kubectl") { +// return false, []string{ +// "[KubectlDeleteExec] - kubectl command not exist !", +// } +// } +// +// // check resourcesYamlFile +// if !BasicFileExistAndNotNull(resourcesYamlFile) { +// return false, []string{ +// fmt.Sprintf("[KubectlDeleteExec] - wrong resourcesYamlFile %s not exist !", resourcesYamlFile), +// } +// } +// +// // apply -f +// ok, resultLog := AllCommandExecutor([]string{ +// "/usr/local/bin/kubectl", +// "delete", +// "-f", +// resourcesYamlFile, +// }) +// if !ok { +// return false, resultLog +// } +// +// return true, append(resultLog, +// fmt.Sprintf("[KubectlDeleteExec] - %s delete success!", resourcesYamlFile)) +//} +// +//func K8sCreateNamespace(namespaceName string) bool { +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return false +// } +// } +// +// namespace, err := k8sClient.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{}) +// if err == nil { +// log.InfoF("[K8sCreateNamespace] - namespace of [%s] already exists!", namespaceName) +// return true +// } +// +// // create namespace +// // 创建命名空间对象 +// namespace = &corev1.Namespace{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: namespaceName, +// }, +// } +// // 使用客户端创建命名空间 +// namespace, err = k8sClient.CoreV1().Namespaces().Create(context.TODO(), namespace, metav1.CreateOptions{}) +// if err != nil { +// log.ErrorF("Error getting namespace: %s ", err.Error()) +// return false +// } +// +// // check namespace exists +// // 尝试获取名为 "xxg" 的命名空间 +// namespace, err = k8sClient.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{}) +// // 如果返回错误,需要判断是因为命名空间不存在还是其他错误 +// if err != nil { +// if errors.IsNotFound(err) { +// log.ErrorF("Namespace %s cant be got !", namespaceName) +// return false +// } else { +// log.ErrorF("Error retrieving namespace: %s\n", err.Error()) +// } +// return false +// } +// +// log.DebugF("Namespace %s create successful !", namespaceName) +// return true +//} +// +//func K8sGetDashBoardAuthKey() bool { +// +// if k8sClient == nil { +// // this should be the first call of k8s function +// k8sClient = newK8sClientInstance() +// if k8sClient == nil { +// log.ErrorF("k8s client is nil, run k8s function error !") +// return false +// } +// } +// +// // 获取 kube-system 命名空间的 secrets 列表 +// secrets, err := k8sClient.CoreV1().Secrets("kube-system").List(context.TODO(), metav1.ListOptions{}) +// if err != nil { +// fmt.Printf("Error retrieving secrets from kube-system namespace: %s\n", err.Error()) +// os.Exit(1) +// } +// +// // 过滤出名为 admin-user 的 secret +// var adminUserSecretName string +// for _, secret := range secrets.Items { +// if strings.Contains(secret.Name, "admin-user") { +// adminUserSecretName = secret.Name +// break +// } +// } +// +// if adminUserSecretName == "" { +// fmt.Println("No admin-user secret found") +// os.Exit(1) +// } +// +// // 获取并打印特定的 secret 描述信息 +// secret, err := k8sClient.CoreV1().Secrets("kube-system").Get(context.TODO(), adminUserSecretName, metav1.GetOptions{}) +// if err != nil { +// fmt.Printf("Error retrieving secret %s: %s\n", adminUserSecretName, err.Error()) +// os.Exit(1) +// } +// +// // 打印 secret 的详细信息,根据需要格式化输出 +// fmt.Printf("Name: %s\nNamespace: %s\nData:\n", secret.Name, secret.Namespace) +// for key, value := range secret.Data { +// fmt.Printf("%s: %s\n", key, value) +// } +// +// return false +// +//} diff --git a/agent-go/a_executor/beans/SSHConfig.go b/agent-go/a_executor/beans/SSHConfig.go new file mode 100644 index 0000000..66ae8c6 --- /dev/null +++ b/agent-go/a_executor/beans/SSHConfig.go @@ -0,0 +1,203 @@ +package beans + +var Ed25519PrivateKey = `-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACDk8R4KXGgDa5H2r8HrqW1klShoSISV20sLiXZPZPfeLwAAAJCIan+LiGp/ +iwAAAAtzc2gtZWQyNTUxOQAAACDk8R4KXGgDa5H2r8HrqW1klShoSISV20sLiXZPZPfeLw +AAAEDhnul+q0TNTgrO9kfmGsFhtn/rGRIrmhFostjem/QlZuTxHgpcaANrkfavweupbWSV +KGhIhJXbSwuJdk9k994vAAAADHdkZEBjbWlpLmNvbQE= +-----END OPENSSH PRIVATE KEY----- +` + +var Ed25519PublicKey = `ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOTxHgpcaANrkfavweupbWSVKGhIhJXbSwuJdk9k994v wdd@cmii.com +` + +var DefaultSshdConfig = ` +# OCTOPUS AGENT DEFAULT SSHD CONFIG - WDD + +# This is the sshd server system-wide configuration file. See +# sshd_config(5) for more information. + +# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin + +# The strategy used for options in the default sshd_config shipped with +# OpenSSH is to specify options with their default value where +# possible, but leave them commented. Uncommented options override the +# default value. + +#Include /etc/ssh/sshd_config.d/*.conf + +Port 22 +Port 22333 +AddressFamily any +ListenAddress 0.0.0.0 +ListenAddress :: + +#HostKey /etc/ssh/ssh_host_rsa_key +#HostKey /etc/ssh/ssh_host_ecdsa_key +#HostKey /etc/ssh/ssh_host_ed25519_key + +# Ciphers and keying +#RekeyLimit default none + +# Logging +#SyslogFacility AUTH +#LogLevel INFO + +# Authentication: + +#LoginGraceTime 2m +#PermitRootLogin prohibit-password +#StrictModes yes +#MaxAuthTries 6 +#MaxSessions 10 + +#PubkeyAuthentication yes + +# Expect .ssh/authorized_keys2 to be disregarded by default in future. +#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 + +#AuthorizedPrincipalsFile none + +#AuthorizedKeysCommand none +#AuthorizedKeysCommandUser nobody + +# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts +#HostbasedAuthentication no +# Change to yes if you don't trust ~/.ssh/known_hosts for +# HostbasedAuthentication +#IgnoreUserKnownHosts no +# Don't read the user's ~/.rhosts and ~/.shosts files +#IgnoreRhosts yes + +# To disable tunneled clear text passwords, change to no here! +#PasswordAuthentication yes +PermitEmptyPasswords no + +# Change to yes to enable challenge-response passwords (beware issues with +# some PAM modules and threads) +ChallengeResponseAuthentication no + +# Kerberos options +#KerberosAuthentication no +#KerberosOrLocalPasswd yes +#KerberosTicketCleanup yes +#KerberosGetAFSToken no + +# GSSAPI options +#GSSAPIAuthentication no +#GSSAPICleanupCredentials yes +#GSSAPIStrictAcceptorCheck yes +#GSSAPIKeyExchange no + +# Set this to 'yes' to enable PAM authentication, account processing, +# and session processing. If this is enabled, PAM authentication will +# be allowed through the ChallengeResponseAuthentication and +# PasswordAuthentication. Depending on your PAM configuration, +# PAM authentication via ChallengeResponseAuthentication may bypass +# the setting of "PermitRootLogin without-password". +# If you just want the PAM account and session checks to run without +# PAM authentication, then enable this but set PasswordAuthentication +# and ChallengeResponseAuthentication to 'no'. +UsePAM yes + +AllowAgentForwarding yes +AllowTcpForwarding yes +#GatewayPorts no +X11Forwarding yes +#X11DisplayOffset 10 +#X11UseLocalhost yes +#PermitTTY yes +PrintMotd no +#PrintLastLog yes +TCPKeepAlive yes +#PermitUserEnvironment no +#Compression delayed +#ClientAliveInterval 0 +#ClientAliveCountMax 3 +#UseDNS no +#PidFile /var/run/sshd.pid +#MaxStartups 10:30:100 +#PermitTunnel no +#ChrootDirectory none +#VersionAddendum none + +# no default banner path +#Banner none + +# Allow client to pass locale environment variables +AcceptEnv LANG LC_* + +# override default of no subsystems +Subsystem sftp /usr/lib/openssh/sftp-server + +# Example of overriding settings on a per-user basis +#Match User anoncvs +# X11Forwarding no +# AllowTcpForwarding no +# PermitTTY no +# ForceCommand cvs server +PasswordAuthentication yes +PermitRootLogin yes +StrictModes no +ClientAliveInterval 30 +ClientAliveCountMax 60 +` + +var SysctlConfig = ` +# 开启 IPv4 路由转发 +net.ipv4.ip_forward = 1 + +# 禁用 IPv6 +net.ipv6.conf.all.disable_ipv6 = 1 +net.ipv6.conf.default.disable_ipv6 = 1 + +# 开启 IPv4 转发 +net.ipv4.conf.all.forwarding = 1 +net.ipv4.conf.default.forwarding = 1 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_syncookies = 1 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_tw_recycle = 1 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_tw_reuse = 1 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_fin_timeout = 30 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_keepalive_time = 1200 + +# 开启 IPv4 连接跟踪 +net.ipv4.ip_local_port_range = 1024 65535 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_max_syn_backlog = 8192 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_max_tw_buckets = 5000 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_max_orphans = 32768 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_synack_retries = 2 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_syn_retries = 2 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_synflood_protect = 1000 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_timestamps = 1 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_window_scaling = 1 + +# 开启 IPv4 连接跟踪 +net.ipv4.tcp_rmem = 4096 87380 4194304 +` diff --git a/agent-go/a_executor/beans/SshKeyConfig.go b/agent-go/a_executor/beans/SshKeyConfig.go deleted file mode 100755 index dc65df7..0000000 --- a/agent-go/a_executor/beans/SshKeyConfig.go +++ /dev/null @@ -1,71 +0,0 @@ -package beans - -var Ed25519PrivateKey = `-----BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACDk8R4KXGgDa5H2r8HrqW1klShoSISV20sLiXZPZPfeLwAAAJCIan+LiGp/ -iwAAAAtzc2gtZWQyNTUxOQAAACDk8R4KXGgDa5H2r8HrqW1klShoSISV20sLiXZPZPfeLw -AAAEDhnul+q0TNTgrO9kfmGsFhtn/rGRIrmhFostjem/QlZuTxHgpcaANrkfavweupbWSV -KGhIhJXbSwuJdk9k994vAAAADHdkZEBjbWlpLmNvbQE= ------END OPENSSH PRIVATE KEY----- -` - -var Ed25519PublicKey = `ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOTxHgpcaANrkfavweupbWSVKGhIhJXbSwuJdk9k994v wdd@cmii.com -` - -var SysctlConfig = ` -# 开启 IPv4 路由转发 -net.ipv4.ip_forward = 1 - -# 禁用 IPv6 -net.ipv6.conf.all.disable_ipv6 = 1 -net.ipv6.conf.default.disable_ipv6 = 1 - -# 开启 IPv4 转发 -net.ipv4.conf.all.forwarding = 1 -net.ipv4.conf.default.forwarding = 1 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_syncookies = 1 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_tw_recycle = 1 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_tw_reuse = 1 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_fin_timeout = 30 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_keepalive_time = 1200 - -# 开启 IPv4 连接跟踪 -net.ipv4.ip_local_port_range = 1024 65535 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_max_syn_backlog = 8192 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_max_tw_buckets = 5000 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_max_orphans = 32768 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_synack_retries = 2 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_syn_retries = 2 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_synflood_protect = 1000 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_timestamps = 1 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_window_scaling = 1 - -# 开启 IPv4 连接跟踪 -net.ipv4.tcp_rmem = 4096 87380 4194304 -` diff --git a/agent-go/a_init/AgentInitialization.go b/agent-go/a_init/AgentInitialization.go index b15f9a1..861c627 100755 --- a/agent-go/a_init/AgentInitialization.go +++ b/agent-go/a_init/AgentInitialization.go @@ -245,6 +245,7 @@ func buildOctopusTCPConnect(agentConfig *viper.Viper) *rabbitmq.RabbitTCPConnect } } +// refreshAgentInfoByStatusInfo 调用AgentStatus查询Agent的状态信息, func refreshAgentInfoByStatusInfo(agentInfo *a_status.AgentInfo, agentServerInfo *a_agent.AgentServerInfo) { // cpu part diff --git a/agent-go/a_init/BastionInitializaion.go b/agent-go/a_init/BastionInitializaion.go index f94ea36..c55a517 100755 --- a/agent-go/a_init/BastionInitializaion.go +++ b/agent-go/a_init/BastionInitializaion.go @@ -33,7 +33,8 @@ const ( InstallDocker = "docker" InstallDockerCompose = "dockercompose" InstallHarbor = "harbor" - InstallDefaultSsh = "ssh" + InstallDefaultSsh = "sshkey" + ModifySSHConfig = "sshconfig" DisableSwap = "swap" DisableSelinux = "selinux" DisableFirewall = "firewall" @@ -113,6 +114,8 @@ func BastionModeInit() { switch inputCommand { case InstallDefaultSsh: beautifulPrintExeResult(agentOperator.InstallDefaultSshBastion()) + case ModifySSHConfig: + beautifulPrintExeResult(agentOperator.ModifySSHConfigBastion()) case DisableSwap: beautifulPrintExeResult(agentOperator.DisableSwapBastion()) case DisableSelinux: @@ -165,6 +168,7 @@ func buildBastionModeFunction() { tcc.Insert(InstallDockerCompose) tcc.Insert(InstallMinio) tcc.Insert(InstallDefaultSsh) + tcc.Insert(ModifySSHConfig) tcc.Insert(DisableSwap) tcc.Insert(DisableSelinux) tcc.Insert(DisableFirewall) diff --git a/agent-go/go.mod b/agent-go/go.mod index dee9a5f..75aba42 100755 --- a/agent-go/go.mod +++ b/agent-go/go.mod @@ -3,89 +3,43 @@ module wdd.io/agent-go go 1.22.1 require ( - github.com/mittwald/goharbor-client/v5 v5.5.3 github.com/panjf2000/ants/v2 v2.7.2 github.com/shirou/gopsutil/v3 v3.23.3 github.com/spf13/viper v1.15.0 github.com/streadway/amqp v1.1.0 golang.org/x/net v0.24.0 gopkg.in/yaml.v3 v3.0.1 - 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 ) replace wdd.io/agent-common => ../agent-common require ( - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.3.0 // indirect - github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // 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/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/google/go-cmp v0.6.0 // indirect github.com/hashicorp/hcl v1.0.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/kr/pretty v0.3.1 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect github.com/mitchellh/mapstructure v1.5.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/oklog/ulid v1.3.1 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/shoenig/go-m1cpu v0.1.4 // indirect github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.8.4 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // 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/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 - 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/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // 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.3.0 // indirect ) diff --git a/agent-go/go.sum b/agent-go/go.sum index c161464..6ea244d 100755 --- a/agent-go/go.sum +++ b/agent-go/go.sum @@ -38,11 +38,6 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -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/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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -55,8 +50,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 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/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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -70,80 +63,8 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -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-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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -169,14 +90,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -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/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -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.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -186,14 +101,10 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/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.4/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.6/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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -207,13 +118,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/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/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -223,23 +129,9 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -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/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -253,44 +145,13 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -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/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/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/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/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/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/panjf2000/ants/v2 v2.7.2 h1:2NUt9BaZFO5kQzrieOmK/wdb/tQ/K+QHaxN8sOgD63U= github.com/panjf2000/ants/v2 v2.7.2/go.mod h1:KIBmYG9QQX5U2qzFP/yQJaq/nSb6rahS9iEHkrCMgM8= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -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/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -298,9 +159,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -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.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 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/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE= @@ -309,17 +169,12 @@ github.com/shoenig/go-m1cpu v0.1.4 h1:SZPIgRM2sEF9NJy50mRHu9PKGwxyyTTJIWvCtgVboz github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c= github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -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/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -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/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= @@ -327,15 +182,11 @@ github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jH github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM= github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg= 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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -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= @@ -345,61 +196,35 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -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.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/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= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -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.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -433,7 +258,6 @@ 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.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -465,9 +289,6 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 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.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -479,34 +300,24 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20201207232520-09787c993a3a/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.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -535,52 +346,34 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/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-20210423185535-09eb48e85fd7/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/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.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.4/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.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -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-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -609,7 +402,6 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -618,12 +410,8 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -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= @@ -653,7 +441,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -717,29 +504,15 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -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/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -749,24 +522,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -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= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -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.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/agent-go/main.go b/agent-go/main.go index b0a5094..4b896af 100755 --- a/agent-go/main.go +++ b/agent-go/main.go @@ -10,6 +10,7 @@ import ( var log = logger.Log // C:\Users\wddsh\go\bin\gox.exe -osarch="linux/amd64" -output "build/octopus-agent_{{.OS}}_{{.Arch}}" +// C:\Users\wdd\go\bin\gox.exe -osarch="linux/amd64" -output "build/octopus-agent_{{.OS}}_{{.Arch}}" // /root/go/bin/gox -osarch="linux/amd64" -output "build/octopus-agent_{{.OS}}_{{.Arch}}" // bash <(curl -sL http://172.28.0.10:9000/octopus/init-script-wdd.sh) --offline --url http://172.28.0.10:9000 --agent-install diff --git a/agent-operator/CmiiK8sHigherOperator_test.go b/agent-operator/CmiiK8sHigherOperator_test.go index 261c63e..726fa30 100644 --- a/agent-operator/CmiiK8sHigherOperator_test.go +++ b/agent-operator/CmiiK8sHigherOperator_test.go @@ -292,7 +292,7 @@ func TestUpdateCmiiDeploymentImageTag(t *testing.T) { appNameTagMap := map[string]string{ //"cmii-app-release": "6.1.0-122001", - "cmii-uav-device": "6.1.0-1125-123001", + "cmii-uas-lifecycle": "6.2.0-master-1.1-012201", //"cmii-uav-platform-pilot2-to-cloud": "6.1.0-32030-123101", //"cmii-uav-industrial-portfolio": "6.1.0-20241125-121702", }