250 lines
5.9 KiB
Go
250 lines
5.9 KiB
Go
package executor
|
|
|
|
import (
|
|
"strings"
|
|
"wdd.io/agent-common/image"
|
|
)
|
|
|
|
var LocalGzipImageFolderPrefix = "/var/lib/docker/image_sync/"
|
|
|
|
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)
|
|
if !PureResultSingleExecute([]string{
|
|
"docker",
|
|
"pull",
|
|
imageFullName,
|
|
}) {
|
|
return false, []string{
|
|
"docker pull failed of " + imageFullName,
|
|
}
|
|
}
|
|
|
|
if !JudgeDockerImageExists(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 JudgeDockerImageExists(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 := AllCommandExecutor([]string{
|
|
"mc",
|
|
"cp",
|
|
gzipFolderPrefix + gzipImageFromFullName,
|
|
"demo/cmlc-installation/tmp/",
|
|
})
|
|
|
|
if !ok {
|
|
return false, resultLog
|
|
}
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
func (op *AgentOsOperator) downloadGzipImageFile(funcArgs []string) (bool, []string) {
|
|
|
|
ossUrlPrefix := funcArgs[3]
|
|
gzipImageFromFullName := funcArgs[2]
|
|
proxyUrl := funcArgs[4]
|
|
|
|
if proxyUrl == "" {
|
|
BasicDownloadFile(ossUrlPrefix+gzipImageFromFullName, LocalGzipImageFolderPrefix+gzipImageFromFullName)
|
|
} else {
|
|
BasicDownloadFileWithProxy(ossUrlPrefix+gzipImageFromFullName, proxyUrl, LocalGzipImageFolderPrefix+gzipImageFromFullName)
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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.ImageFullNameToTargetImageFullName(imageFullName, targetHarborHost)
|
|
|
|
if !PureResultSingleExecute([]string{
|
|
"docker",
|
|
"tag",
|
|
imageFullName,
|
|
targetImageFullName,
|
|
}) {
|
|
return false, []string{
|
|
"docker tag error!",
|
|
}
|
|
}
|
|
|
|
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]
|
|
targetImageFullName := funcArgs[7]
|
|
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)
|
|
|
|
updateCommand := "kubectl -n " + namespace + " patch deployment " + appName + "-p \"{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\": " + appName + ",\"image\": " + targetImageFullName + "}]}}}}"
|
|
executor, i := HardCodeCommandExecutor(updateCommand)
|
|
if !executor {
|
|
return false, i
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func JudgeDockerImageExists(imageFullName string) bool {
|
|
return true
|
|
}
|
|
|
|
//func BuildGzipImageFromFullName(imageFullName string) string {
|
|
//
|
|
//}
|