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