backup charts for cassandra

Issue-ID: OOM-2089

Signed-off-by: Akansha Dua <akansha.dua@amdocs.com>
Change-Id: Ia1086deda37ba6e613afcc6bd064e7bf4ee692b9
diff --git a/kubernetes/common/cassandra/resources/exec.py b/kubernetes/common/cassandra/resources/exec.py
new file mode 100644
index 0000000..5b3ae33
--- /dev/null
+++ b/kubernetes/common/cassandra/resources/exec.py
@@ -0,0 +1,122 @@
+#!/usr/bin/python
+import getopt
+import logging
+import os
+import sys
+import time
+
+from kubernetes import config
+from kubernetes.client import Configuration
+from kubernetes.client.apis import core_v1_api
+from kubernetes.client.rest import ApiException
+from kubernetes.stream import stream
+
+from kubernetes import client
+
+# extract env variables.
+namespace = os.environ['NAMESPACE']
+cert = os.environ['CERT']
+host = os.environ['KUBERNETES_SERVICE_HOST']
+token_path = os.environ['TOKEN']
+
+with open(token_path, 'r') as token_file:
+    token = token_file.read().replace('\n', '')
+
+# setup logging
+log = logging.getLogger(__name__)
+handler = logging.StreamHandler(sys.stdout)
+handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
+handler.setLevel(logging.INFO)
+log.addHandler(handler)
+log.setLevel(logging.INFO)
+
+configuration = client.Configuration()
+configuration.host = "https://" + host
+configuration.ssl_ca_cert = cert
+configuration.api_key['authorization'] = token
+configuration.api_key_prefix['authorization'] = 'Bearer'
+configuration.assert_hostname = False
+coreV1Api = client.CoreV1Api(client.ApiClient(configuration))
+api_instance = client.CoreV1Api(client.ApiClient(configuration))
+
+def run_command( pod_name, command ):
+        try:
+                exec_command = [
+                    '/bin/sh',
+                    '-c',
+                    command]
+                resp = stream(api_instance.connect_get_namespaced_pod_exec, pod_name, namespace,
+                      command=exec_command,
+                      stderr=True, stdin=False,
+                      stdout=True, tty=False)
+        except ApiException as e:
+                print("Exception when calling CoreV1Api->connect_get_namespaced_pod_exec: %s\n" % e)
+                return False
+        print(resp)
+        return True
+
+def find_pod(container_name,command,pods):
+    ready = False
+    try:
+        response = coreV1Api.list_namespaced_pod(namespace=namespace, watch=False)
+        for i in response.items:
+            # container_statuses can be None, which is non-iterable.
+            if i.status.container_statuses is None:
+                continue
+            for s in i.status.container_statuses:
+                if s.name == container_name:
+                    if pods == True:
+                       print (i.metadata.name)
+                    else:
+                       ready = run_command(i.metadata.name,command)
+                else:
+                    continue
+    except Exception as e:
+        log.error("Exception when calling list_namespaced_pod: %s\n" % e)
+
+    return ready
+
+
+DESCRIPTION = "Kubernetes container readiness check utility"
+USAGE = "Usage: ready.py [-t <timeout>] -c <container_name> [-c <container_name> ...]\n" \
+        "where\n" \
+        "<container_name> - name of the container to wait for\n"
+
+def main(argv):
+    pods = False
+    command = ""
+    container_name = ""
+    try:
+        opts, args = getopt.getopt(argv, "ghp:c:", ["pod-container-name=", "command=", "help","getpods"])
+        for opt, arg in opts:
+            if opt in ("-h", "--help"):
+                print("%s\n\n%s" % (DESCRIPTION, USAGE))
+                sys.exit()
+            elif opt in ("-p", "--pod-container-name"):
+                container_name = arg
+            elif opt in ("-c", "--command"):
+                command = arg
+            elif opt in ("-g", "--getpods"):
+                pods = True
+    except (getopt.GetoptError, ValueError) as e:
+        print("Error parsing input parameters: %s\n" % e)
+        print(USAGE)
+        sys.exit(2)
+    if container_name.__len__() == 0:
+        print("Missing required input parameter(s)\n")
+        print(USAGE)
+        sys.exit(2)
+
+    if pods == False:
+            if command.__len__() == 0:
+                print("Missing required input parameter(s)\n")
+                print(USAGE)
+                sys.exit(2)
+    ready = find_pod(container_name,command,pods)
+    if ready == False:
+        sys.exit(2)
+
+if __name__ == "__main__":
+    main(sys.argv[1:])
+
+
diff --git a/kubernetes/common/cassandra/resources/restore.sh b/kubernetes/common/cassandra/resources/restore.sh
new file mode 100644
index 0000000..b9deb32
--- /dev/null
+++ b/kubernetes/common/cassandra/resources/restore.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+# Initialize variables
+ss_dir=""
+base_db_dir=""
+ss_name=""
+ss="snapshots"
+me=`basename $0`
+
+function find_target_table_name()
+{
+    dest_path=$1
+    keyspace_name=$2
+    src_table_name=$3
+    find_in_dir=$dest_path/$keyspace_name
+    tname_without_uuid=$(echo $src_table_name | cut -d '-' -f 1)
+    dest_table_name=$(ls -td -- $find_in_dir/$tname_without_uuid-* | head -n 1 | rev | cut -d'/' -f1 | rev)
+    printf $dest_table_name
+}
+
+function print_usage()
+{
+	echo "NAME"
+	echo "	Script to restore Cassandra database from Nuvo/Cain snapshot"
+	echo "SYNOPSIS"
+	echo "	$me [--help|-h] [--base_db_dir|-b] [--snapshot_dir|-s] [--keyspace|-k] [--tag|-t]"
+	echo "	MUST OPTIONS: base_db_dir, snapshot_dir, keyspace_name"
+	echo "DESCRIPTION"
+	echo "	--base_db_dir, -b"
+	echo "		Location of running Cassandra database"
+	echo "	--snapshot_dir, -s"
+	echo "		Snapshot location of Cassandra database taken by Nuvo/Cain"
+	echo "	--keyspace, -k"
+	echo "		Name of the keyspace to restore"
+	echo "EXAMPLE"
+	echo "	$me -b /var/lib/cassandra/data -s /root/data.ss -k DISCOVERY_SERVER -t 1234567"
+	exit
+}
+if [ $# -eq  0 ]
+then
+	print_usage
+fi
+
+while [[ $# -gt 0 ]]
+do
+key="$1"
+shift
+
+case $key in
+	-h|--help)
+	print_usage
+	;;
+	-b|--base_db_dir)
+	base_db_dir="$1"
+	shift
+	;;
+	-s|--snapshot_dir)
+	ss_dir="$1"
+	shift
+	;;
+	-k|--keyspace)
+	keyspace_name="$1"
+	;;
+	-t|--tag)
+	tag_name="$1"
+	;;
+	--default)
+	DEFAULT=YES
+	shift
+	;;
+	*)
+	# unknown option
+	;;
+esac
+done
+
+# Validate inputs
+if [ "$base_db_dir" == "" ] || [ "$ss_dir" == "" ] || [ "$keyspace_name" == "" ]
+then
+	echo ""
+	echo ">>>>>>>>>>Not all inputs provided, please check usage >>>>>>>>>>"
+	echo ""
+	print_usage
+fi
+
+# Remove commit logs from current data dir
+#/var/lib/cassandra/commitlog/CommitLog*.log
+find $base_db_dir/../  -name "CommitLog*.log"  -delete
+
+# Remove *.db from current data dir excluding skipped keyspaces
+find $base_db_dir/$keyspace_name  -name "*.db"  -delete
+
+# Copy snapshots to data dir
+echo "----------db files in snapshots--------------"
+dirs_to_be_restored=`ls $ss_dir`
+for i in ${dirs_to_be_restored}
+do
+    src_path=$ss_dir/$i/snapshots/$tag_name
+    # Find the destination
+    table_name=$i
+    dest_table=$(find_target_table_name $base_db_dir $keyspace_name $table_name)
+    dest_path=$base_db_dir/$keyspace_name/$dest_table
+    # Create keyspace/table directory if not exists
+    #if [ ! -d "$dest_path" ]; then
+    #    mkdir -p $dest_path
+    #fi
+    db_files=$(ls $src_path/*.db 2> /dev/null | wc -l)
+    if [ $db_files -ne 0 ]
+    then
+        cp $src_path/*.db $dest_path
+        if [ $? -ne 0 ]
+        then
+            echo "=====ERROR: Unable to restore $src_path/*.db to $dest_path====="
+            exit 1
+        fi
+        echo "=======check $dest_path ==============="
+        ls $dest_path
+   fi
+done