xref: /kvm-unit-tests/scripts/vmm.bash (revision 463cd0ff0ecacdde1325009d4fb8fc3922390a96)
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
8234940cc9SAlexandru Eliseifunction qemu_parse_premature_failure()
8334940cc9SAlexandru Elisei{
8434940cc9SAlexandru Elisei	local log=$*
8534940cc9SAlexandru Elisei
8634940cc9SAlexandru Elisei	echo "$log" | grep "_NO_FILE_4Uhere_" |
8734940cc9SAlexandru Elisei		grep -q -e "[Cc]ould not \(load\|open\) kernel" \
8834940cc9SAlexandru Elisei			-e "error loading" \
8934940cc9SAlexandru Elisei			-e "failed to load" &&
9034940cc9SAlexandru Elisei		return 1
9134940cc9SAlexandru Elisei	return 0
9234940cc9SAlexandru Elisei}
9334940cc9SAlexandru Elisei
944bf367d9SAlexandru Elisei#
954bf367d9SAlexandru Elisei# Probe for MAX_SMP, in case it's less than the number of host cpus.
964bf367d9SAlexandru Elisei#
974bf367d9SAlexandru Eliseifunction qemu_probe_maxsmp()
984bf367d9SAlexandru Elisei{
994bf367d9SAlexandru Elisei	local runtime_arch_run="$1"
1004bf367d9SAlexandru Elisei	local smp
1014bf367d9SAlexandru Elisei
1024bf367d9SAlexandru Elisei	if smp=$($runtime_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP |& grep 'SMP CPUs'); then
1034bf367d9SAlexandru Elisei		smp=${smp##* }
1044bf367d9SAlexandru Elisei		smp=${smp/\(}
1054bf367d9SAlexandru Elisei		smp=${smp/\)}
1064bf367d9SAlexandru Elisei		echo "Restricting MAX_SMP from ($MAX_SMP) to the max supported ($smp)" >&2
1074bf367d9SAlexandru Elisei		MAX_SMP=$smp
1084bf367d9SAlexandru Elisei	fi
1094bf367d9SAlexandru Elisei}
1104bf367d9SAlexandru Elisei
111db9c4e1cSAlexandru Eliseifunction kvmtool_fixup_return_code()
112db9c4e1cSAlexandru Elisei{
113db9c4e1cSAlexandru Elisei	local ret=$1
114db9c4e1cSAlexandru Elisei
115db9c4e1cSAlexandru Elisei	# Force run_test_status() to interpret the STATUS line.
116db9c4e1cSAlexandru Elisei	if [ $ret -eq 0 ]; then
117db9c4e1cSAlexandru Elisei		ret=1
118db9c4e1cSAlexandru Elisei	fi
119db9c4e1cSAlexandru Elisei
120db9c4e1cSAlexandru Elisei	echo $ret
121db9c4e1cSAlexandru Elisei}
122db9c4e1cSAlexandru Elisei
12334940cc9SAlexandru Eliseifunction kvmtool_parse_premature_failure()
12434940cc9SAlexandru Elisei{
12534940cc9SAlexandru Elisei	local log=$*
12634940cc9SAlexandru Elisei
12734940cc9SAlexandru Elisei	echo "$log" | grep "Fatal: Unable to open kernel _NO_FILE_4Uhere_" &&
12834940cc9SAlexandru Elisei		return 1
12934940cc9SAlexandru Elisei	return 0
13034940cc9SAlexandru Elisei}
13134940cc9SAlexandru Elisei
1324bf367d9SAlexandru Eliseifunction kvmtool_probe_maxsmp()
1334bf367d9SAlexandru Elisei{
1344bf367d9SAlexandru Elisei	echo "kvmtool automatically limits the number of VCPUs to maximum supported"
1354bf367d9SAlexandru Elisei	echo "The 'smp' test parameter won't be modified"
1364bf367d9SAlexandru Elisei}
1374bf367d9SAlexandru Elisei
13825c4b4b4SAlexandru Eliseideclare -A vmm_optname=(
13925c4b4b4SAlexandru Elisei	[qemu,args]='-append'
1406eb072c2SAlexandru Elisei	[qemu,default_opts]=''
141db9c4e1cSAlexandru Elisei	[qemu,fixup_return_code]=qemu_fixup_return_code
142db9c4e1cSAlexandru Elisei	[qemu,initrd]='-initrd'
14325c4b4b4SAlexandru Elisei	[qemu,nr_cpus]='-smp'
14434940cc9SAlexandru Elisei	[qemu,parse_premature_failure]=qemu_parse_premature_failure
1454bf367d9SAlexandru Elisei	[qemu,probe_maxsmp]=qemu_probe_maxsmp
146db9c4e1cSAlexandru Elisei
147db9c4e1cSAlexandru Elisei	[kvmtool,args]='--params'
1486eb072c2SAlexandru Elisei	[kvmtool,default_opts]="$KVMTOOL_DEFAULT_OPTS"
149db9c4e1cSAlexandru Elisei	[kvmtool,fixup_return_code]=kvmtool_fixup_return_code
150db9c4e1cSAlexandru Elisei	[kvmtool,initrd]='--initrd'
151db9c4e1cSAlexandru Elisei	[kvmtool,nr_cpus]='--cpus'
15234940cc9SAlexandru Elisei	[kvmtool,parse_premature_failure]=kvmtool_parse_premature_failure
1534bf367d9SAlexandru Elisei	[kvmtool,probe_maxsmp]=kvmtool_probe_maxsmp
15425c4b4b4SAlexandru Elisei)
15525c4b4b4SAlexandru Elisei
15625c4b4b4SAlexandru Eliseifunction vmm_optname_args()
15725c4b4b4SAlexandru Elisei{
15825c4b4b4SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),args]}
15925c4b4b4SAlexandru Elisei}
16025c4b4b4SAlexandru Elisei
1616eb072c2SAlexandru Eliseifunction vmm_default_opts()
1626eb072c2SAlexandru Elisei{
1636eb072c2SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),default_opts]}
1646eb072c2SAlexandru Elisei}
1656eb072c2SAlexandru Elisei
166db9c4e1cSAlexandru Eliseifunction vmm_fixup_return_code()
167db9c4e1cSAlexandru Elisei{
168db9c4e1cSAlexandru Elisei	${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@"
169db9c4e1cSAlexandru Elisei}
170db9c4e1cSAlexandru Elisei
171db9c4e1cSAlexandru Eliseifunction vmm_optname_initrd()
172db9c4e1cSAlexandru Elisei{
173db9c4e1cSAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),initrd]}
174db9c4e1cSAlexandru Elisei}
175db9c4e1cSAlexandru Elisei
17625c4b4b4SAlexandru Eliseifunction vmm_optname_nr_cpus()
17725c4b4b4SAlexandru Elisei{
17825c4b4b4SAlexandru Elisei	echo ${vmm_optname[$(vmm_get_target),nr_cpus]}
17925c4b4b4SAlexandru Elisei}
18025c4b4b4SAlexandru Elisei
18134940cc9SAlexandru Eliseifunction vmm_parse_premature_failure()
18234940cc9SAlexandru Elisei{
18334940cc9SAlexandru Elisei	${vmm_optname[$(vmm_get_target),parse_premature_failure]} "$@"
18434940cc9SAlexandru Elisei}
18534940cc9SAlexandru Elisei
1864bf367d9SAlexandru Eliseifunction vmm_probe_maxsmp()
1874bf367d9SAlexandru Elisei{
1884bf367d9SAlexandru Elisei	${vmm_optname[$(vmm_get_target),probe_maxsmp]} "$1"
1894bf367d9SAlexandru Elisei}
1904bf367d9SAlexandru Elisei
1919fcec1dbSAlexandru Eliseifunction vmm_get_target()
1929fcec1dbSAlexandru Elisei{
1939fcec1dbSAlexandru Elisei	if [[ -z "$TARGET" ]]; then
1949fcec1dbSAlexandru Elisei		echo "qemu"
1959fcec1dbSAlexandru Elisei	else
1969fcec1dbSAlexandru Elisei		echo "$TARGET"
1979fcec1dbSAlexandru Elisei	fi
1989fcec1dbSAlexandru Elisei}
1999fcec1dbSAlexandru Elisei
2009fcec1dbSAlexandru Eliseifunction vmm_check_supported()
2019fcec1dbSAlexandru Elisei{
2029fcec1dbSAlexandru Elisei	# We're not interested in the return code for vmm_get_target().
2039fcec1dbSAlexandru Elisei	# shellcheck disable=SC2155
2049fcec1dbSAlexandru Elisei	local target=$(vmm_get_target)
2059fcec1dbSAlexandru Elisei
2069fcec1dbSAlexandru Elisei	case "$target" in
207*463cd0ffSAlexandru Elisei	qemu | kvmtool)
2089fcec1dbSAlexandru Elisei		return 0
2099fcec1dbSAlexandru Elisei		;;
2109fcec1dbSAlexandru Elisei	*)
2119fcec1dbSAlexandru Elisei		echo "$0 does not support target '$target'"
2129fcec1dbSAlexandru Elisei		exit 2
2139fcec1dbSAlexandru Elisei		;;
2149fcec1dbSAlexandru Elisei	esac
2159fcec1dbSAlexandru Elisei}
216bd93a9c6SAlexandru Elisei
217bd93a9c6SAlexandru Eliseifunction vmm_unittest_params_name()
218bd93a9c6SAlexandru Elisei{
219bd93a9c6SAlexandru Elisei	# shellcheck disable=SC2155
220bd93a9c6SAlexandru Elisei	local target=$(vmm_get_target)
221bd93a9c6SAlexandru Elisei
222bd93a9c6SAlexandru Elisei	case "$target" in
223bd93a9c6SAlexandru Elisei	qemu)
224bd93a9c6SAlexandru Elisei		echo "extra_params|qemu_params"
225bd93a9c6SAlexandru Elisei		;;
226db9c4e1cSAlexandru Elisei	kvmtool)
227db9c4e1cSAlexandru Elisei		echo "kvmtool_params"
228db9c4e1cSAlexandru Elisei		;;
229bd93a9c6SAlexandru Elisei	*)
230bd93a9c6SAlexandru Elisei		echo "$0 does not support '$target'"
231bd93a9c6SAlexandru Elisei		exit 2
232bd93a9c6SAlexandru Elisei		;;
233bd93a9c6SAlexandru Elisei	esac
234bd93a9c6SAlexandru Elisei}
235