297 lines
8.8 KiB
Go
Executable File
297 lines
8.8 KiB
Go
Executable File
package image
|
||
|
||
import (
|
||
"os"
|
||
"path/filepath"
|
||
"strings"
|
||
"wdd.io/agent-common/logger"
|
||
)
|
||
|
||
var log = logger.Log
|
||
|
||
var unSupported = "UN-SUPPORT-APP-NAME"
|
||
|
||
const CmiiHarborPrefix = "harbor.cdcyy.com.cn/cmii/"
|
||
|
||
func ImageFullNameToAppName(imageFullName string) (appName string) {
|
||
|
||
// harbor.cdcyy.cn/cmii/cmii-uav-platform:5.4.0 ==> cmii-uav-platform
|
||
|
||
// 10.1.1.1:8033/cmii/ok:1.2 不支持 不允许存在
|
||
// rancher/fleet:v0.3.4
|
||
|
||
// ossr/srs:v5.0.1
|
||
// nginx:latest
|
||
// bitnami/minio:2022.5.4
|
||
// simonrupf/chronyd:0.4.3
|
||
|
||
s := strings.Split(imageFullName, ":")
|
||
if len(s) == 1 {
|
||
// nginx
|
||
return imageFullName
|
||
}
|
||
// 10.1.1.1:8033/cmii/ok:1.2
|
||
// harbor.cdcyy.cn/cmii/cmii-uav-platform:5.4.0 ==> cmii-uav-platform
|
||
// rancher/fleet:v0.3.4
|
||
// ossr/srs:v5.0.1
|
||
// nginx:latest
|
||
// bitnami/minio:2022.5.4
|
||
// simonrupf/chronyd:0.4.3
|
||
|
||
middle := s[len(s)-2]
|
||
split := strings.Split(middle, "/")
|
||
return split[len(split)-1]
|
||
}
|
||
|
||
func ImageFullNameToImageTag(imageFullName string) (imageTag string) {
|
||
s := strings.Split(imageFullName, ":")[1]
|
||
|
||
if strings.Contains(s, ":") {
|
||
// 10.1.1.1:8033/cmii/ok:1.2
|
||
return strings.Split(imageFullName, ":")[2]
|
||
}
|
||
|
||
return s
|
||
}
|
||
|
||
func ImageFullNameToImageNameAndTag(imageFullName string) (imageName, imageTag string) {
|
||
|
||
s := strings.Split(imageFullName, ":")
|
||
if len(s) == 1 {
|
||
// nginx
|
||
return imageFullName, "latest"
|
||
}
|
||
// 10.1.1.1:8033/cmii/ok:1.2
|
||
// harbor.cdcyy.cn/cmii/cmii-uav-platform:5.4.0 ==> cmii-uav-platform
|
||
// rancher/fleet:v0.3.4
|
||
// ossr/srs:v5.0.1
|
||
// nginx:latest
|
||
// bitnami/minio:2022.5.4
|
||
// simonrupf/chronyd:0.4.3
|
||
|
||
middle := s[len(s)-2]
|
||
split := strings.Split(middle, "/")
|
||
return split[len(split)-1], s[len(s)-1]
|
||
|
||
}
|
||
|
||
// ImageFullNameToGzipFileName 必须输出长度为4的内容 =出现得次数为3
|
||
func ImageFullNameToGzipFileName(imageFullName string) (gzipFileName string) {
|
||
|
||
// harbor.cdcyy.cn/cmii/cmii-uav-platform:5.4.0 ==> cmlc=cmii=cmii-uav-platform=5.4.0.tar.gz
|
||
// rancher/fleet:v0.3.4
|
||
|
||
// ossr/srs:v5.0.1 ==> docker=cmii=srs=v5.0.1.tar.gz
|
||
// nginx:latest
|
||
// bitnami/minio:2022.5.4
|
||
// simonrupf/chronyd:0.4.3
|
||
|
||
// 10.1.1.1:8033/cmii/ok:1.2 不支持 不允许存在
|
||
|
||
split := strings.Split(imageFullName, ":")
|
||
//log.DebugF(" %s to %s", imageRepoTag, split)
|
||
if len(split) == 1 {
|
||
// nginx
|
||
return "docker=library=" + imageFullName + "=latest.tar.gz"
|
||
}
|
||
|
||
first := strings.Split(split[0], "/")
|
||
//log.DebugF(" split[0] %s to %s", split[0], first)
|
||
if len(first) == 3 {
|
||
// harbor.cdcyy.cn/cmii/cmii-uav-platform:5.4.0
|
||
// docker.io/ossr/srs:v5.0.1
|
||
// docker.107421.xyz/rancher/calico-cni:v3.17.2
|
||
if strings.HasPrefix(split[0], CmiiHarborPrefix) {
|
||
gzipFileName += "cmlc=cmii="
|
||
} else if strings.Contains(split[0], "rancher") {
|
||
gzipFileName += "docker=rancher="
|
||
} else {
|
||
gzipFileName += "docker=cmii="
|
||
}
|
||
gzipFileName += first[2]
|
||
gzipFileName += "="
|
||
|
||
} else if len(first) == 4 {
|
||
// harbor.cdcyy.cn/cmii/ossr/srs:v5.0.1
|
||
// harbor.cdcyy.com.cn/cmii/cmlc-ai/cmlc-ai-operator:v5.2.0-t4-no-dino
|
||
|
||
if !strings.HasPrefix(split[0], CmiiHarborPrefix) {
|
||
return imageFullName
|
||
}
|
||
gzipFileName += "cmlc=cmii="
|
||
gzipFileName += first[3]
|
||
gzipFileName += "="
|
||
} else if len(first) == 2 {
|
||
// bitnami/redis
|
||
// ossrs/srs
|
||
gzipFileName += "docker="
|
||
gzipFileName += first[0]
|
||
gzipFileName += "="
|
||
gzipFileName += first[1]
|
||
gzipFileName += "="
|
||
} else if len(first) == 1 {
|
||
// nginx:latest
|
||
return "docker=library=" + split[0] + "=" + split[1] + ".tar.gz"
|
||
}
|
||
|
||
gzipFileName += split[1]
|
||
gzipFileName += ".tar.gz"
|
||
|
||
return gzipFileName
|
||
}
|
||
|
||
// ImageNameToTargetImageFullName 将ImageName转换为目标TargetHosts的全名称,ImageName的格式为 短名称或者长名称 均可
|
||
func ImageNameToTargetImageFullName(imageName, targetHarborHost string) string {
|
||
|
||
targetProject := "cmii"
|
||
if strings.HasPrefix(imageName, "rancher") {
|
||
// rancher/rancher:v2.5.7 rancher名称的形式
|
||
targetProject = "rancher"
|
||
}
|
||
|
||
countOfSplit := strings.Count(imageName, "/")
|
||
split := strings.Split(imageName, "/")
|
||
targetImageName := imageName
|
||
|
||
switch countOfSplit {
|
||
case 0:
|
||
// nginx:latest
|
||
targetImageName = targetHarborHost + "/" + targetProject + "/" + imageName
|
||
break
|
||
default:
|
||
// 10.250.0.10:8033/cmii/cmii-uav-gateway:v1.0.0
|
||
targetImageName = targetHarborHost + "/" + targetProject + "/" + split[countOfSplit]
|
||
break
|
||
}
|
||
|
||
//if strings.HasPrefix(imageFullName, CmiiHarborPrefix) {
|
||
// imageFullName = strings.TrimPrefix(imageFullName, CmiiHarborPrefix)
|
||
//} else if strings.HasPrefix(imageFullName, "docker.io") {
|
||
// imageFullName = strings.TrimPrefix(imageFullName, "docker.io")
|
||
//}
|
||
//// rancher/123:v123
|
||
//if strings.HasPrefix(imageFullName, "rancher") {
|
||
// return targetHostFullName + "/" + imageFullName
|
||
//}
|
||
//// ossr/srs:v4.0.5
|
||
//if strings.Contains(imageFullName, "/") {
|
||
// imageFullName = strings.Split(imageFullName, "/")[1]
|
||
//}
|
||
//
|
||
//// srs:v4.0.5
|
||
//// cmii-uav-platform:5.4.0
|
||
//s := targetHostFullName + "/cmii/" + imageFullName
|
||
//log.InfoF("ImageFullName: [%s] to TargetImageFullName: [%s]", imageName, targetImageName)
|
||
return targetImageName
|
||
}
|
||
|
||
func GzipFileNameToImageFullName(gzipFileName string) (imageFullName string) {
|
||
if !strings.HasSuffix(gzipFileName, ".tar.gz") {
|
||
log.ErrorF(" %s is not end with .tar.gz", gzipFileName)
|
||
return ""
|
||
}
|
||
gzipFileName = strings.TrimSuffix(gzipFileName, ".tar.gz")
|
||
|
||
if strings.HasPrefix(gzipFileName, "docker=library") {
|
||
// docker=library=busybox=latest.tar.gz
|
||
return strings.Split(gzipFileName, "=")[2] + ":" + strings.Split(gzipFileName, "=")[3]
|
||
}
|
||
|
||
if strings.HasPrefix(gzipFileName, "docker") {
|
||
return strings.Split(gzipFileName, "=")[1] + "/" + strings.Split(gzipFileName, "=")[2] + ":" + strings.Split(gzipFileName, "=")[3]
|
||
}
|
||
|
||
if strings.HasPrefix(gzipFileName, "cmlc=cmii=") {
|
||
return strings.Split(gzipFileName, "=")[2] + ":" + strings.Split(gzipFileName, "=")[3]
|
||
}
|
||
|
||
return gzipFileName
|
||
}
|
||
|
||
func GzipFileNameToImageNameAndTag(gzipFileName string) (imageName, imageTag string) {
|
||
if !strings.HasSuffix(gzipFileName, ".tar.gz") {
|
||
log.ErrorF(" %s is not end with .tar.gz", gzipFileName)
|
||
return "", ""
|
||
}
|
||
gzipFileName = strings.TrimSuffix(gzipFileName, ".tar.gz")
|
||
|
||
if strings.HasPrefix(gzipFileName, "docker=library") {
|
||
// docker=library=busybox=latest.tar.gz
|
||
return strings.Split(gzipFileName, "=")[2], strings.Split(gzipFileName, "=")[3]
|
||
}
|
||
|
||
if strings.HasPrefix(gzipFileName, "docker") {
|
||
// docker=kubernetes=kubernetes-dashboard=v2.4.0.tar.gz
|
||
return strings.Split(gzipFileName, "=")[1] + "/" + strings.Split(gzipFileName, "=")[2], strings.Split(gzipFileName, "=")[3]
|
||
}
|
||
|
||
if strings.HasPrefix(gzipFileName, "cmlc=cmii=") {
|
||
return strings.Split(gzipFileName, "=")[2], strings.Split(gzipFileName, "=")[3]
|
||
}
|
||
|
||
return "", ""
|
||
}
|
||
|
||
func GzipFolderPathToCmiiImageTagMaps(gzipFolderPath string) (frontendImageVersionMap, backendImageVersionMap, srsImageVersionMap map[string]string) {
|
||
|
||
frontendImageVersionMap = make(map[string]string)
|
||
backendImageVersionMap = make(map[string]string)
|
||
srsImageVersionMap = make(map[string]string)
|
||
|
||
filepath.WalkDir(gzipFolderPath, func(path string, d os.DirEntry, err error) error {
|
||
//fmt.Println(path)
|
||
if d == nil {
|
||
return nil
|
||
}
|
||
name := d.Name()
|
||
if strings.HasSuffix(name, ".tar.gz") {
|
||
imageName, imageTag := GzipFileNameToImageNameAndTag(name)
|
||
if strings.Contains(imageName, "platform") {
|
||
frontendImageVersionMap[imageName] = imageTag
|
||
} else if strings.Contains(imageName, "srs") {
|
||
srsImageVersionMap[imageName] = imageTag
|
||
} else if strings.Contains(imageName, "operator") {
|
||
srsImageVersionMap[imageName] = imageTag
|
||
} else {
|
||
backendImageVersionMap[imageName] = imageTag
|
||
}
|
||
}
|
||
|
||
return nil
|
||
})
|
||
|
||
return frontendImageVersionMap, backendImageVersionMap, srsImageVersionMap
|
||
}
|
||
|
||
func CmiiImageMapFromImageFullNameList(cmiiImageFullNameList []string) (cmiiImageVersionMap map[string]string) {
|
||
|
||
cmiiImageVersionMap = make(map[string]string)
|
||
for _, imageFullName := range cmiiImageFullNameList {
|
||
imageName, imageTag := ImageFullNameToImageNameAndTag(imageFullName)
|
||
cmiiImageVersionMap[imageName] = imageTag
|
||
}
|
||
|
||
return cmiiImageVersionMap
|
||
}
|
||
|
||
func FrontendBackendSrsImageMapFromCmiiImageMap(cmiiImageVersionMap map[string]string) (frontendImageVersionMap, backendImageVersionMap, srsImageVersionMap map[string]string) {
|
||
|
||
frontendImageVersionMap = make(map[string]string)
|
||
backendImageVersionMap = make(map[string]string)
|
||
srsImageVersionMap = make(map[string]string)
|
||
|
||
for imageName, imageTag := range cmiiImageVersionMap {
|
||
if strings.Contains(imageName, "platform") {
|
||
frontendImageVersionMap[imageName] = imageTag
|
||
} else if strings.Contains(imageName, "srs") {
|
||
srsImageVersionMap[imageName] = imageTag
|
||
} else if strings.Contains(imageName, "operator") {
|
||
srsImageVersionMap[imageName] = imageTag
|
||
} else {
|
||
backendImageVersionMap[imageName] = imageTag
|
||
}
|
||
}
|
||
|
||
return frontendImageVersionMap, backendImageVersionMap, srsImageVersionMap
|
||
}
|