1#!/usr/bin/env bash 2 3# Run x86_64 dom0 tests on hardware. 4 5set -ex -o pipefail 6 7fatal() { 8 echo "$(basename "$0") $*" >&2 9 exit 1 10} 11 12WORKDIR="${PWD}" 13 14# Test parameter defaults. 15TEST="$1" 16PASS_MSG="Test passed: ${TEST}" 17XEN_CMD_DOM0="dom0=pvh dom0_max_vcpus=4 dom0_mem=4G" 18XEN_CMD_XEN="sched=null loglvl=all guest_loglvl=all console_timestamps=boot" 19XEN_CMD_EXTRA="" 20DOM0_CMD="" 21DOMU_CMD="" 22DOMU_CFG=' 23type = "pvh" 24name = "domU" 25kernel = "/boot/vmlinuz-domU" 26ramdisk = "/boot/initrd-domU" 27extra = "root=/dev/ram0 console=hvc0" 28memory = 512 29' 30DOMU_CFG_EXTRA="" 31dom0_rootfs_extra_comp=() 32dom0_rootfs_extra_uncomp=() 33 34# Select test variant. 35if [ "${TEST}" = "ping" ]; then 36 DOMU_MSG="domU online" 37 DOMU_CMD=" 38ifconfig eth0 192.168.0.2 39until ping -c 10 192.168.0.1; do 40 sleep 1 41done 42echo \"${DOMU_MSG}\" 43" 44 DOM0_CMD=" 45brctl addbr xenbr0 46brctl addif xenbr0 eth0 47ifconfig eth0 up 48ifconfig xenbr0 up 49ifconfig xenbr0 192.168.0.1 50# get domU console content into test log 51tail -F /var/log/xen/console/guest-domU.log 2>/dev/null | sed -e \"s/^/(domU) /\" & 52xl -vvv create /etc/xen/domU.cfg 53set +x 54until grep -q \"${DOMU_MSG}\" /var/log/xen/console/guest-domU.log; do 55 sleep 1 56done 57set -x 58echo \"${PASS_MSG}\" 59" 60 DOMU_CFG_EXTRA=' 61vif = [ "bridge=xenbr0", ] 62disk = [ ] 63' 64elif [ "${TEST}" = "argo" ] 65then 66 PASS_MSG="TEST: Message from DOMU" 67 XEN_CMD_EXTRA="argo=1,mac-permissive=1" 68 DOMU_CMD=" 69insmod /lib/modules/\$(uname -r)/updates/xen-argo.ko 70until false 71do 72 echo \"${PASS_MSG}\" 73 sleep 1 74done | argo-exec -p 28333 -d 0 -- /bin/echo 75" 76 dom0_rootfs_extra_comp+=(binaries/argo.cpio.gz) 77 DOM0_CMD=" 78insmod /lib/modules/\$(uname -r)/updates/xen-argo.ko 79xl -vvv create /etc/xen/domU.cfg 80argo-exec -l -p 28333 -- /bin/echo 81" 82else 83 fatal "Unknown test: ${TEST}" 84fi 85 86# DomU rootfs 87cp binaries/rootfs.cpio.gz binaries/domU-rootfs.cpio.gz 88if [[ "${TEST}" == argo ]]; then 89 cat binaries/argo.cpio.gz >> binaries/domU-rootfs.cpio.gz 90fi 91 92# test-local configuration 93mkdir -p rootfs 94cd rootfs 95mkdir -p etc/local.d 96echo "#!/bin/sh 97set -x 98${DOMU_CMD} 99" > etc/local.d/xen.start 100chmod +x etc/local.d/xen.start 101echo "domU Welcome to Alpine Linux 102Kernel \r on an \m (\l) 103 104" > etc/issue 105find . | cpio -H newc -o | gzip >> ../binaries/domU-rootfs.cpio.gz 106cd .. 107rm -rf rootfs 108 109# Package domU kernel+rootfs in /boot for dom0 (uncompressed) 110mkdir -p rootfs/boot 111cd rootfs 112cp ../binaries/bzImage boot/vmlinuz-domU 113cp ../binaries/domU-rootfs.cpio.gz boot/initrd-domU 114find . | cpio -H newc -o > ../binaries/domU-in-dom0.cpio 115cd .. 116rm -rf rootfs 117 118# Dom0 rootfs. The order of concatenation is important; ucode wants to come 119# first, and all uncompressed must be ahead of compressed. 120dom0_rootfs_parts=( 121 binaries/ucode.cpio 122 binaries/domU-in-dom0.cpio 123 "${dom0_rootfs_extra_uncomp[@]}" 124 binaries/rootfs.cpio.gz 125 binaries/xen-tools.cpio.gz 126 "${dom0_rootfs_extra_comp[@]}" 127) 128cat "${dom0_rootfs_parts[@]}" > binaries/dom0-rootfs.cpio.gz 129 130# test-local configuration 131mkdir -p rootfs 132cd rootfs 133mkdir -p boot etc/local.d etc/xen etc/default 134echo "#!/bin/bash 135set -x 136bash /etc/init.d/xencommons start 137${DOM0_CMD} 138" > etc/local.d/xen.start 139chmod +x etc/local.d/xen.start 140echo "${DOMU_CFG}${DOMU_CFG_EXTRA}" > etc/xen/domU.cfg 141echo "XENCONSOLED_TRACE=all" >> etc/default/xencommons 142echo "QEMU_XEN=/bin/false" >> etc/default/xencommons 143mkdir -p var/log/xen/console 144find . | cpio -H newc -o | gzip >> ../binaries/dom0-rootfs.cpio.gz 145cd .. 146 147# Load software into TFTP server directory. 148TFTP="/scratch/gitlab-runner/tftp" 149XEN_CMDLINE="${XEN_CMD_CONSOLE} ${XEN_CMD_XEN} ${XEN_CMD_DOM0} ${XEN_CMD_EXTRA}" 150cp -f binaries/xen ${TFTP}/${TEST_BOARD}/xen 151cp -f binaries/bzImage ${TFTP}/${TEST_BOARD}/vmlinuz 152cp -f binaries/dom0-rootfs.cpio.gz ${TFTP}/${TEST_BOARD}/initrd-dom0 153echo " 154net_default_server=10.0.6.1 155multiboot2 (tftp)/${TEST_BOARD}/xen ${XEN_CMDLINE} sync_console 156module2 (tftp)/${TEST_BOARD}/vmlinuz console=hvc0 root=/dev/ram0 earlyprintk=xen 157module2 --nounzip (tftp)/${TEST_BOARD}/initrd-dom0 158boot 159" > ${TFTP}/${TEST_BOARD}/grub.cfg 160 161# Power cycle board and collect serial port output. 162SERIAL_DEV="/dev/serial/${TEST_BOARD}" 163sh /scratch/gitlab-runner/${TEST_BOARD}.sh 2 164sleep 5 165sh /scratch/gitlab-runner/${TEST_BOARD}.sh 1 166sleep 5 167set +e 168stty -F ${SERIAL_DEV} 57600 -echo 169 170# Capture test result and power off board before exiting. 171export PASSED="${PASS_MSG}" 172export BOOT_MSG="Latest ChangeSet: " 173export TEST_CMD="cat ${SERIAL_DEV}" 174export TEST_LOG="smoke.serial" 175 176./automation/scripts/console.exp | sed 's/\r\+$//' 177TEST_RESULT=$? 178sh "/scratch/gitlab-runner/${TEST_BOARD}.sh" 2 179exit ${TEST_RESULT} 180