#!/bin/bash
#
# Copyright (C) 2000-2015 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#

#
# Attempt to backup and restore kubernetes ingress objects and their services
#
# Assumes:
#   - You have a working K8S cluster avaialable

#
# The k8s cluster status:

# $ kubectl apply -f kubernetes-plugin-test-0002.yaml
# namespace/testing-ns-0002-1 created
# ingress.networking.k8s.io/rook-ceph-mgr-dashboard created
# service/rook-ceph-mgr-dashboard-loadbalancer created
# service/rook-ceph-mgr-dashboard-external-http created

# $ kubectl -n testing-ns-0002-1 get ingress
# NAME                      CLASS   HOSTS                   ADDRESS   PORTS     AGE
# rook-ceph-mgr-dashboard   nginx   rook-ceph.example.com             80, 443   10s

# $ kubectl -n testing-ns-0002-1 get service
# NAME                                    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
# rook-ceph-mgr-dashboard-external-http   NodePort       10.104.56.66    <none>        7000:31835/TCP   20s
# rook-ceph-mgr-dashboard-loadbalancer    LoadBalancer   10.107.163.59   10.0.100.35   8443:31796/TCP   21s


TEST_ID=0002
TestName="kubernetes-plugin-test-${TEST_ID}"
JobNameBase="Test-K8S-${TEST_ID}"
FileSetName="Test-K8S-Set-${TEST_ID}-"

# Variables in tests
K8S_SCRIPT_YAML_FILE="scripts/kubernetes/kubernetes-plugin-test-${TEST_ID}.yaml"
K8S_NAMESPACE_1="testing-ns-0002-1"
POD_N1_0002_1="test-pod-0002-1"

. scripts/functions
. scripts/regress-utils.sh

. tests/kubernetes/k8s-utils.sh

printf "\nInit test: ${TestName}\n"

CONNECTION_ARGS=""
if [ ! -z $KUBE_FD_CERT_FILE ]
then
   setup_self_signed_cert $KUBE_FD_CERT_DIR $KUBE_FD_CERT_NAME
   CONNECTION_ARGS=" fdkeyfile=$KUBE_FD_KEY_FILE fdcertfile=$KUBE_FD_CERT_FILE "
fi

if [ ! -z "$KUBE_PROXY_POD_PLUGIN_HOST" ]
then
   CONNECTION_ARGS="${CONNECTION_ARGS} pluginhost=${KUBE_PROXY_POD_PLUGIN_HOST} "
fi

if [ ! -z "$KUBE_BACULA_IMAGE" ]
then
   CONNECTION_ARGS="${CONNECTION_ARGS} baculaimage=${KUBE_BACULA_IMAGE} imagepullpolicy=ifNotPresent "
fi

export debug=2
scripts/cleanup
scripts/copy-kubernetes-plugin-confs ${TEST_ID}

printf "\n ... Preparing ...\n"

# export requires variables
setup_plugin_param "kubernetes:"
if [ "x$KUBECONFIG" != "x" ]
then
   export KUBECONFIG
   LPLUG="${LPLUG} config='$KUBECONFIG' ${CONNECTION_ARGS}"
fi

tmp="${tmp}/test-${TEST_ID}"

mkdir -p ${tmp}

# check the requirements
KNODES=`${KUBECTL} get nodes | grep Ready | wc -l`
if [ $KNODES -eq 0 ]
then
   echo "A working Kubernetes cluster required!"
   exit 1
fi

# check if K8S_NAMESPACE_1 or K8S_NAMESPACE_2 exist
KPLUGTEST_1=`${KUBECTL} get ns | grep "^${K8S_NAMESPACE_1} " | wc -l`
if [ $KPLUGTEST_1 -ne 0 ] && [ "x$1" != "xforce" ];
then
   echo "Namespace \"${K8S_NAMESPACE_1}\" exist on cluster and no force option specified!"
   exit 1
fi


# prepare data
printf "\n ... Apply data ... \n"

remove_testing_env() {
   printf "Removing namespaces: ${K8S_NAMESPACE_1}\n"
   ${KUBECTL} delete ns ${K8S_NAMESPACE_1} 2>&1 > ${tmp}/kube.log
   printf "Removed namespaces: ${K8S_NAMESPACE_1}\n"
}

reset_k8s_env() {
   
   remove_testing_env

   ${KUBECTL} apply -f ${K8S_SCRIPT_YAML_FILE} 2>&1 >> ${tmp}/kube.log

   i=0
   SPIN=('-' '\\' '|' '/')
   printf "\n ... Waiting to ready ... \n"
   while true
   do
      # TODO: Check also the pods in namespace_2 are running
      kstat=`${KUBECTL} -n ${K8S_NAMESPACE_1} get pods -o go-template='{{range .items}}{{.status.phase}}{{"\n"}}{{end}}' | grep -v Running | wc -l`
      if [ $kstat -eq 0 ]
      then
         break
      fi;
      w=1
      printf "\b${SPIN[(($i % 4))]}"
      if [ $i -eq 600 ]
      then
         echo "Timeout waiting for test data to populate. Cannot continue!"
         exit 1
      fi
      ((i++))
      sleep 1
   done
}

reset_k8s_env


# wait a bit to objects to populate.
sleep 10


# get variables
printf "\n ... Get Environment Variables ...\n"
${KUBECTL} get ns -o name > ${tmp}/allns.log
${KUBECTL} get pv -o name > ${tmp}/allpv.log


# Prepare bacula dir configuration
printf "\n ... Preparing Bacula-dir configuration ...\n"
export PLUGIN_WORKING=${cwd}/working

out_sed="${tmp}/sed_tmp"
echo "s%@LPLUG@%${LPLUG}%" > ${out_sed}
echo "s%@K8S_NAMESPACE_1@%${K8S_NAMESPACE_1}%" >> ${out_sed}

printf "\nCommand launched:\n"
echo "sed -i -f ${out_sed} ${conf}/bacula-dir.conf"

sed -i -f ${out_sed} ${conf}/bacula-dir.conf

printf "\n ... Done ...\n"

start_test

# We must put the bconsole command in ${cwd}/tmp/bconcmds
cat <<END_OF_DATA >${tmp}/bconcmds
@output /dev/null
messages
@$out ${tmp}/log.out
label storage=File1 pool=Default volume=TestVolume001
@setdebug dir level=500 trace=1
quit
END_OF_DATA

run_bacula

#############
## BTEST 1 ##
#############
btest1 () {
   # Test 1
   TEST=1
   OUTPUT_FILE=${tmp}/blog${TEST}.out
   do_regress_backup_test ${TEST}
   check_regress_backup_statusT ${TEST}
   F=$?
   # Check if namespace is backup
   F_1=0
   RET=`grep "@kubernetes" ${OUTPUT_FILE} | grep "${K8S_NAMESPACE_1}.yaml" | wc -l`
   RES=1
   if [ $RET -ne $RES ]
   then
      F_1=1
      ((bstat++))
   fi
   # Check if exists ingress folder
   F_2=0
   RET=`grep "@kubernetes" ${OUTPUT_FILE} | grep "/ingress/" | wc -l`
   RES=1
   if [ $RET -gt $RES ]
   then
      F_2=1
      ((bstat++))
   fi
   
   # Check loadbalancer yaml is backup 
   F_3=0
   RET=`grep "@kubernetes" ${OUTPUT_FILE} | grep "loadbalancer.yaml" | wc -l`
   RES=1
   if [ $RET -ne $RES ]
   then
      F_3=1
      ((bstat++))
   fi
   printf "%s\n" "--------"
   printf "Results backup test ${TEST}:\n"
   printf "%s%s\n" " -> StatusT: " $(regress_test_result ${F})
   printf "%s%s\n" " -> The namespace '${K8S_NAMESPACE_1}' was backup: " $(regress_test_result ${F_1}) 
   printf "%s%s\n" " -> The ingress objects were backup: " $(regress_test_result ${F_2}) 
   printf "%s%s\n" " -> The loadbalancer yaml was backup: " $(regress_test_result ${F_3}) 
   printf "%s\n" "--------"
}


#############
## RTEST 1 ##
#############
rtest1 () {
   TEST=1
   # Before delete
   echo "---> Before delete the service:\n" 2>&1 > ${tmp}/rlog${TEST}.out
   ${KUBECTL} -n ${K8S_NAMESPACE_1} get svc/rook-ceph-mgr-dashboard-loadbalancer 2>&1 >> ${tmp}/rlog${TEST}.out

   ${KUBECTL} -n ${K8S_NAMESPACE_1} delete svc/rook-ceph-mgr-dashboard-loadbalancer 2>&1 >> ${tmp}/rlog${TEST}.out
   do_regress_restore_test ${TEST} 1 "" "file=/@kubernetes/namespaces/${K8S_NAMESPACE_1}/services/rook-ceph-mgr-dashboard-loadbalancer.yaml"
   check_regress_restore_statusT ${TEST}
   F=$?
   # check if object restored on kubernetes
   
   echo "---> After restore the service:\n" 2>&1 >> ${tmp}/rlog${TEST}.out
   ${KUBECTL} -n ${K8S_NAMESPACE_1} get svc/rook-ceph-mgr-dashboard-loadbalancer 2>&1 >> ${tmp}/rlog${TEST}.out
   RET=`${KUBECTL} -n ${K8S_NAMESPACE_1} get svc/rook-ceph-mgr-dashboard-loadbalancer -o go-template='{{.metadata.name}}{{"\n"}}' 2>/dev/null | wc -l`
   echo "RET: $RET" >> ${tmp}/rlog${TEST}.out
   if [ $RET -ne 1 ]
   then
      F=1
      rstat=$((rstat+1))
   fi
   printf "%s\n" "--------"
   printf "Result restore test ${TEST}:"
   printf "%s%s\n" " -> StatusT: " $(regress_test_result ${F})
   printf "%s\n" "--------"
}

estat=0

# etest1

bstat=0
JOBID=1
# This job is the base of all backup jobs names
JobName=${JobNameBase}-
btest1

rstat=0
rtest1

stop_bacula
end_test