blob: f3e07322ec7a354916d9c5eb4b6b92d5b0200e5a [file] [log] [blame]
#!/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