#!/bin/bash

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

function usage {
  cat << EOF >> /dev/stderr
Usage: sudo ./standup.sh [create|destroy] [postgres|mysql|cockroach]

This is a script for standing up test databases. It uses systemd to daemonize
rkt containers running on a local loopback IP.

The general workflow is to create a daemonized container, use the output to set
the test environment variables, run the tests, then destroy the container.

	sudo ./standup.sh create postgres
	# Copy environment variables and run tests.
	go test -v -i # always install test dependencies
	go test -v
	sudo ./standup.sh destroy postgres

EOF
  exit 2
}

function main {
  if [ "$#" -ne 2 ]; then
    usage
    exit 2
  fi

  case "$1" in
  "create")
     case "$2" in
     "postgres")
        create_postgres;;
     "mysql")
        create_mysql;;
     *)
       usage
       exit 2
       ;;
     esac        
     ;;
  "destroy")
     case "$2" in
     "postgres")
        destroy_postgres;;
     "mysql")
        destroy_mysql;;
     *)
       usage
       exit 2
       ;;
     esac        
     ;;
  *)
    usage
    exit 2
    ;;
  esac
}

function wait_for_file {
  while [ ! -f $1 ]; do
    sleep 1
  done
}

function wait_for_container {
  while [ -z "$( rkt list --full | grep $1 )" ]; do
    sleep 1
  done
}

function create_postgres {
  UUID_FILE=/tmp/dex-postgres-uuid
  if [ -f $UUID_FILE ]; then
    echo "postgres database already exists, try ./standup.sh destroy postgres"
    exit 2
  fi

  echo "Starting postgres. To view progress run:"
  echo ""
  echo "  journalctl -fu dex-postgres"
  echo ""
  systemd-run --unit=dex-postgres \
      rkt run --uuid-file-save=$UUID_FILE --insecure-options=image docker://postgres:9.6

  wait_for_file $UUID_FILE

  UUID=$( cat $UUID_FILE )
  wait_for_container $UUID
  HOST=$( rkt list --full | grep "$UUID" | awk '{ print $NF }' | sed -e 's/default:ip4=//g' )
  echo "To run tests export the following environment variables:"
  echo ""
  echo "  export DEX_POSTGRES_DATABASE=postgres; export DEX_POSTGRES_USER=postgres; export DEX_POSTGRES_PASSWORD=postgres; export DEX_POSTGRES_HOST=$HOST:5432"
  echo ""
}

function destroy_postgres {
  UUID_FILE=/tmp/dex-postgres-uuid
  systemctl stop dex-postgres
  rkt rm --uuid-file=$UUID_FILE
  rm $UUID_FILE
}


main $@