{{/* # Copyright © 2019 Amdocs, Bell Canada # # 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 }} {{- if .Values.k8ssandraOperator.enabled }} {{ else }} 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: metadata: labels: {{- include "common.labels" . | nindent 12 }} annotations: {{- include "common.tplValue" (dict "value" .Values.podAnnotations "context" .) | nindent 12 }} name: {{ include "common.name" . }} spec: restartPolicy: Never initContainers: - command: - /app/ready.py args: - --container-name - {{ include "common.name" . }} env: - name: NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace image: {{ include "repositoryGenerator.image.readiness" . }} imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }} name: {{ include "common.name" . }}-readiness - name: "cassandra-backup-init" image: {{ include "repositoryGenerator.image.readiness" . }} imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }} command: - /bin/bash - -c - | clearSnapshot(){ curr_time=$1 echo "Clearing snapshots!!!" command="nodetool clearsnapshot -t $curr_time" /app/exec.py -p "{{ include "common.name" . }}" -c "$command" } {{ $root := . }} curr_time=`date +%s` pids="" set -x echo "Copying data" {{ range $i, $e := until (int .Values.replicaCount) }} target_dir=/backup/temp/cassandra-{{ $i }} mkdir -p $target_dir cp -Ra /onap-data/cassandra-{{ $i }}/data/ $target_dir/ {{- end }} echo "Executing cleanup!!" command="nodetool cleanup" /app/exec.py -p "{{ include "common.name" . }}" -c "$command" echo "Cleaned Node!! Backing up database now!!!" command="nodetool snapshot -t $curr_time" /app/exec.py -p "{{ include "common.name" . }}" -c "$command" retCode=$? if [ $retCode -ne 0 ]; then echo "Backup Failed!!!" rm -rf /backup/temp clearSnapshot $curr_time echo "Failed" > /backup/backup.log exit 0 fi backup_dir=/backup/temp {{ range $i, $e := until (int .Values.replicaCount) }} for d in $backup_dir/cassandra-{{ $i }}/data/*/ ; do d=$(echo $d | sed 's:/*$::') keyspace_name=$(echo "$d" | awk -F/ '{ print $NF }') if [ 1 ] {{- range $t, $keyspace := $root.Values.backup.keyspacesToSkip }} && [ "{{ $keyspace.name }}" != "$keyspace_name" ] {{- end }}; then /app/restore.sh -b $backup_dir/cassandra-{{ $i }}/data -s /onap-data/cassandra-{{ $i }}/data/$keyspace_name -k $keyspace_name -t $curr_time & pids="$pids $!" fi done {{- end }} for p in $pids; do wait $p if [ $? -ne 0 ]; then rm -rf /backup/temp echo "Creation of Backup Failed!!!" clearSnapshot $curr_time echo "Failed" > /backup/backup.log exit 0 fi done clearSnapshot $curr_time exit_code=$? if [ $exit_code -ne 0 ]; then rm -rf /backup/temp echo "Backup Failed!!!" echo "Failed" > /backup/backup.log exit 0 fi mv /backup/temp /backup/backup-${curr_time} echo "Success" > /backup/backup.log echo "Cassandra Backup Succeeded" env: - name: NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace volumeMounts: - mountPath: /etc/localtime name: localtime readOnly: true {{- range $i := until (int .Values.replicaCount)}} - mountPath: /onap-data/cassandra-{{ $i }} name: data-dir-{{ $i }} {{- end }} - mountPath: /backup name: backup-dir - name: scripts mountPath: /app/restore.sh subPath: restore.sh - name: scripts mountPath: /app/exec.py subPath: exec.py containers: - name: cassandra-backup-validate image: {{ include "repositoryGenerator.dockerHubRepository" . }}/{{ .Values.image }} imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }} command: - /bin/bash - -c - | remove_dir(){ dirToRemove=$1 rm -rf $dirToRemove } backup_result=`cat /backup/backup.log` rm -rf /backup/backup.log if [ "$backup_result" == "Failed" ]; then echo "Backup Failed!!! So Validation Failed!!!"; exit 0 fi target_dir=$(ls -td -- /backup/*/ | head -n 1) chown -R cassandra.cassandra $target_dir {{- $root := . -}} {{ range $i, $e := until (int .Values.replicaCount) }} dbSize=$(du -ks $target_dir/cassandra-{{ $i }}/data|awk -F " " '{ printf $1 }') minDbSize={{ (int $root.Values.backup.dbSize) }} if [ $dbSize -lt $minDbSize ]; then remove_dir $target_dir echo "Validation Failed!!! dbSize ($dbSize) is less than minimum size (1)!!!" exit 0 fi rm -rf /var/lib/cassandra/* cp -Ra $target_dir/cassandra-{{ $i }}/data /var/lib/cassandra export CASSANDRA_LISTEN_ADDRESS="127.0.0.1" /docker-entrypoint.sh -Dcassandra.ignore_dc=true -Dcassandra.ignore_rack=true & CASS_PID=$! sleep 45 for d in $target_dir/cassandra-{{ $i }}/data/*/; do d=$(echo $d | sed 's:/*$::') keyspace_name=$(echo "$d" | awk -F/ '{ print $NF }') if [ 1 ] {{- range $t, $keyspace := $root.Values.backup.keyspacesToSkip }} && [ "{{ $keyspace.name }}" != "$keyspace_name" ] {{- end }}; then echo "Verifying the data for $keyspace_name " nodetool verify -e $keyspace_name ret=$? if [ $ret -ne 0 ]; then remove_dir $target_dir echo "Validation Failed!!!" exit 0 fi fi done kill -9 $CASS_PID {{- end }} 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 env: - name: CASSANDRA_CLUSTER_NAME value: {{ .Values.config.clusterName }} - name: MAX_HEAP_SIZE value: {{ .Values.config.heap.max }} - name: HEAP_NEWSIZE value: {{ .Values.config.heap.min }} - name: HOST_IP valueFrom: fieldRef: fieldPath: status.podIP volumeMounts: - name: backup-dir mountPath: /backup - name: localtime mountPath: /etc/localtime readOnly: true volumes: - name: localtime hostPath: path: /etc/localtime - name: scripts configMap: name: {{ include "common.fullname" . }}-configmap defaultMode: 0755 {{- range $i := until (int .Values.replicaCount)}} - name: data-dir-{{ $i }} persistentVolumeClaim: claimName: {{ include "common.fullname" . }}-data-{{ $i }} {{- end }} - name: backup-dir persistentVolumeClaim: claimName: {{ include "common.fullname" . }}-backup-data {{- end -}} {{- end -}}