10205e8daSAndrew Geissler#!/bin/bash -xe 20205e8daSAndrew Geissler 30205e8daSAndrew Geissler# This script is for starting QEMU against the input build and running 40205e8daSAndrew Geissler# the robot CI test suite against it. 50205e8daSAndrew Geissler# 60205e8daSAndrew Geissler# Parameters: 70205e8daSAndrew Geissler# UPSTREAM_WORKSPACE = <required, base dir of QEMU image> 80205e8daSAndrew Geissler# WORKSPACE = <optional, temp dir for robot script> 90205e8daSAndrew Geissler 100205e8daSAndrew Geisslerset -uo pipefail 110205e8daSAndrew Geissler 120205e8daSAndrew GeisslerQEMU_RUN_TIMER=300 131df680a1SAndrew GeisslerWORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}} 140205e8daSAndrew GeisslerDOCKER_IMG_NAME="openbmc/ubuntu-robot-qemu" 150205e8daSAndrew Geissler 160205e8daSAndrew Geissler# Get base directory of our repo so we can find the scripts later 170205e8daSAndrew GeisslerDIR="${BASH_SOURCE%/*}" 180205e8daSAndrew Geisslerif [[ ! -d "$DIR" || "$DIR" == "." ]]; then DIR="$PWD"; fi 190205e8daSAndrew Geissler 200205e8daSAndrew Geisslercd ${UPSTREAM_WORKSPACE} 210205e8daSAndrew Geissler 220205e8daSAndrew Geissler# Determine our architecture, ppc64le or the other one 230205e8daSAndrew Geisslerif [ $(uname -m) == "ppc64le" ]; then 240205e8daSAndrew Geissler DOCKER_BASE="ppc64le/" 250205e8daSAndrew Geissler QEMU_ARCH="ppc64le-linux" 260205e8daSAndrew Geisslerelse 270205e8daSAndrew Geissler DOCKER_BASE="" 280205e8daSAndrew Geissler QEMU_ARCH="x86_64-linux" 290205e8daSAndrew Geisslerfi 300205e8daSAndrew Geissler 310205e8daSAndrew Geissler# Create the docker image that QEMU and Robot will run in 320205e8daSAndrew Geissler. "$DIR/scripts/build-qemu-robot-docker.sh" "$DOCKER_IMG_NAME" 330205e8daSAndrew Geissler 340205e8daSAndrew Geissler# Copy the scripts to start and verify QEMU in the workspace 350205e8daSAndrew Geisslercp $DIR/scripts/boot-qemu* ${UPSTREAM_WORKSPACE} 360205e8daSAndrew Geissler 370205e8daSAndrew Geissler# Start QEMU docker instance 380205e8daSAndrew Geissler# root in docker required to open up the https/ssh ports 39*10a193c9SLeonel Gonzalezobmc_qemu_docker=$(docker run --detach \ 400205e8daSAndrew Geissler --user root \ 410205e8daSAndrew Geissler --env HOME=${HOME} \ 420205e8daSAndrew Geissler --env QEMU_RUN_TIMER=${QEMU_RUN_TIMER} \ 430205e8daSAndrew Geissler --env QEMU_ARCH=${QEMU_ARCH} \ 440205e8daSAndrew Geissler --workdir "${HOME}" \ 450205e8daSAndrew Geissler --volume "${UPSTREAM_WORKSPACE}":"${HOME}" \ 460205e8daSAndrew Geissler --tty \ 470205e8daSAndrew Geissler ${DOCKER_IMG_NAME} ${HOME}/boot-qemu-test.exp) 480205e8daSAndrew Geissler 490205e8daSAndrew Geissler# We can use default ports because we're going to have the 2 500205e8daSAndrew Geissler# docker instances talk over their private network 510205e8daSAndrew GeisslerDOCKER_SSH_PORT=22 520205e8daSAndrew GeisslerDOCKER_HTTPS_PORT=443 530205e8daSAndrew GeisslerDOCKER_QEMU_IP_ADDR="$(docker inspect $obmc_qemu_docker | \ 540205e8daSAndrew Geissler grep -m 1 "IPAddress\":" | cut -d '"' -f 4)" 550205e8daSAndrew Geissler 560205e8daSAndrew Geissler# Now wait for the openbmc qemu docker instance to get to standby 570205e8daSAndrew Geisslerattempt=60 580205e8daSAndrew Geisslerwhile [ $attempt -gt 0 ]; do 590205e8daSAndrew Geissler attempt=$(( $attempt - 1 )) 600205e8daSAndrew Geissler echo "Waiting for qemu to get to standby (attempt: $attempt)..." 610205e8daSAndrew Geissler result=$(docker logs $obmc_qemu_docker) 620205e8daSAndrew Geissler if grep -q 'OPENBMC-READY' <<< $result ; then 630205e8daSAndrew Geissler echo "QEMU is ready!" 640205e8daSAndrew Geissler # Give QEMU a few secs to stablize 650205e8daSAndrew Geissler sleep 5 660205e8daSAndrew Geissler break 670205e8daSAndrew Geissler fi 680205e8daSAndrew Geissler sleep 2 690205e8daSAndrew Geisslerdone 700205e8daSAndrew Geissler 710205e8daSAndrew Geisslerif [ "$attempt" -eq 0 ]; then 720205e8daSAndrew Geissler echo "Timed out waiting for QEMU, exiting" 730205e8daSAndrew Geissler exit 1 740205e8daSAndrew Geisslerfi 750205e8daSAndrew Geissler 760205e8daSAndrew Geissler# Now run the robot test 770205e8daSAndrew Geissler 780205e8daSAndrew Geissler# Timestamp for job 790205e8daSAndrew Geisslerecho "Robot Test started, $(date)" 800205e8daSAndrew Geissler 810205e8daSAndrew Geisslermkdir -p ${WORKSPACE} 820205e8daSAndrew Geisslercd ${WORKSPACE} 830205e8daSAndrew Geissler 840205e8daSAndrew Geissler# Copy in the script which will execute the robot tests 850205e8daSAndrew Geisslercp $DIR/scripts/run-robot.sh ${WORKSPACE} 860205e8daSAndrew Geissler 870205e8daSAndrew Geissler# Run the docker container to execute the robot test cases 880205e8daSAndrew Geissler# The test results will be put in ${WORKSPACE} 89d008c543SAndrew Geisslerdocker run --rm \ 90d008c543SAndrew Geissler --user root \ 910205e8daSAndrew Geissler --env HOME=${HOME} \ 920205e8daSAndrew Geissler --env IP_ADDR=${DOCKER_QEMU_IP_ADDR} \ 930205e8daSAndrew Geissler --env SSH_PORT=${DOCKER_SSH_PORT} \ 940205e8daSAndrew Geissler --env HTTPS_PORT=${DOCKER_HTTPS_PORT} \ 950205e8daSAndrew Geissler --workdir ${HOME} \ 960205e8daSAndrew Geissler --volume ${WORKSPACE}:${HOME} \ 970205e8daSAndrew Geissler --tty \ 980205e8daSAndrew Geissler ${DOCKER_IMG_NAME} ${HOME}/run-robot.sh 990205e8daSAndrew Geissler 1000205e8daSAndrew Geissler# Now stop the QEMU docker image 1010205e8daSAndrew Geisslerdocker stop $obmc_qemu_docker 102