xref: /kvm-unit-tests/scripts/vmm.bash (revision 34940cc963b097f2bba35a9aea1727941dde0b84)
16eb072c2SAlexandru Elisei# The following parameters are enabled by default when running a test with
26eb072c2SAlexandru Elisei# kvmtool:
36eb072c2SAlexandru Elisei# --nodefaults: suppress VM configuration that cannot be disabled (like
46eb072c2SAlexandru Elisei#               modifying the supplied kernel command line). Otherwise tests
56eb072c2SAlexandru Elisei#               that use the command line will fail without this parameter.
66eb072c2SAlexandru Elisei# --network mode=none: do not create a network device. kvmtool tries to help the
76eb072c2SAlexandru Elisei#               user by automatically create one, and then prints a warning
86eb072c2SAlexandru Elisei#               when the VM terminates if the device hasn't been initialized.
96eb072c2SAlexandru Elisei# --loglevel=warning: reduce verbosity
106eb072c2SAlexandru Elisei: "${KVMTOOL_DEFAULT_OPTS:="--nodefaults --network mode=none --loglevel=warning"}"
116eb072c2SAlexandru 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
82*34940cc9SAlexandru Eliseifunction qemu_parse_premature_failure()
83*34940cc9SAlexandru Elisei{
84*34940cc9SAlexandru Elisei	local log=$*
85*34940cc9SAlexandru Elisei
86*34940cc9SAlexandru Elisei	echo "$log" | grep "_NO_FILE_4Uhere_" |
87*34940cc9SAlexandru Elisei		grep -q -e "[Cc]ould not \(load\|open\) kernel" \
88*34940cc9SAlexandru Elisei			-e "error loading" \
89*34940cc9SAlexandru Elisei			-e "failed to load" &&
90*34940cc9SAlexandru Elisei		return 1
91*34940cc9SAlexandru Elisei	return 0
92*34940cc9SAlexandru Elisei}
93*34940cc9SAlexandru Elisei
94db9c4e1cSAlexandru Eliseifunction kvmtool_fixup_return_code()
95db9c4e1cSAlexandru Elisei{
96db9c4e1cSAlexandru Elisei	local ret=$1
97db9c4e1cSAlexandru Elisei
98db9c4e1cSAlexandru Elisei	# Force run_test_status() to interpret the STATUS line.
99db9c4e1cSAlexandru Elisei	if [ $ret -eq 0 ]; then
100db9c4e1cSAlexandru Elisei		ret=1
101db9c4e1cSAlexandru Elisei	fi
102db9c4e1cSAlexandru Elisei
103db9c4e1cSAlexandru Elisei	echo $ret
104db9c4e1cSAlexandru Elisei}
105db9c4e1cSAlexandru Elisei
106*34940cc9SAlexandru Eliseifunction kvmtool_parse_premature_failure()
107*34940cc9SAlexandru Elisei{
108*34940cc9SAlexandru Elisei	local log=$*
109*34940cc9SAlexandru Elisei
110*34940cc9SAlexandru Elisei	echo "$log" | grep "Fatal: Unable to open kernel _NO_FILE_4Uhere_" &&
111*34940cc9SAlexandru Elisei		return 1
112*34940cc9SAlexandru Elisei	return 0
113*34940cc9SAlexandru Elisei}
114*34940cc9SAlexandru Elisei
11525c4b4b4SAlexandru Eliseideclare -A vmm_optname=(
11625c4b4b4SAlexandru Elisei	[qemu,args]='-append'
1176eb072c2SAlexandru Elisei	[qemu,default_opts]=''
118db9c4e1cSAlexandru Elisei	[qemu,fixup_return_code]=qemu_fixup_return_code
119db9c4e1cSAlexandru Elisei	[qemu,initrd]='-initrd'
12025c4b4b4SAlexandru Elisei	[qemu,nr_cpus]='-smp'
121*34940cc9SAlexandru Elisei	[qemu,parse_premature_failure]=qemu_parse_premature_failure
122db9c4e1cSAlexandru Elisei
123db9c4e1cSAlexandru Elisei	[kvmtool,args]='--params'
1246eb072c2SAlexandru Elisei	[kvmtool,default_opts]="$KVMTOOL_DEFAULT_OPTS"
125db9c4e1cSAlexandru Elisei	[kvmtool,fixup_return_code]=kvmtool_fixup_return_code
126db9c4e1cSAlexandru Elisei	[kvmtool,initrd]='--initrd'
127db9c4e1cSAlexandru Elisei	[kvmtool,nr_cpus]='--cpus'
128*34940cc9SAlexandru Elisei	[kvmtool,parse_premature_failure]=kvmtool_parse_premature_failure
12925c4b4b4SAlexandru Elisei)
13025c4b4b4SAlexandru Elisei
13125c4b4b4SAlexandru Eliseifunction vmm_optname_args()
13225c4b4b4SAlexandru Elisei{
13325c4b4b4SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),args]}
13425c4b4b4SAlexandru Elisei}
13525c4b4b4SAlexandru Elisei
1366eb072c2SAlexandru Eliseifunction vmm_default_opts()
1376eb072c2SAlexandru Elisei{
1386eb072c2SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),default_opts]}
1396eb072c2SAlexandru Elisei}
1406eb072c2SAlexandru Elisei
141db9c4e1cSAlexandru Eliseifunction vmm_fixup_return_code()
142db9c4e1cSAlexandru Elisei{
143db9c4e1cSAlexandru Elisei	${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@"
144db9c4e1cSAlexandru Elisei}
145db9c4e1cSAlexandru Elisei
146db9c4e1cSAlexandru Eliseifunction vmm_optname_initrd()
147db9c4e1cSAlexandru Elisei{
148db9c4e1cSAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),initrd]}
149db9c4e1cSAlexandru Elisei}
150db9c4e1cSAlexandru Elisei
15125c4b4b4SAlexandru Eliseifunction vmm_optname_nr_cpus()
15225c4b4b4SAlexandru Elisei{
15325c4b4b4SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),nr_cpus]}
15425c4b4b4SAlexandru Elisei}
15525c4b4b4SAlexandru Elisei
156*34940cc9SAlexandru Eliseifunction vmm_parse_premature_failure()
157*34940cc9SAlexandru Elisei{
158*34940cc9SAlexandru Elisei	${vmm_optname[$(vmm_get_target),parse_premature_failure]} "$@"
159*34940cc9SAlexandru Elisei}
160*34940cc9SAlexandru Elisei
1619fcec1dbSAlexandru Eliseifunction vmm_get_target()
1629fcec1dbSAlexandru Elisei{
1639fcec1dbSAlexandru Elisei	if [[ -z "$TARGET" ]]; then
1649fcec1dbSAlexandru Elisei		echo "qemu"
1659fcec1dbSAlexandru Elisei	else
1669fcec1dbSAlexandru Elisei		echo "$TARGET"
1679fcec1dbSAlexandru Elisei	fi
1689fcec1dbSAlexandru Elisei}
1699fcec1dbSAlexandru Elisei
1709fcec1dbSAlexandru Eliseifunction vmm_check_supported()
1719fcec1dbSAlexandru Elisei{
1729fcec1dbSAlexandru Elisei	# We're not interested in the return code for vmm_get_target().
1739fcec1dbSAlexandru Elisei	# shellcheck disable=SC2155
1749fcec1dbSAlexandru Elisei	local target=$(vmm_get_target)
1759fcec1dbSAlexandru Elisei
1769fcec1dbSAlexandru Elisei	case "$target" in
1779fcec1dbSAlexandru Elisei	qemu)
1789fcec1dbSAlexandru Elisei		return 0
1799fcec1dbSAlexandru Elisei		;;
1809fcec1dbSAlexandru Elisei	*)
1819fcec1dbSAlexandru Elisei		echo "$0 does not support target '$target'"
1829fcec1dbSAlexandru Elisei		exit 2
1839fcec1dbSAlexandru Elisei		;;
1849fcec1dbSAlexandru Elisei	esac
1859fcec1dbSAlexandru Elisei}
186bd93a9c6SAlexandru Elisei
187bd93a9c6SAlexandru Eliseifunction vmm_unittest_params_name()
188bd93a9c6SAlexandru Elisei{
189bd93a9c6SAlexandru Elisei	# shellcheck disable=SC2155
190bd93a9c6SAlexandru Elisei	local target=$(vmm_get_target)
191bd93a9c6SAlexandru Elisei
192bd93a9c6SAlexandru Elisei	case "$target" in
193bd93a9c6SAlexandru Elisei	qemu)
194bd93a9c6SAlexandru Elisei		echo "extra_params|qemu_params"
195bd93a9c6SAlexandru Elisei		;;
196db9c4e1cSAlexandru Elisei	kvmtool)
197db9c4e1cSAlexandru Elisei		echo "kvmtool_params"
198db9c4e1cSAlexandru Elisei		;;
199bd93a9c6SAlexandru Elisei	*)
200bd93a9c6SAlexandru Elisei		echo "$0 does not support '$target'"
201bd93a9c6SAlexandru Elisei		exit 2
202bd93a9c6SAlexandru Elisei		;;
203bd93a9c6SAlexandru Elisei	esac
204bd93a9c6SAlexandru Elisei}
205