{{/*
# Copyright © 2019 Amdocs, Bell Canada, Samsung Electronics
# Copyright © 2020 Orange
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*/}}

{{- if .Values.backup.enabled }}
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: {{ include "common.fullname" . }}-backup
  namespace: {{ include "common.namespace" . }}
  labels: {{- include "common.labels" . | nindent 4 }}
spec:
  schedule: {{ .Values.backup.cron | quote }}
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 120
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: {{ include "common.fullname" (dict "suffix" "read" "dot" . )}}
          {{ include "common.podSecurityContext" . | indent 10 | trim}}
          restartPolicy: Never
          initContainers: {{- include "common.readinessCheck.waitFor" . | nindent 12 }}
            - name: mariadb-galera-backup-init
              image: {{ include "repositoryGenerator.image.mariadb" . }}
              imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
              {{ include "common.containerSecurityContext" . | indent 14 | trim }}
              command:
                - /bin/bash
                - -c
                - |
                    remove_dir(){
                      dirToRemove=$1
                      rm -rf $dirToRemove
                      echo "Failed" > /backup/backup.log
                      echo "Backup failed!!!"
                    }

                    target_dir=/backup/backup-`date +%s`
                    mkdir -p $target_dir

                    mysqlhost={{ include "common.servicename" . }}.{{ include "common.namespace" . }}

                    mariabackup --backup --target-dir=$target_dir --user=root --password=$DB_PASS --host=$mysqlhost

                    ret_code=$?
                    if [ $ret_code -ne 0 ]; then
                      remove_dir $target_dir
                      exit 0
                    fi

                    echo "Starting Backup Preparation!!!"
                    mariabackup --prepare --target-dir=$target_dir
                    ret_code=$?
                    if [ $ret_code -ne 0 ]; then
                      remove_dir $target_dir
                      exit 0
                    fi
                    echo "Success" > /backup/backup.log
                    echo "Backup Successful!!!"
              env:
                - name: DB_PASS
                  {{- include "common.secret.envFromSecretFast" (dict "global" . "uid" (include "common.mariadb.secret.rootPassUID" .) "key" "password") | indent 18 }}
              resources: {{ include "common.resources" . | nindent 12 }}
              volumeMounts:
                - name: backup-dir
                  mountPath: /backup
          containers:
            - name: mariadb-backup-validate
              image: {{ include "repositoryGenerator.image.mariadb" . }}
              imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
              {{ include "common.containerSecurityContext" . | indent 14 | trim }}
              env:
                - name: MYSQL_ROOT_PASSWORD
                  {{- include "common.secret.envFromSecretFast" (dict "global" . "uid" (include "common.mariadb.secret.rootPassUID" .) "key" "password") | indent 18 }}
              command:
                - /bin/bash
                - -c
                - |
                  remove_dir(){
                    dirToRemove=$1
                    rm -rf $dirToRemove
                    echo "Validation Failed!!!";
                  }

                  backup_result=`cat /backup/backup.log`
                  rm -rf /backup/backup.log

                  if [ "$backup_result" == "Failed" ]; then
                    echo "Backup Failed!!! Validation Failed!!!";
                    exit 0
                  fi

                  target_dir=$(ls -td -- /backup/backup-* | head -n 1)
                  cp -Ra $target_dir/* /var/lib/mysql/

                  if [ ! "$(ls -A /var/lib/mysql)" ]; then
                    remove_dir $target_dir
                    exit 0
                  fi

                  /docker-entrypoint.sh mysqld &

                  count=0
                  until mysql --user=root --password=$MYSQL_ROOT_PASSWORD  -e "SELECT 1";
                    do sleep 3;
                    count=`expr $count + 1`;
                    if [ $count -ge 30 ]; then
                      remove_dir $target_dir
                      exit 0;
                    fi;
                  done

                  mysqlcheck -A  --user=root --password=$MYSQL_ROOT_PASSWORD > /tmp/output.log
                  error_lines=`cat /tmp/output.log| grep -v "OK" | wc -l`

                  cat /tmp/output.log

                  if [ $error_lines -gt 1 ];then
                    remove_dir $target_dir
                  else
                    echo "Validation successful!!!"
                    cd /backup
                    totalFiles=`ls -t | grep "backup-" | wc -l`
                    if [ $totalFiles -gt {{ .Values.backup.retentionPeriod }} ]; then
                      filestoDelete=`expr $totalFiles - {{ .Values.backup.retentionPeriod }}`
                      ls -tr | grep backup | head -$filestoDelete | xargs rm -rf
                    fi
                  fi
              resources: {{ include "common.resources" . | nindent 12 }}
              volumeMounts:
                - mountPath: /etc/localtime
                  name: localtime
                  readOnly: true
                - name: backup-dir
                  mountPath: /backup
          imagePullSecrets:
            - name: {{ include "common.namespace" . }}-docker-registry-key
          volumes:
            - name: localtime
              hostPath:
                path: /etc/localtime
            - name: backup-dir
              persistentVolumeClaim:
                claimName: {{ include "common.fullname" . }}-backup-data
{{- end }}