| #!/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 |