#!/bin/bash

# Script for controlling deploy script
#
# Assumption: deployment script returning with code 0
#             run correctly and everything is done
#
# This script is run inside of KVM, by passing its
# URL with bootstrap-script-url
# The script configuration happens by passing
# it in text form with data-to-vm
#
# Format of data-to-vm is shell script:
#  URL=<url>\nWAITTIME=<seconds>\nTRIES=<amount>
#
# Expected values in configuration:
#  * URL - the url of the script to download and test
#  * WAITTIME - waiting time, before next try
#  * TRIES - amount of tries

# Possible TODOs:
#  * post results on each try
#  * use function + trap to assure posting on exit

LOG_FILE=/var/log/test-script-deployment.log

wget -O /tmp/test-script.cfg.$$ -q http://10.0.2.100/data

source /tmp/test-script.cfg.$$

if [ -z "$LOG_FILE" ] ; then
  echo "Output log file is missing"
  exit 1
fi

if [ -z "$URL" ] ; then
  echo "URL is missing" >> $LOG_FILE 2>&1
  exit 1
fi

if [ -z "$WAITTIME" ] ; then
  echo "WAITTIME missing" >> $LOG_FILE 2>&1
  exit 1
fi

if [ -z "$TRIES" ] ; then
  echo "TRIES missing" >> $LOG_FILE 2>&1
  exit 1
fi

DEPLOYMENT_SCRIPT=/tmp/test-script-deployment.bash.$$
wget -O $DEPLOYMENT_SCRIPT -q $URL

if [[ ! -s "$DEPLOYMENT_SCRIPT" ]] ; then
  echo "exit 1" > $DEPLOYMENT_SCRIPT
fi

function add_log ()
{
  LOG_FILE=$1
  for f in /opt/slapos/log/slapos-node-{software,instance}.log ; do
    echo "Tail of '$f':" >> $LOG_FILE
    tail -n 500 $f >> $LOG_FILE
  done
}

function add_checks ()
{
  LOG_FILE=$1
  echo 'lsof -Pni' >> $LOG_FILE 2>&1
  lsof -Pni >> $LOG_FILE 2>&1
  echo 'iptables-save' >> $LOG_FILE 2>&1
  iptables-save >> $LOG_FILE 2>&1
  for f in /tmp/playbook-* ; do echo $f ; cat $f; echo; done >> $LOG_FILE 2>&1
  echo 'slapos node status' >> $LOG_FILE 2>&1
  slapos node status >> $LOG_FILE 2>&1
}
function upload ()
{
  try=$1
  LOG_FILE=$2
  add_log $LOG_FILE
  add_checks $LOG_FILE
  t=`date '+%Y%m%d%H%S'`
  mv $LOG_FILE ${LOG_FILE}.$t
  curl -q -X POST --data-urlencode "path=test-script-result/log-file.log.$t" --data-urlencode "content@${LOG_FILE}.$t" http://10.0.2.100/
}

try=1
while true; do
  echo "$0: Try $try. Running '/bin/bash $DEPLOYMENT_SCRIPT'" >> $LOG_FILE 2>&1
  export TEST_YML_PATH
  /bin/bash $DEPLOYMENT_SCRIPT >> $LOG_FILE 2>&1
  result=$?
  if [ $result == 0 ] ; then
    echo "$0: Try $try. Script executed successfully." >> $LOG_FILE 2>&1
    upload $try $LOG_FILE
    break
  fi
  if (( try > TRIES )) ; then
    echo "$0: Try $try. Amount of tries $TRIES exceeded, giving up." >> $LOG_FILE 2>&1
    upload $try $LOG_FILE
    break
  fi
  # wait WAITTIME before checking the state
  echo "$0: Try $try. Sleeping $WAITTIME before retry." >> $LOG_FILE 2>&1
  upload $try $LOG_FILE
  sleep $WAITTIME
  ((try++))
done

exit $result
