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