|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +declare -r CUREBT_TIME=`date +%s` |
| 4 | +declare -r TIME_OUT=600 |
| 5 | + |
| 6 | +print_help() { |
| 7 | + echo "This script is in order to backup/restore all MongoDB/PostgreSQL/S3 data" |
| 8 | + echo "USAGE: $0 [command] [releaseName] [backupDir] [-n namespace]" |
| 9 | + exit 1 |
| 10 | +} |
| 11 | + |
| 12 | +cmd_check(){ |
| 13 | + if [ $? -ne 0 ] ; then |
| 14 | + reactivate |
| 15 | + echo "[FAIL] MongoDB,PostgreSQL,S3 $COMMAND" |
| 16 | + exit 1 |
| 17 | + fi |
| 18 | +} |
| 19 | + |
| 20 | +reactivate() { |
| 21 | + echo "Reactivate knowledge studio:" |
| 22 | + oc $KUBECTL_ARGS patch --type=merge wks ${RELEASE_NAME} -p "{\"spec\":{\"global\":{\"quiesceMode\":false}}}" |
| 23 | + cmd_check |
| 24 | + |
| 25 | + oc $KUBECTL_ARGS patch --type=merge wks ${RELEASE_NAME} -p "{\"spec\":{\"mma\":{\"replicas\":\"${MMA_REPLICAS}\"}}}" |
| 26 | + cmd_check |
| 27 | + |
| 28 | + END_TIME=`date +%s` |
| 29 | + printf "%s %d\n" "Elapsed time: " `expr $END_TIME - $CUREBT_TIME` |
| 30 | +} |
| 31 | + |
| 32 | +deactivating() { |
| 33 | + echo "Deactivating knowledge studio:" |
| 34 | + oc $KUBECTL_ARGS patch --type=merge wks ${RELEASE_NAME} -p '{"spec":{"global":{"quiesceMode":true}}}' |
| 35 | + cmd_check |
| 36 | + |
| 37 | + oc $KUBECTL_ARGS patch --type=merge wks ${RELEASE_NAME} -p '{"spec":{"mma":{"replicas":0}}}' |
| 38 | + cmd_check |
| 39 | +} |
| 40 | + |
| 41 | +# command line arguments |
| 42 | +if [ $# -lt 3 ] ; then |
| 43 | + print_help |
| 44 | +fi |
| 45 | + |
| 46 | +COMMAND=$1 |
| 47 | +shift |
| 48 | +RELEASE_NAME=$1 |
| 49 | +shift |
| 50 | +DATA_DIR=$1 |
| 51 | +shift |
| 52 | +while getopts "n:" opt; do |
| 53 | + case $opt in |
| 54 | + "n" ) NAMESPACE=$OPTARG ;; |
| 55 | + esac |
| 56 | +done |
| 57 | + |
| 58 | +echo "release name:'$RELEASE_NAME'" |
| 59 | + |
| 60 | +echo "checking command..." |
| 61 | +if [[ ! $COMMAND = "backup" && ! $COMMAND = "restore" ]]; then |
| 62 | + echo "command: '$COMMAND' not supported. backup and restore are supported." |
| 63 | + print_help |
| 64 | +else |
| 65 | + echo "command: '$COMMAND'" |
| 66 | +fi |
| 67 | + |
| 68 | +echo "checking $COMMAND directory..." |
| 69 | +if [[ $COMMAND = "backup" ]]; then |
| 70 | + DATA_DIR=${DATA_DIR%*/}"/wks-${COMMAND}-`date '+%Y%m%d_%H%M%S'`" |
| 71 | + |
| 72 | + DATA_DIR_MONGODB="${DATA_DIR%*/}/mongodb" |
| 73 | + DATA_DIR_POSTRGESQL="${DATA_DIR%*/}/postgresql" |
| 74 | + DATA_DIR_S3="${DATA_DIR%*/}/S3" |
| 75 | +else |
| 76 | + DATA_DIR_MONGODB="${DATA_DIR%*/}/mongodb" |
| 77 | + DATA_DIR_POSTRGESQL="${DATA_DIR%*/}/postgresql" |
| 78 | + DATA_DIR_S3=$([ -d ${DATA_DIR%*/}/S3 ] && echo "${DATA_DIR%*/}/S3" || echo "${DATA_DIR%*/}/minio") |
| 79 | + |
| 80 | + if [[ ! -d ${DATA_DIR_MONGODB} || ! -d ${DATA_DIR_POSTRGESQL} || ! -d ${DATA_DIR_S3} ]]; then |
| 81 | + echo "no backup directory: $DATA_DIR" |
| 82 | + echo "[FAIL] MongoDB,PostgreSQL,S3 $COMMAND" |
| 83 | + exit 1 |
| 84 | + fi |
| 85 | +fi |
| 86 | + |
| 87 | +echo "$COMMAND directory:" |
| 88 | +echo " mongodb:'$DATA_DIR_MONGODB'" |
| 89 | +echo " postrgesql:'$DATA_DIR_POSTRGESQL'" |
| 90 | +echo " S3:'$DATA_DIR_S3'" |
| 91 | + |
| 92 | +if [ -v NAMESPACE ]; then |
| 93 | + echo "checking namespace..." |
| 94 | + oc get namespace $NAMESPACE |
| 95 | + if [[ ! $? -eq 0 ]]; then |
| 96 | + echo "namespace:'$NAMESPACE' not exist" |
| 97 | + echo "[FAIL] MongoDB,PostgreSQL,S3 $COMMAND" |
| 98 | + exit 1 |
| 99 | + else |
| 100 | + echo "namespace:'$NAMESPACE'" |
| 101 | + fi |
| 102 | + |
| 103 | + KUBECTL_ARGS="${KUBECTL_ARGS} --namespace=$NAMESPACE" |
| 104 | + NAMESPACE_OPT="-n $NAMESPACE" |
| 105 | +else |
| 106 | + echo "default namespace is used for oc" |
| 107 | +fi |
| 108 | + |
| 109 | +################################################################ |
| 110 | +#Decativate wks deployment |
| 111 | +#Make sure no running job |
| 112 | +################################################################ |
| 113 | +jobs=`oc $KUBECTL_ARGS get job --no-headers | grep -e ${RELEASE_NAME}-train -e ${RELEASE_NAME}-batch-apply | awk '{print $2}'` |
| 114 | +for job in ${jobs}; do |
| 115 | + if [[ $job == "0/1" ]]; then |
| 116 | + echo "$COMMAND failed because training/evaluation job is running. Please wait for while until the job will complete." |
| 117 | + echo "[FAIL] MongoDB,PostgreSQL,S3 $COMMAND" |
| 118 | + exit 1 |
| 119 | + fi |
| 120 | +done |
| 121 | + |
| 122 | +echo "Get 'Postgresql IMAGE' for $COMMAND PostgreSql" |
| 123 | +POSTGRESQL_POD_NAME=`oc $KUBECTL_ARGS get pods -o=go-template --template='{{range $pod := .items}}{{range .status.containerStatuses}}{{if .ready}}{{$pod.metadata.name}}{{"\n"}}{{end}}{{end}}{{end}}' | grep ${RELEASE_NAME}-edb-postgresql | head -n 1` |
| 124 | +if [[ ! $POSTGRESQL_POD_NAME ]]; then |
| 125 | + echo "get Postgresql pod failed" |
| 126 | + echo "[FAIL] MongoDB,PostgreSQL,S3 $COMMAND" |
| 127 | + exit 1 |
| 128 | +else |
| 129 | + echo "Postgresql pod name: '$POSTGRESQL_POD_NAME'" |
| 130 | +fi |
| 131 | +POSTGRESQL_IMAGE_NAME=`oc $KUBECTL_ARGS get pod $POSTGRESQL_POD_NAME -o jsonpath='{.spec.containers[0].image}'` |
| 132 | +if [[ ! $POSTGRESQL_IMAGE_NAME ]]; then |
| 133 | + echo "get Postgresql image failed" |
| 134 | + echo "[FAIL] MongoDB,PostgreSQL,S3 $COMMAND" |
| 135 | + exit 1 |
| 136 | +else |
| 137 | + echo "Postgresql image name: '$POSTGRESQL_IMAGE_NAME'" |
| 138 | +fi |
| 139 | + |
| 140 | +echo "" |
| 141 | +echo "Get replicas of MMA" |
| 142 | +MMA_REPLICAS=`kubectl $KUBECTL_ARGS get wks ${RELEASE_NAME} -o jsonpath='{.spec.mma.replicas}'` |
| 143 | +if [ -z "$MMA_REPLICAS" ]; then |
| 144 | + WKS_SIZE=`kubectl $KUBECTL_ARGS get wks ${RELEASE_NAME} -o jsonpath='{.spec.global.size}'` |
| 145 | + if [[ ${WKS_SIZE} == "medium" ]]; then |
| 146 | + MMA_REPLICAS="2" |
| 147 | + else # small |
| 148 | + MMA_REPLICAS="1" |
| 149 | + fi |
| 150 | +fi |
| 151 | +echo "replicas of MMA: ${MMA_REPLICAS}" |
| 152 | + |
| 153 | +echo "" |
| 154 | +deactivating |
| 155 | + |
| 156 | +echo "Wait until all pods stop except datastore pods, this may take a few minutes..." |
| 157 | +sleepTime=0 |
| 158 | +while : |
| 159 | +do |
| 160 | + GET_POD_NUMBER=`kubectl $KUBECTL_ARGS get pod | grep -Ev 'minio|etcd|mongo|postgresql|gw-instance|Completed' | grep "${RELEASE_NAME}-" | wc -l` |
| 161 | + echo "number of the present pods which need to stop: $GET_POD_NUMBER, please wait..." |
| 162 | + if [ $GET_POD_NUMBER = 0 ] ; then |
| 163 | + echo "All pods outside the datastore pod scaled down" |
| 164 | + break |
| 165 | + fi |
| 166 | + |
| 167 | + sleep 10 |
| 168 | + sleepTime=$[$sleepTime+10] |
| 169 | + if [[ $sleepTime -ge $TIME_OUT ]]; then |
| 170 | + echo "Time out when waiting knowledge studio to be deactivated" |
| 171 | + reactivate |
| 172 | + echo "[FAIL] MongoDB,PostgreSQL,S3 $COMMAND" |
| 173 | + exit 1 |
| 174 | + fi |
| 175 | +done |
| 176 | + |
| 177 | +################################################################ |
| 178 | +#backup/restore all MongoDB PostgreSQL S3 data |
| 179 | +################################################################ |
| 180 | + |
| 181 | +echo "" |
| 182 | +echo "============================== $COMMAND MongoDB start:" |
| 183 | +bash mongodb-backup-restore.sh $COMMAND $RELEASE_NAME $DATA_DIR_MONGODB $NAMESPACE_OPT |
| 184 | +cmd_check |
| 185 | +echo "" |
| 186 | +echo "============================== $COMMAND PostgreSQL start:" |
| 187 | +bash postgresql-backup-restore.sh $COMMAND $RELEASE_NAME $DATA_DIR_POSTRGESQL $POSTGRESQL_IMAGE_NAME $NAMESPACE_OPT |
| 188 | +cmd_check |
| 189 | +echo "" |
| 190 | +echo "============================== $COMMAND s3 start:" |
| 191 | +bash s3-backup-restore.sh $COMMAND $RELEASE_NAME $DATA_DIR_S3 $NAMESPACE_OPT |
| 192 | +cmd_check |
| 193 | +echo "" |
| 194 | + |
| 195 | +################################################################ |
| 196 | +#Reactivate wks deployment |
| 197 | +################################################################ |
| 198 | + |
| 199 | +reactivate |
| 200 | + |
| 201 | +echo "[SUCCESS] MongoDB,PostgreSQL,S3 $COMMAND" |
0 commit comments