10205e8daSAndrew Geissler#!/bin/bash -xe 2*74d2aba9SAlanny Lopez############################################################################### 30205e8daSAndrew Geissler# 4*74d2aba9SAlanny Lopez# This script is for starting QEMU against the input build and running the 5*74d2aba9SAlanny Lopez# robot CI test suite against it.(ROBOT CI TEST CURRENTLY WIP) 6*74d2aba9SAlanny Lopez# 7*74d2aba9SAlanny Lopez############################################################################### 8*74d2aba9SAlanny Lopez# 9*74d2aba9SAlanny Lopez# Parameters used by the script: 10*74d2aba9SAlanny Lopez# UPSTREAM_WORKSPACE = The directory from which the QEMU components are being 11*74d2aba9SAlanny Lopez# imported from. Generally, this is the build directory 12*74d2aba9SAlanny Lopez# that is generated by the OpenBMC build-setup.sh script 13*74d2aba9SAlanny Lopez# when run with "target=qemu". 14*74d2aba9SAlanny Lopez# Example: /home/builder/workspace/openbmc-build/build. 15*74d2aba9SAlanny Lopez# 16*74d2aba9SAlanny Lopez# Optional Variables: 17*74d2aba9SAlanny Lopez# 18*74d2aba9SAlanny Lopez# WORKSPACE = Path of the workspace directory where some intermediate 19*74d2aba9SAlanny Lopez# files will be saved to. 20*74d2aba9SAlanny Lopez# QEMU_RUN_TIMER = Defaults to 300, a timer for the QEMU container. 21*74d2aba9SAlanny Lopez# DOCKER_IMG_NAME = Defaults to openbmc/ubuntu-robot-qemu, the name the 22*74d2aba9SAlanny Lopez# Docker image will be tagged with when built. 23*74d2aba9SAlanny Lopez# OBMC_BUILD_DIR = Defaults to /tmp/openbmc/build, the path to the 24*74d2aba9SAlanny Lopez# directory where the UPSTREAM_WORKSPACE build files will 25*74d2aba9SAlanny Lopez# be mounted to. Since the build containers have been 26*74d2aba9SAlanny Lopez# changed to use /tmp as the parent directory for their 27*74d2aba9SAlanny Lopez# builds, move the mounting location to be the same to 28*74d2aba9SAlanny Lopez# resolve issues with file links or referrals to exact 29*74d2aba9SAlanny Lopez# paths in the original build directory. If the build 30*74d2aba9SAlanny Lopez# directory was changed in the build-setup.sh run, this 31*74d2aba9SAlanny Lopez# variable should also be changed. Otherwise, the default 32*74d2aba9SAlanny Lopez# should be used. 33*74d2aba9SAlanny Lopez# 34*74d2aba9SAlanny Lopez############################################################################### 350205e8daSAndrew Geissler 360205e8daSAndrew Geisslerset -uo pipefail 370205e8daSAndrew Geissler 38*74d2aba9SAlanny LopezQEMU_RUN_TIMER=${QEMU_RUN_TIMER:-300} 391df680a1SAndrew GeisslerWORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}} 40*74d2aba9SAlanny LopezDOCKER_IMG_NAME=${DOCKER_IMG_NAME:-openbmc/ubuntu-robot-qemu} 41*74d2aba9SAlanny LopezOBMC_BUILD_DIR=${OBMC_BUILD_DIR:-/tmp/openbmc/build} 42*74d2aba9SAlanny LopezUPSTREAM_WORKSPACE=${UPSTREAM_WORKSPACE:-${1}} 430205e8daSAndrew Geissler 44*74d2aba9SAlanny Lopez# Determine the architecture 45*74d2aba9SAlanny LopezARCH=$(uname -m) 460205e8daSAndrew Geissler 47*74d2aba9SAlanny Lopez# Determine the prefix of the Dockerfile's base image and the QEMU_ARCH variable 48*74d2aba9SAlanny Lopezcase ${ARCH} in 49*74d2aba9SAlanny Lopez "ppc64le") 500205e8daSAndrew Geissler DOCKER_BASE="ppc64le/" 510205e8daSAndrew Geissler QEMU_ARCH="ppc64le-linux" 52*74d2aba9SAlanny Lopez ;; 53*74d2aba9SAlanny Lopez "x86_64") 540205e8daSAndrew Geissler DOCKER_BASE="" 550205e8daSAndrew Geissler QEMU_ARCH="x86_64-linux" 56*74d2aba9SAlanny Lopez ;; 57*74d2aba9SAlanny Lopez *) 58*74d2aba9SAlanny Lopez echo "Unsupported system architecture(${ARCH}) found for docker image" 59*74d2aba9SAlanny Lopez exit 1 60*74d2aba9SAlanny Lopezesac 610205e8daSAndrew Geissler 62*74d2aba9SAlanny Lopez# Get the base directory of the openbmc-build-scripts repo so we can return 63*74d2aba9SAlanny LopezDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 64*74d2aba9SAlanny Lopez 65*74d2aba9SAlanny Lopez# Create the base Docker image for QEMU and Robot 660205e8daSAndrew Geissler. "$DIR/scripts/build-qemu-robot-docker.sh" "$DOCKER_IMG_NAME" 670205e8daSAndrew Geissler 680205e8daSAndrew Geissler# Copy the scripts to start and verify QEMU in the workspace 690205e8daSAndrew Geisslercp $DIR/scripts/boot-qemu* ${UPSTREAM_WORKSPACE} 700205e8daSAndrew Geissler 71*74d2aba9SAlanny Lopez# Move into the upstream workspace directory 72*74d2aba9SAlanny Lopezcd ${UPSTREAM_WORKSPACE} 73*74d2aba9SAlanny Lopez 740205e8daSAndrew Geissler# Start QEMU docker instance 750205e8daSAndrew Geissler# root in docker required to open up the https/ssh ports 7610a193c9SLeonel Gonzalezobmc_qemu_docker=$(docker run --detach \ 770205e8daSAndrew Geissler --user root \ 78*74d2aba9SAlanny Lopez --env HOME=${OBMC_BUILD_DIR} \ 790205e8daSAndrew Geissler --env QEMU_RUN_TIMER=${QEMU_RUN_TIMER} \ 800205e8daSAndrew Geissler --env QEMU_ARCH=${QEMU_ARCH} \ 81*74d2aba9SAlanny Lopez --workdir "${OBMC_BUILD_DIR}" \ 82*74d2aba9SAlanny Lopez --volume "${UPSTREAM_WORKSPACE}":"${OBMC_BUILD_DIR}" \ 830205e8daSAndrew Geissler --tty \ 84*74d2aba9SAlanny Lopez ${DOCKER_IMG_NAME} ${OBMC_BUILD_DIR}/boot-qemu-test.exp) 85*74d2aba9SAlanny Lopez 860205e8daSAndrew Geissler 870205e8daSAndrew Geissler# We can use default ports because we're going to have the 2 880205e8daSAndrew Geissler# docker instances talk over their private network 890205e8daSAndrew GeisslerDOCKER_SSH_PORT=22 900205e8daSAndrew GeisslerDOCKER_HTTPS_PORT=443 910205e8daSAndrew GeisslerDOCKER_QEMU_IP_ADDR="$(docker inspect $obmc_qemu_docker | \ 920205e8daSAndrew Geissler grep -m 1 "IPAddress\":" | cut -d '"' -f 4)" 930205e8daSAndrew Geissler 94*74d2aba9SAlanny Lopez# Now wait for the OpenBMC QEMU Docker instance to get to standby 950205e8daSAndrew Geisslerattempt=60 960205e8daSAndrew Geisslerwhile [ $attempt -gt 0 ]; do 970205e8daSAndrew Geissler attempt=$(( $attempt - 1 )) 980205e8daSAndrew Geissler echo "Waiting for qemu to get to standby (attempt: $attempt)..." 990205e8daSAndrew Geissler result=$(docker logs $obmc_qemu_docker) 1000205e8daSAndrew Geissler if grep -q 'OPENBMC-READY' <<< $result ; then 1010205e8daSAndrew Geissler echo "QEMU is ready!" 1020205e8daSAndrew Geissler # Give QEMU a few secs to stablize 1030205e8daSAndrew Geissler sleep 5 1040205e8daSAndrew Geissler break 1050205e8daSAndrew Geissler fi 1060205e8daSAndrew Geissler sleep 2 1070205e8daSAndrew Geisslerdone 1080205e8daSAndrew Geissler 1090205e8daSAndrew Geisslerif [ "$attempt" -eq 0 ]; then 1100205e8daSAndrew Geissler echo "Timed out waiting for QEMU, exiting" 1110205e8daSAndrew Geissler exit 1 1120205e8daSAndrew Geisslerfi 1130205e8daSAndrew Geissler 114*74d2aba9SAlanny Lopez# Now run the Robot test 1150205e8daSAndrew Geissler 1160205e8daSAndrew Geissler# Timestamp for job 1170205e8daSAndrew Geisslerecho "Robot Test started, $(date)" 1180205e8daSAndrew Geissler 1190205e8daSAndrew Geisslermkdir -p ${WORKSPACE} 1200205e8daSAndrew Geisslercd ${WORKSPACE} 1210205e8daSAndrew Geissler 122*74d2aba9SAlanny Lopez# Copy in the script which will execute the Robot tests 1230205e8daSAndrew Geisslercp $DIR/scripts/run-robot.sh ${WORKSPACE} 1240205e8daSAndrew Geissler 125*74d2aba9SAlanny Lopez# Run the Docker container to execute the Robot test cases 1260205e8daSAndrew Geissler# The test results will be put in ${WORKSPACE} 127d008c543SAndrew Geisslerdocker run --rm \ 128d008c543SAndrew Geissler --user root \ 1290205e8daSAndrew Geissler --env HOME=${HOME} \ 1300205e8daSAndrew Geissler --env IP_ADDR=${DOCKER_QEMU_IP_ADDR} \ 1310205e8daSAndrew Geissler --env SSH_PORT=${DOCKER_SSH_PORT} \ 1320205e8daSAndrew Geissler --env HTTPS_PORT=${DOCKER_HTTPS_PORT} \ 1330205e8daSAndrew Geissler --workdir ${HOME} \ 1340205e8daSAndrew Geissler --volume ${WORKSPACE}:${HOME} \ 1350205e8daSAndrew Geissler --tty \ 1360205e8daSAndrew Geissler ${DOCKER_IMG_NAME} ${HOME}/run-robot.sh 1370205e8daSAndrew Geissler 138*74d2aba9SAlanny Lopez# Now stop the QEMU Docker image 1390205e8daSAndrew Geisslerdocker stop $obmc_qemu_docker 140