#!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
SCRIPT_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

readonly INSTALLER_WORKING_DIR="/vagrant"
readonly INSTALLER_WORKING_PATH="$INSTALLER_WORKING_DIR/rasdamaninstaller"

readonly LOGDIR="/tmp/rasdamaninstaller_test"

readonly CMD_SYSTEMTEST="./ci_test.sh systemtest.toml"
readonly CMD_PACKAGING="sudo ./pkg_build.sh nightly noupload"

log()
{
  if [ -n "$vm" ]; then
    echo "$vm: $*"
  else
    echo "$*"
  fi
}

usage()
{
  echo "Usage: ./run_vm.sh vmname jobnr (package|systemtest|custom cmd)"
  echo ""
  echo "  vmname: centos7, debian8, ubuntu1404, ubuntu1604, etc."
  echo "  jobnr:  a number for the job."
  echo "  cmd:    shell code to execute in the rasdaman installer directory"
  echo "          on the VM: '$INSTALLER_WORKING_PATH'"
  exit 0
}

process_args()
{
  [ $# -gt 2 ] || usage
  readonly vm="$1"
  [ "$vm" == "-h" -o "$vm" == "--help" ] && usage
  shift
  readonly jobnr="$1"
  shift
  readonly cmd_arg="$@"
  [ -n "$cmd_arg" ] || usage

  local tmp_cmd="$cmd_arg"
  if [ "$tmp_cmd" == "package" ]; then
    tmp_cmd="$CMD_PACKAGING"
  elif [ "$tmp_cmd" == "systemtest" ]; then
    tmp_cmd="$CMD_SYSTEMTEST"
  fi
  readonly cmd="$tmp_cmd"
}

prepare_vm()
{
  log "preparing vm, job number $jobnr..."
  cp -a "$SCRIPT_DIR"/resources/{bootstrap.sh,run.sh} "$SCRIPT_DIR/$vm"
  "$SCRIPT_DIR/$vm/"run.sh sync
  pushd "$SCRIPT_DIR/$vm/" > /dev/null
  #vagrant destroy -f
  ./run.sh up
}

run_installer_cmd()
{
  mkdir -p "$LOGDIR"
  logfile="$LOGDIR/$vm.log"
  log "running the installer, log file: '$logfile', cmd: '$cmd'"
  vagrant ssh -c "cd $INSTALLER_WORKING_PATH && $cmd" > "$logfile" 2>&1
}

install_downloaded_package()
{
  package_install="dpkg -i"
  package_ext="deb"
  [[ "$vm" == centos* ]] && { package_install="yum install -y epel-release && sudo yum install -y"; package_ext="rpm"; }
  cp "$logfile" "$logfile.bak"
  "$SCRIPT_DIR/run_vm.sh" "$vm" "$jobnr" "sudo $package_install /vagrant/package/*.$package_ext"
}

process_result()
{
  if [ $rc -eq 0 ]; then
    ./download.sh "/tmp/rasdaman.install.log"
    log ""
    log "finished successfully; see the log at '$logfile'."
    if [ "$cmd_arg" == "$CMD_PACKAGING" ]; then
      ./download.sh "/tmp/rasdaman-packager/package/"
      #install_downloaded_package
    fi
  else
    log ""
    log "FAILED with exit code $rc; see the log at '$logfile'."
  fi
  popd > /dev/null
}

main()
{
  log "executing with arguments: '$@'"
  process_args "$@"
  prepare_vm
  run_installer_cmd
  rc=$?
  process_result
  exit $rc
}

main "$@"
