blob: 27f3cc690d73b081ad2ae52aeabb5924d7d32793 [file] [log] [blame]
{{/*
# 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 }}
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 -}}