xref: /kvm-unit-tests/scripts/vmm.bash (revision 6eb072c22598410818ddf9d38afc98adc9a97397)
1*6eb072c2SAlexandru Elisei# The following parameters are enabled by default when running a test with
2*6eb072c2SAlexandru Elisei# kvmtool:
3*6eb072c2SAlexandru Elisei# --nodefaults: suppress VM configuration that cannot be disabled (like
4*6eb072c2SAlexandru Elisei#               modifying the supplied kernel command line). Otherwise tests
5*6eb072c2SAlexandru Elisei#               that use the command line will fail without this parameter.
6*6eb072c2SAlexandru Elisei# --network mode=none: do not create a network device. kvmtool tries to help the
7*6eb072c2SAlexandru Elisei#               user by automatically create one, and then prints a warning
8*6eb072c2SAlexandru Elisei#               when the VM terminates if the device hasn't been initialized.
9*6eb072c2SAlexandru Elisei# --loglevel=warning: reduce verbosity
10*6eb072c2SAlexandru Elisei: "${KVMTOOL_DEFAULT_OPTS:="--nodefaults --network mode=none --loglevel=warning"}"
11*6eb072c2SAlexandru Elisei
12db9c4e1cSAlexandru Elisei##############################################################################
13db9c4e1cSAlexandru Elisei# qemu_fixup_return_code translates the ambiguous exit status in Table1 to that
14db9c4e1cSAlexandru Elisei# in Table2.  Table3 simply documents the complete status table.
15db9c4e1cSAlexandru Elisei#
16db9c4e1cSAlexandru Elisei# Table1: Before fixup
17db9c4e1cSAlexandru Elisei# --------------------
18db9c4e1cSAlexandru Elisei# 0      - Unexpected exit from QEMU (possible signal), or the unittest did
19db9c4e1cSAlexandru Elisei#          not use debug-exit
20db9c4e1cSAlexandru Elisei# 1      - most likely unittest succeeded, or QEMU failed
21db9c4e1cSAlexandru Elisei#
22db9c4e1cSAlexandru Elisei# Table2: After fixup
23db9c4e1cSAlexandru Elisei# -------------------
24db9c4e1cSAlexandru Elisei# 0      - Everything succeeded
25db9c4e1cSAlexandru Elisei# 1      - most likely QEMU failed
26db9c4e1cSAlexandru Elisei#
27db9c4e1cSAlexandru Elisei# Table3: Complete table
28db9c4e1cSAlexandru Elisei# ----------------------
29db9c4e1cSAlexandru Elisei# 0      - SUCCESS
30db9c4e1cSAlexandru Elisei# 1      - most likely QEMU failed
31db9c4e1cSAlexandru Elisei# 2      - most likely a run script failed
32db9c4e1cSAlexandru Elisei# 3      - most likely the unittest failed
33db9c4e1cSAlexandru Elisei# 124    - most likely the unittest timed out
34db9c4e1cSAlexandru Elisei# 127    - most likely the unittest called abort()
35db9c4e1cSAlexandru Elisei# 1..127 - FAILURE (could be QEMU, a run script, or the unittest)
36db9c4e1cSAlexandru Elisei# >= 128 - Signal (signum = status - 128)
37db9c4e1cSAlexandru Elisei##############################################################################
38db9c4e1cSAlexandru Eliseifunction qemu_fixup_return_code()
39db9c4e1cSAlexandru Elisei{
40db9c4e1cSAlexandru Elisei	local ret=$1
41db9c4e1cSAlexandru Elisei	# Remove $ret from the list of arguments
42db9c4e1cSAlexandru Elisei	shift 1
43db9c4e1cSAlexandru Elisei	local errors=$*
44db9c4e1cSAlexandru Elisei	local sig
45db9c4e1cSAlexandru Elisei
46db9c4e1cSAlexandru Elisei	[ $ret -eq 134 ] && echo "QEMU Aborted" >&2
47db9c4e1cSAlexandru Elisei
48db9c4e1cSAlexandru Elisei	if [ "$errors" ]; then
49db9c4e1cSAlexandru Elisei		sig=$(grep 'terminating on signal' <<<"$errors")
50db9c4e1cSAlexandru Elisei		if [ "$sig" ]; then
51db9c4e1cSAlexandru Elisei			# This is too complex for ${var/search/replace}
52db9c4e1cSAlexandru Elisei			# shellcheck disable=SC2001
53db9c4e1cSAlexandru Elisei			sig=$(sed 's/.*terminating on signal \([0-9][0-9]*\).*/\1/' <<<"$sig")
54db9c4e1cSAlexandru Elisei		fi
55db9c4e1cSAlexandru Elisei	fi
56db9c4e1cSAlexandru Elisei
57db9c4e1cSAlexandru Elisei	if [ $ret -eq 0 ]; then
58db9c4e1cSAlexandru Elisei		# Some signals result in a zero return status, but the
59db9c4e1cSAlexandru Elisei		# error log tells the truth.
60db9c4e1cSAlexandru Elisei		if [ "$sig" ]; then
61db9c4e1cSAlexandru Elisei			((ret=sig+128))
62db9c4e1cSAlexandru Elisei		else
63db9c4e1cSAlexandru Elisei			# Exiting with zero (non-debugexit) is an error
64db9c4e1cSAlexandru Elisei			ret=1
65db9c4e1cSAlexandru Elisei		fi
66db9c4e1cSAlexandru Elisei	elif [ $ret -eq 1 ]; then
67db9c4e1cSAlexandru Elisei		# Even when ret==1 (unittest success) if we also got stderr
68db9c4e1cSAlexandru Elisei		# logs, then we assume a QEMU failure. Otherwise we translate
69db9c4e1cSAlexandru Elisei		# status of 1 to 0 (SUCCESS)
70db9c4e1cSAlexandru Elisei	        if [ "$errors" ]; then
71db9c4e1cSAlexandru Elisei			if ! grep -qvi warning <<<"$errors" ; then
72db9c4e1cSAlexandru Elisei				ret=0
73db9c4e1cSAlexandru Elisei			fi
74db9c4e1cSAlexandru Elisei		else
75db9c4e1cSAlexandru Elisei			ret=0
76db9c4e1cSAlexandru Elisei		fi
77db9c4e1cSAlexandru Elisei	fi
78db9c4e1cSAlexandru Elisei
79db9c4e1cSAlexandru Elisei	echo $ret
80db9c4e1cSAlexandru Elisei}
81db9c4e1cSAlexandru Elisei
82db9c4e1cSAlexandru Eliseifunction kvmtool_fixup_return_code()
83db9c4e1cSAlexandru Elisei{
84db9c4e1cSAlexandru Elisei	local ret=$1
85db9c4e1cSAlexandru Elisei
86db9c4e1cSAlexandru Elisei	# Force run_test_status() to interpret the STATUS line.
87db9c4e1cSAlexandru Elisei	if [ $ret -eq 0 ]; then
88db9c4e1cSAlexandru Elisei		ret=1
89db9c4e1cSAlexandru Elisei	fi
90db9c4e1cSAlexandru Elisei
91db9c4e1cSAlexandru Elisei	echo $ret
92db9c4e1cSAlexandru Elisei}
93db9c4e1cSAlexandru Elisei
9425c4b4b4SAlexandru Eliseideclare -A vmm_optname=(
9525c4b4b4SAlexandru Elisei	[qemu,args]='-append'
96*6eb072c2SAlexandru Elisei	[qemu,default_opts]=''
97db9c4e1cSAlexandru Elisei	[qemu,fixup_return_code]=qemu_fixup_return_code
98db9c4e1cSAlexandru Elisei	[qemu,initrd]='-initrd'
9925c4b4b4SAlexandru Elisei	[qemu,nr_cpus]='-smp'
100db9c4e1cSAlexandru Elisei
101db9c4e1cSAlexandru Elisei	[kvmtool,args]='--params'
102*6eb072c2SAlexandru Elisei	[kvmtool,default_opts]="$KVMTOOL_DEFAULT_OPTS"
103db9c4e1cSAlexandru Elisei	[kvmtool,fixup_return_code]=kvmtool_fixup_return_code
104db9c4e1cSAlexandru Elisei	[kvmtool,initrd]='--initrd'
105db9c4e1cSAlexandru Elisei	[kvmtool,nr_cpus]='--cpus'
10625c4b4b4SAlexandru Elisei)
10725c4b4b4SAlexandru Elisei
10825c4b4b4SAlexandru Eliseifunction vmm_optname_args()
10925c4b4b4SAlexandru Elisei{
11025c4b4b4SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),args]}
11125c4b4b4SAlexandru Elisei}
11225c4b4b4SAlexandru Elisei
113*6eb072c2SAlexandru Eliseifunction vmm_default_opts()
114*6eb072c2SAlexandru Elisei{
115*6eb072c2SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),default_opts]}
116*6eb072c2SAlexandru Elisei}
117*6eb072c2SAlexandru Elisei
118db9c4e1cSAlexandru Eliseifunction vmm_fixup_return_code()
119db9c4e1cSAlexandru Elisei{
120db9c4e1cSAlexandru Elisei	${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@"
121db9c4e1cSAlexandru Elisei}
122db9c4e1cSAlexandru Elisei
123db9c4e1cSAlexandru Eliseifunction vmm_optname_initrd()
124db9c4e1cSAlexandru Elisei{
125db9c4e1cSAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),initrd]}
126db9c4e1cSAlexandru Elisei}
127db9c4e1cSAlexandru Elisei
12825c4b4b4SAlexandru Eliseifunction vmm_optname_nr_cpus()
12925c4b4b4SAlexandru Elisei{
13025c4b4b4SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),nr_cpus]}
13125c4b4b4SAlexandru Elisei}
13225c4b4b4SAlexandru Elisei
1339fcec1dbSAlexandru Eliseifunction vmm_get_target()
1349fcec1dbSAlexandru Elisei{
1359fcec1dbSAlexandru Elisei	if [[ -z "$TARGET" ]]; then
1369fcec1dbSAlexandru Elisei		echo "qemu"
1379fcec1dbSAlexandru Elisei	else
1389fcec1dbSAlexandru Elisei		echo "$TARGET"
1399fcec1dbSAlexandru Elisei	fi
1409fcec1dbSAlexandru Elisei}
1419fcec1dbSAlexandru Elisei
1429fcec1dbSAlexandru Eliseifunction vmm_check_supported()
1439fcec1dbSAlexandru Elisei{
1449fcec1dbSAlexandru Elisei	# We're not interested in the return code for vmm_get_target().
1459fcec1dbSAlexandru Elisei	# shellcheck disable=SC2155
1469fcec1dbSAlexandru Elisei	local target=$(vmm_get_target)
1479fcec1dbSAlexandru Elisei
1489fcec1dbSAlexandru Elisei	case "$target" in
1499fcec1dbSAlexandru Elisei	qemu)
1509fcec1dbSAlexandru Elisei		return 0
1519fcec1dbSAlexandru Elisei		;;
1529fcec1dbSAlexandru Elisei	*)
1539fcec1dbSAlexandru Elisei		echo "$0 does not support target '$target'"
1549fcec1dbSAlexandru Elisei		exit 2
1559fcec1dbSAlexandru Elisei		;;
1569fcec1dbSAlexandru Elisei	esac
1579fcec1dbSAlexandru Elisei}
158bd93a9c6SAlexandru Elisei
159bd93a9c6SAlexandru Eliseifunction vmm_unittest_params_name()
160bd93a9c6SAlexandru Elisei{
161bd93a9c6SAlexandru Elisei	# shellcheck disable=SC2155
162bd93a9c6SAlexandru Elisei	local target=$(vmm_get_target)
163bd93a9c6SAlexandru Elisei
164bd93a9c6SAlexandru Elisei	case "$target" in
165bd93a9c6SAlexandru Elisei	qemu)
166bd93a9c6SAlexandru Elisei		echo "extra_params|qemu_params"
167bd93a9c6SAlexandru Elisei		;;
168db9c4e1cSAlexandru Elisei	kvmtool)
169db9c4e1cSAlexandru Elisei		echo "kvmtool_params"
170db9c4e1cSAlexandru Elisei		;;
171bd93a9c6SAlexandru Elisei	*)
172bd93a9c6SAlexandru Elisei		echo "$0 does not support '$target'"
173bd93a9c6SAlexandru Elisei		exit 2
174bd93a9c6SAlexandru Elisei		;;
175bd93a9c6SAlexandru Elisei	esac
176bd93a9c6SAlexandru Elisei}
177