#!/bin/bash -xe
###############################################################################
#
# This script is for starting QEMU against the input build and running the
# robot CI test suite against it.(ROBOT CI TEST CURRENTLY WIP)
#
###############################################################################
#
# Parameters used by the script:
#  UPSTREAM_WORKSPACE = The directory from which the QEMU components are being
#                       imported from. Generally, this is the build directory
#                       that is generated by the OpenBMC build-setup.sh script
#                       when run with "target=qemu".
#                       Example: /home/builder/workspace/openbmc-build/build.
#
# Optional Variables:
#
#  WORKSPACE          = Path of the workspace directory where some intermediate
#                       files will be saved to.
#  QEMU_RUN_TIMER     = Defaults to 300, a timer for the QEMU container.
#  QEMU_LOGIN_TIMER   = Defaults to 180, a timer for the QEMU container to reach
#                       login.
#  DOCKER_IMG_NAME    = Defaults to openbmc/ubuntu-robot-qemu, the name the
#                       Docker image will be tagged with when built.
#  OBMC_BUILD_DIR     = Defaults to /tmp/openbmc/build, the path to the
#                       directory where the UPSTREAM_WORKSPACE build files will
#                       be mounted to. Since the build containers have been
#                       changed to use /tmp as the parent directory for their
#                       builds, move the mounting location to be the same to
#                       resolve issues with file links or referrals to exact
#                       paths in the original build directory. If the build
#                       directory was changed in the build-setup.sh run, this
#                       variable should also be changed. Otherwise, the default
#                       should be used.
#  LAUNCH             = Used to determine how to launch the qemu robot test
#                       containers. The options are "local", and "k8s". It will
#                       default to local which will launch a single container
#                       to do the runs. If specified k8s will launch a group of
#                       containers into a kubernetes cluster using the helper
#                       script.
#  QEMU_BIN           = Location of qemu-system-arm binary to use when starting
#                       QEMU relative to upstream workspace.  Default is
#                       ./tmp/sysroots/${QEMU_ARCH}/usr/bin/qemu-system-arm
#                       which is the default location when doing a bitbake
#                       of obmc-phosphor-image
#
#  MACHINE            = Machine to run test against. The options are "witherspoon",
#                       "palmetto", "romulus", or undefined (default).  Default
#                       will use the versatilepb model.
###############################################################################

set -uo pipefail

QEMU_RUN_TIMER=${QEMU_RUN_TIMER:-300}
QEMU_LOGIN_TIMER=${QEMU_LOGIN_TIMER:-180}
WORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}}
DOCKER_IMG_NAME=${DOCKER_IMG_NAME:-openbmc/ubuntu-robot-qemu}
OBMC_BUILD_DIR=${OBMC_BUILD_DIR:-/tmp/openbmc/build}
UPSTREAM_WORKSPACE=${UPSTREAM_WORKSPACE:-${1}}
LAUNCH=${LAUNCH:-local}
DEFAULT_MACHINE=versatilepb
MACHINE=${MACHINE:-${DEFAULT_MACHINE}}

# The automated test suite needs a real machine type so
# if we're using versatilepb for our qemu start parameter
# then we need to just let our run-robot use the default
if [[ $MACHINE == $DEFAULT_MACHINE ]]; then
    MACHINE_QEMU=
else
    MACHINE_QEMU=${MACHINE}
fi

# Determine the architecture
ARCH=$(uname -m)

# Determine the prefix of the Dockerfile's base image and the QEMU_ARCH variable
case ${ARCH} in
  "ppc64le")
    DOCKER_BASE="ppc64le/"
    QEMU_ARCH="ppc64le-linux"
    ;;
  "x86_64")
    DOCKER_BASE=""
    QEMU_ARCH="x86_64-linux"
    ;;
  *)
    echo "Unsupported system architecture(${ARCH}) found for docker image"
    exit 1
esac

# Set the location of the qemu binary relative to UPSTREAM_WORKSPACE
QEMU_BIN=${QEMU_BIN:-./tmp/sysroots/${QEMU_ARCH}/usr/bin/qemu-system-arm}

# Get the base directory of the openbmc-build-scripts repo so we can return
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# Create the base Docker image for QEMU and Robot
. "$DIR/scripts/build-qemu-robot-docker.sh" "$DOCKER_IMG_NAME"

# Copy the scripts to start and verify QEMU in the workspace
cp $DIR/scripts/boot-qemu* ${UPSTREAM_WORKSPACE}

################################################################################

if [[ ${LAUNCH} == "local" ]]; then

  # Start QEMU docker instance
  # root in docker required to open up the https/ssh ports
  obmc_qemu_docker=$(docker run --detach \
                                --user root \
                                --env HOME=${OBMC_BUILD_DIR} \
                                --env QEMU_RUN_TIMER=${QEMU_RUN_TIMER} \
                                --env QEMU_ARCH=${QEMU_ARCH} \
                                --env QEMU_BIN=${QEMU_BIN} \
                                --env MACHINE=${MACHINE} \
                                --workdir "${OBMC_BUILD_DIR}"           \
                                --volume "${UPSTREAM_WORKSPACE}":"${OBMC_BUILD_DIR}" \
                                --tty \
                                ${DOCKER_IMG_NAME} ${OBMC_BUILD_DIR}/boot-qemu-test.exp)

  # We can use default ports because we're going to have the 2
  # docker instances talk over their private network
  DOCKER_SSH_PORT=22
  DOCKER_HTTPS_PORT=443

  # This docker command intermittently asserts a SIGPIPE which
  # causes the whole script to fail. The IP address comes through
  # fine on these errors so just ignore the SIGPIPE
  trap '' PIPE

  DOCKER_QEMU_IP_ADDR="$(docker inspect $obmc_qemu_docker |  \
                       grep "IPAddress\":" | tail -n1 | cut -d '"' -f 4)"

  #Now wait for the OpenBMC QEMU Docker instance to get to standby
  delay=5
  attempt=$(( $QEMU_LOGIN_TIMER / $delay ))
  while [ $attempt -gt 0 ]; do
    attempt=$(( $attempt - 1 ))
    echo "Waiting for qemu to get to standby (attempt: $attempt)..."
    result=$(docker logs $obmc_qemu_docker)
    if grep -q 'OPENBMC-READY' <<< $result ; then
      echo "QEMU is ready!"
      # Give QEMU a few secs to stabilize
      sleep $delay
      break
    fi
      sleep $delay
  done

  if [ "$attempt" -eq 0 ]; then
    echo "Timed out waiting for QEMU, exiting"
    exit 1
  fi

  # Now run the Robot test (Tests commented out until they are working again)

  # Timestamp for job
  echo "Robot Test started, $(date)"

  mkdir -p ${WORKSPACE}
  cd ${WORKSPACE}

  # Copy in the script which will execute the Robot tests
  cp $DIR/scripts/run-robot.sh ${WORKSPACE}

  # Run the Docker container to execute the Robot test cases
  # The test results will be put in ${WORKSPACE}
  docker run --rm \
             --user root \
             --env HOME=${HOME} \
             --env IP_ADDR=${DOCKER_QEMU_IP_ADDR} \
             --env SSH_PORT=${DOCKER_SSH_PORT} \
             --env HTTPS_PORT=${DOCKER_HTTPS_PORT} \
             --env MACHINE=${MACHINE_QEMU} \
             --workdir ${HOME} \
             --volume ${WORKSPACE}:${HOME} \
             --tty \
             ${DOCKER_IMG_NAME} ${HOME}/run-robot.sh

  # Now stop the QEMU Docker image
  docker stop $obmc_qemu_docker

elif [[ ${LAUNCH} == "k8s" ]]; then
  # Package the Upstream into an image based off the one created by the build-qemu-robot.sh
  # Dockerfile = $( cat << EOF
  imgname=$DOCKER_IMG_NAME
  cd $DIR
  source ./kubernetes/kubernetes-launch.sh QEMU-launch false false deployment

  # Xcat Launch (NYI)

  # source ./kubernetes/kubernetes-launch.sh XCAT-launch true true

else
  echo "LAUNCH variable invalid, Exiting"
  exit 1
fi
