#!/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=qemuarm". # 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. If you don't find the sysroots # folder, run `bitbake build-sysroots`. # # MACHINE = Machine to run test against. The options are "witherspoon", # "palmetto", "romulus", or undefined (default). Default # will use the versatilepb model. # # DEFAULT_IMAGE_LOC = The image location of the target MACHINE. Default to # "./tmp/deploy/images/" # ############################################################################### 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}} DEFAULT_IMAGE_LOC=${DEFAULT_IMAGE_LOC:-./tmp/deploy/images/} # 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") QEMU_ARCH="ppc64le-linux" ;; "x86_64") QEMU_ARCH="x86_64-linux" ;; "aarch64") QEMU_ARCH="arm64-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 # shellcheck source=scripts/build-qemu-robot-docker.sh . "$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 \ --rm \ --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}" \ --env DEFAULT_IMAGE_LOC="${DEFAULT_IMAGE_LOC}" \ --workdir "${OBMC_BUILD_DIR}" \ --volume "${UPSTREAM_WORKSPACE}:${OBMC_BUILD_DIR}:ro" \ --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 \ --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" else echo "LAUNCH variable invalid, Exiting" exit 1 fi