#!/usr/bin/env bash
# 文件名: pod-scale.sh
# 功  能: 快速将指定命名空间的pod资源进行收缩/还原脚本

# 定义终端颜色
txtbld=$(tput bold)             # 加粗
bldred=${txtbld}$(tput setaf 1) # 红
bldgre=${txtbld}$(tput setaf 2) # 绿
bldylw=${txtbld}$(tput setaf 3) # 黄
txtrst=$(tput sgr0)             # 复位
err=${bldred}ERROR${txtrst}
info=${bldgre}INFO${txtrst}
warn=${bldylw}WARNING${txtrst}

# 获取当前命名空间
namespace=$(kubectl config get-contexts | grep -e "^\*" | awk '{print $5}')

function print_info() {

    # 输出操作信息
    cat<< EOF
`printf " ============= ${bldred}操作确认${txtrst} ===============\n"`
`printf " - 命令空间: ${bldgre}${namespace}${txtrst}"`
`printf " - 操作行为: ${bldgre}$1${txtrst}"`
`printf " - 当前时间: ${bldgre}$(date +%F' '%T)${txtrst}"`
`printf " ======================================"`
`printf ""`
EOF
    read -p "确认无误，请按Enter键继续..."

}

case $1 in
    shrink|s )
        print_info 副本收缩
        for name in $(kubectl -n $namespace get deploy,sts -o name);
        do
            # 获取当前控制器副本数量
            current_replicas=$(kubectl get $name -o=jsonpath='{.spec.replicas}')
            if [[ "${current_replicas}" != "0" ]]
            then
                kubectl -n $namespace annotate $name --overwrite previous-size=${current_replicas} >/dev/null
                kubectl -n $namespace scale --replicas=0 $name >/dev/null && printf "$info: [ ${txtbld}$name${txtrst} ] 已收缩.\n"
            else
                printf "$warn: [ ${txtbld}$name${txtrst} ] 已收缩,无须处理.\n"
            fi

        done
        ;;
    recovery|r )
        print_info 副本还原
        for name in $(kubectl -n $namespace get deploy,sts -o name);
        do
            replicas=$(kubectl get $name -o=jsonpath='{.metadata.annotations.previous-size}' 2>/dev/null)
            if [[ "$replicas" != "" ]]
            then
                kubectl -n $namespace scale --replicas=$replicas $name >/dev/null && printf "$info: [ ${txtbld}$name${txtrst} ] 副本数量已恢复为 ${bldgre}$replicas${txtrst}.\n"
            else
                printf "$err:[ ${txtbld}$name${txtrst} ] 恢复失败.\n"
            fi
        done
        ;;
    *)
        echo """
用法: $(basename $0) [选项]
选项:
  shrink       资源副本收缩
  recovery     资源副本还原

${txtbld}使用案例${txtrst}
 示例1. 将当前命名空间 deploy,sts 资源副本收缩
 # ${bldgre}$(basename $0) shrink${txtrst}

 示例2. 将当前命名空间 deploy,sts 资源副本还原
 # ${bldgre}$(basename $0) recovery${txtrst}

 示例3. 将middleware命名空间 deploy,sts 资源副本收缩
 # ${bldgre}kubectl config set-context --current --namespace=middleware && $(basename $0) shrink${txtrst}

 示例4. 将middleware命名空间 deploy,sts 资源副本还原
 # ${bldgre}kubectl config set-context --current --namespace=middleware && $(basename $0) recovery${txtrst}
"""
esac
