#!/bin/bash
#此脚本实现部署本地镜像仓库并拉取ai-deployer项目镜像至该镜像仓库的功能,请配置以下5个参数并执行该脚本.部署要求/data目录可用空间大于100G

#工作目录,ai-deployer源码实际所在路径
BASE=/opt/ai-deployer
#AI平台版本号
VERSION=$(grep -r VERSION $BASE/ai.config|awk -F"=" '{print $2}')
#本地镜像仓库IP地址
HARBOR_IP=$(grep -r 'HARBOR_DOMAIN' $BASE/ai.config |cut -d'=' -f2|awk '{print $1}')
#本地镜像仓库端口
HARBOR_PORT=$(grep -r 'HARBOR_NODE_PORT' $BASE/ai.config |cut -d'=' -f2|awk '{print $1}')
#本地镜像仓库admin用户密码
HARBOR_ADMIN_PASSWORD=$(grep -r 'HARBOR_ADMIN_PASSWORD' $BASE/ai.config |cut -d'=' -f2|awk '{print $1}')


#====================================================
MINIO_URL=https://minio.mopaas.com
REGISTRY_URL=https://registry.mopaas.com
REGISTRY_DOMAIN=${REGISTRY_URL#*//}
REGISTRY_LOCAL="$HARBOR_IP:$HARBOR_PORT"
DOCKER_VER=20.10.5
HARBOR_VER=v1.10.16
REGISTRY_MIRROR=CN




function logger() {
  TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S')
  case "$1" in
    debug)
      echo -e "$TIMESTAMP \033[36mDEBUG\033[0m $2"
      ;;
    info)
      echo -e "$TIMESTAMP \033[32mINFO\033[0m $2"
      ;;
    warn)
      echo -e "$TIMESTAMP \033[33mWARN\033[0m $2"
      ;;
    error)
      echo -e "$TIMESTAMP \033[31mERROR\033[0m $2"
      ;;
    *)
      ;;
  esac
}

function get_images() {
    logger debug "正在拉取镜像至本地仓库"
    #PROJECT_ID=$(curl -s -X GET "$REGISTRY_URL/api/projects?name=ai-deploy" -H "accept: application/json"|grep "project_id"|awk 'NR<2{print $2}'|cut -d',' -f1)
    #REPOS=$(curl -s -X GET --header 'Accept: application/json' "$REGISTRY_URL/api/repositories?project_id=$PROJECT_ID"|grep "name"|awk -F '"' '{print $4}')
    #登录本地镜像仓库
    docker login $REGISTRY_LOCAL -u admin -p $HARBOR_ADMIN_PASSWORD
    #拉取线上镜像仓库ai-deployer项目下的镜像
    #for repo in $REPOS
    #do
    #  TAGS=$(curl -s -X GET --header 'Accept: application/json' "$REGISTRY_URL/api/repositories/$repo/tags"|grep -A 4 'digest'|grep \"name\"|awk -F '"' '{print $4}'|sort -r)
    #  image=$(echo $repo|awk -F "/" '{print $2}')
    #  for tag in $TAGS
    #  do
    #    logger info "正在拉取$repo:$tag并推送至本地仓库"
    #    docker pull $REGISTRY_DOMAIN/$repo:$tag
    #    docker tag $REGISTRY_DOMAIN/$repo:$tag $REGISTRY_LOCAL/$repo:$tag
    #    docker push $REGISTRY_LOCAL/$repo:$tag
    #    #echo "$REGISTRY_LOCAL/$repo:$tag flag=0" >> images-tag
    #    #docker save $REGISTRY_LOCAL/$repo:$tag > /opt/docker/$image-$tag.tar.gz
    #  done
    #  echo "======================================="
    #done
    #images=$(cat $BASE/images-list)
    #for image in $images
    #do
    #    docker pull $REGISTRY_DOMAIN/$image
    #    docker tag $REGISTRY_DOMAIN/$image $REGISTRY_LOCAL/$image
    #    echo "$REGISTRY_LOCAL/$image flag=0" >> images-tag
    #done
    > $BASE/images-tag
    nohup ./get-images.sh & >/dev/null 2>&1
    ./push-images.sh

    #拉取AI平台应用镜像
    docker pull $REGISTRY_DOMAIN/ai/ai-user:$VERSION
    docker tag $REGISTRY_DOMAIN/ai/ai-user:$VERSION $REGISTRY_LOCAL/ai/ai-user:$VERSION
    docker push $REGISTRY_LOCAL/ai/ai-user:$VERSION

    docker pull $REGISTRY_DOMAIN/ai/ai-mgr-web:$VERSION
    docker tag $REGISTRY_DOMAIN/ai/ai-mgr-web:$VERSION $REGISTRY_LOCAL/ai/ai-mgr-web:$VERSION
    docker push $REGISTRY_LOCAL/ai/ai-mgr-web:$VERSION

    docker pull $REGISTRY_DOMAIN/ai/ai-mgr:$VERSION
    docker tag $REGISTRY_DOMAIN/ai/ai-mgr:$VERSION $REGISTRY_LOCAL/ai/ai-mgr:$VERSION
    docker push $REGISTRY_LOCAL/ai/ai-mgr:$VERSION

    docker pull $REGISTRY_DOMAIN/ai/ai-user-web:$VERSION
    docker tag $REGISTRY_DOMAIN/ai/ai-user-web:$VERSION $REGISTRY_LOCAL/ai/ai-user-web:$VERSION
    docker push $REGISTRY_LOCAL/ai/ai-user-web:$VERSION

#    docker pull $REGISTRY_DOMAIN/ai/ai-kop:$VERSION
#    docker tag $REGISTRY_DOMAIN/ai/ai-kop:$VERSION $REGISTRY_LOCAL/ai/ai-kop:$VERSION
#    docker push $REGISTRY_LOCAL/ai/ai-kop:$VERSION

#    docker pull $REGISTRY_DOMAIN/ai/ai-kop-web:$VERSION
#    docker tag $REGISTRY_DOMAIN/ai/ai-kop-web:$VERSION $REGISTRY_LOCAL/ai/ai-kop-web:$VERSION
#    docker push $REGISTRY_LOCAL/ai/ai-kop-web:$VERSION

    docker pull $REGISTRY_DOMAIN/ai/page-render:v1
    docker tag $REGISTRY_DOMAIN/ai/page-render:v1 $REGISTRY_LOCAL/ai/page-render:v1
    docker push $REGISTRY_LOCAL/ai/page-render:v1

    #拉取AI框架镜像
    TENSORFLOW_GPU_TAG=2.16.2-cuda12.3-py311-ubuntu22.04-v3.6
    PYTORCH_GPU_TAG=2.3.1-cuda12.1-cudnn8-py310-ubuntu22.04-v3.6
    PYTORCH_SERVING_GPU_TAG=0.11.1-torch2.1-cuda12.1-cudnn8
    PYTORCH_SERVING_TAG=0.10.0
    TENSORFLOW_SERVING_GPU_TAG=0.10.0-tf2.11.0-gpu
    TENSORFLOW_SERVING_TAG=0.10.0-tf2.11.0
    CONDA_TAG=cuda12.3-ubuntu20.04-py310-v3.6
    HOROVOD_NVTABULAR_TAG=0.28.0-ubuntu-20.04-py38-v3.6
    LLAMA2_TAG=v7
    PADDLE_GPU_TAG=2.6.1-ubuntu22.04-py310-cuda12.0-v3.6
    PADDLESERVER_TAG=v0.10.0
    STABLEDIFFUSION_TAG=train-v4
    AI_EXPLORER_TAG=v1.10
    ADAPT_JOB_TAG=v3.6
    LABELSTUDIO_TAG=v1.8.0

    docker pull $REGISTRY_DOMAIN/ai/ai-explorer:$AI_EXPLORER_TAG
    docker tag $REGISTRY_DOMAIN/ai/ai-explorer:$AI_EXPLORER_TAG  $REGISTRY_LOCAL/ai/ai-explorer:$AI_EXPLORER_TAG
    docker push $REGISTRY_LOCAL/ai/ai-explorer:$AI_EXPLORER_TAG
    
    docker pull $REGISTRY_DOMAIN/ai/label-studio:$LABELSTUDIO_TAG
    docker tag $REGISTRY_DOMAIN/ai/label-studio:$LABELSTUDIO_TAG $REGISTRY_LOCAL/ai/label-studio:$LABELSTUDIO_TAG
    docker push $REGISTRY_LOCAL/ai/label-studio:$LABELSTUDIO_TAG
    
    docker pull $REGISTRY_DOMAIN/ai/adapt-job:$ADAPT_JOB_TAG
    docker tag $REGISTRY_DOMAIN/ai/adapt-job:$ADAPT_JOB_TAG $REGISTRY_LOCAL/ai/adapt-job:$ADAPT_JOB_TAG
    docker push $REGISTRY_LOCAL/ai/adapt-job:$ADAPT_JOB_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/tensorflow-gpu:$TENSORFLOW_GPU_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/tensorflow-gpu:$TENSORFLOW_GPU_TAG  $REGISTRY_LOCAL/frame_system/tensorflow-gpu:$TENSORFLOW_GPU_TAG
    docker push $REGISTRY_LOCAL/frame_system/tensorflow-gpu:$TENSORFLOW_GPU_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/pytorch-gpu:$PYTORCH_GPU_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/pytorch-gpu:$PYTORCH_GPU_TAG  $REGISTRY_LOCAL/frame_system/pytorch-gpu:$PYTORCH_GPU_TAG
    docker push $REGISTRY_LOCAL/frame_system/pytorch-gpu:$PYTORCH_GPU_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/pytorch-serving:$PYTORCH_SERVING_GPU_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/pytorch-serving:$PYTORCH_SERVING_GPU_TAG $REGISTRY_LOCAL/frame_system/pytorch-serving:$PYTORCH_SERVING_GPU_TAG
    docker push $REGISTRY_LOCAL/frame_system/pytorch-serving:$PYTORCH_SERVING_GPU_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/pytorch-serving:$PYTORCH_SERVING_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/pytorch-serving:$PYTORCH_SERVING_TAG $REGISTRY_LOCAL/frame_system/pytorch-serving:$PYTORCH_SERVING_TAG
    docker push $REGISTRY_LOCAL/frame_system/pytorch-serving:$PYTORCH_SERVING_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_GPU_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_GPU_TAG $REGISTRY_LOCAL/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_GPU_TAG
    docker push $REGISTRY_LOCAL/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_GPU_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_TAG $REGISTRY_LOCAL/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_TAG
    docker push $REGISTRY_LOCAL/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/conda:$CONDA_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/conda:$CONDA_TAG $REGISTRY_LOCAL/frame_system/conda:$CONDA_TAG
    docker push $REGISTRY_LOCAL/frame_system/conda:$CONDA_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/horovod-nvtabular:$HOROVOD_NVTABULAR_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/horovod-nvtabular:$HOROVOD_NVTABULAR_TAG $REGISTRY_LOCAL/frame_system/horovod-nvtabular:$HOROVOD_NVTABULAR_TAG
    docker push $REGISTRY_LOCAL/frame_system/horovod-nvtabular:$HOROVOD_NVTABULAR_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/llama2:$LLAMA2_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/llama2:$LLAMA2_TAG $REGISTRY_LOCAL/frame_system/llama2:$LLAMA2_TAG
    docker push $REGISTRY_LOCAL/frame_system/llama2:$LLAMA2_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/paddle-gpu:$PADDLE_GPU_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/paddle-gpu:$PADDLE_GPU_TAG $REGISTRY_LOCAL/frame_system/paddle-gpu:$PADDLE_GPU_TAG
    docker push $REGISTRY_LOCAL/frame_system/paddle-gpu:$PADDLE_GPU_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/paddleserver:$PADDLESERVER_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/paddleserver:$PADDLESERVER_TAG $REGISTRY_LOCAL/frame_system/paddleserver:$PADDLESERVER_TAG
    docker push $REGISTRY_LOCAL/frame_system/paddleserver:$PADDLESERVER_TAG
    
    docker pull $REGISTRY_DOMAIN/frame_system/stablediffusion:$STABLEDIFFUSION_TAG
    docker tag $REGISTRY_DOMAIN/frame_system/stablediffusion:$STABLEDIFFUSION_TAG $REGISTRY_LOCAL/frame_system/stablediffusion:$STABLEDIFFUSION_TAG
    docker push $REGISTRY_LOCAL/frame_system/stablediffusion:$STABLEDIFFUSION_TAG

    docker rmi $REGISTRY_DOMAIN/frame_system/tensorflow-gpu:$TENSORFLOW_GPU_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/pytorch-gpu:$PYTORCH_GPU_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/pytorch-serving:$PYTORCH_SERVING_GPU_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/pytorch-serving:$PYTORCH_SERVING_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_GPU_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/tensorflow-serving:$TENSORFLOW_SERVING_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/conda:$CONDA_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/horovod-nvtabular:$HOROVOD_NVTABULAR_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/llama2:$LLAMA2_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/paddle-gpu:$PADDLE_GPU_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/paddleserver:$PADDLESERVER_TAG
    docker rmi $REGISTRY_DOMAIN/frame_system/stablediffusion:$STABLEDIFFUSION_TAG
    docker rmi $REGISTRY_DOMAIN/ai/ai-explorer:$AI_EXPLORER_TAG
    docker rmi $REGISTRY_DOMAIN/ai/label-studio:$LABELSTUDIO_TAG
    docker rmi $REGISTRY_DOMAIN/ai/adapt-job:$ADAPT_JOB_TAG
    logger info "已拉取镜像至本地仓库"
}

function main() {
  mkdir -p /opt/kube/bin "$BASE/down" "$BASE/bin" /data
  get_images
}
main "$@"
