aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jugurtha BELKALEM <jugurtha.belkalem@smile.fr>2020-02-17 21:50:29 +0100
committerGravatar Yann E. MORIN <yann.morin.1998@free.fr>2020-04-13 21:51:13 +0200
commit0c7935063851accf3db4c9eb2fc4f11c3da0c391 (patch)
treee785bfb5ff39afe137ef2998d01f6b04831eebf1
parent302d3bc4a0d8d40d6b8bb6fe58cbd3c296e5a0d4 (diff)
downloadbuildroot-0c7935063851accf3db4c9eb2fc4f11c3da0c391.tar.gz
buildroot-0c7935063851accf3db4c9eb2fc4f11c3da0c391.tar.bz2
support/scripts/boot-qemu-image.py: boot Qemu images with Qemu-system.
This script is intended to be used by gitlab CI to test at runtime Qemu images generated by Buildroot's Qemu defconfigs. This allows to troubleshoot different issues that may be associated with defective builds by lanching a qemu machine, sending root password, waiting for login shell and then perform a shutdown. This script is inspired by toolchain builder [1] and the Buildroot testing infrastructure. The gitlab CI will call this script for each defconfig build but only Qemu defconfig will be runtime tested, all others defconfig are ignored. Some Qemu defconfig must be used with a specific Qemu version (fork) that is not always available, so the script doesn't error out when it can't spawn a missing command. That condition is anyway printed in the log. Finally, the script start Qemu like it's done for the Buildroot testing infrastructure (using pexpect). Note: We noticed some timeout issues with pexpect when the Qemu machine is powered off. That's because Qemu process doesn't stop even if the system is halted (after "System halted"). So the script doesn't error out when such timeout occure. The behaviour depends on the architecture emulated by Qemu. [1] https://github.com/bootlin/toolchains-builder/blob/master/build.sh Signed-off-by: Jugurtha BELKALEM <jugurtha.belkalem@smile.fr> Signed-off-by: Romain Naour <romain.naour@smile.fr> Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
-rwxr-xr-xsupport/scripts/boot-qemu-image.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/support/scripts/boot-qemu-image.py b/support/scripts/boot-qemu-image.py
new file mode 100755
index 0000000000..2c1afba398
--- /dev/null
+++ b/support/scripts/boot-qemu-image.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+
+# This script expect to run from the Buildroot top directory.
+
+import pexpect
+import sys
+import os
+
+
+def main():
+ if not (len(sys.argv) == 2):
+ print("Error: incorrect number of arguments")
+ print("""Usage: boot-qemu-image.py <qemu_arch_defconfig>""")
+ sys.exit(1)
+
+ # Ignore non Qemu defconfig
+ if not sys.argv[1].startswith('qemu_'):
+ sys.exit(0)
+
+ qemu_start = os.path.join(os.getcwd(), 'output/images/start-qemu.sh')
+
+ child = pexpect.spawn(qemu_start, ['serial-only'],
+ timeout=5, encoding='utf-8',
+ env={"QEMU_AUDIO_DRV": "none"})
+
+ # We want only stdout into the log to avoid double echo
+ child.logfile = sys.stdout
+
+ try:
+ child.expect(["buildroot login:", pexpect.TIMEOUT], timeout=60)
+ except pexpect.EOF as e:
+ # Some emulations require a fork of qemu-system, which may be
+ # missing on the system, and is not provided by Buildroot.
+ # In this case, spawn above will succeed at starting the wrapper
+ # start-qemu.sh, but that one will fail (exit with 127) in such
+ # a situation.
+ exit = [int(l.split(' ')[1])
+ for l in e.value.splitlines()
+ if l.startswith('exitstatus: ')]
+ if len(exit) and exit[0] == 127:
+ print('qemu-start.sh could not find the qemu binary')
+ sys.exit(0)
+ print("Connection problem, exiting.")
+ sys.exit(1)
+ except pexpect.TIMEOUT:
+ print("System did not boot in time, exiting.")
+ sys.exit(1)
+
+ child.sendline("root\r")
+
+ try:
+ child.expect(["# ", pexpect.TIMEOUT], timeout=60)
+ except pexpect.EOF:
+ print("Cannot connect to shell")
+ sys.exit(1)
+ except pexpect.TIMEOUT:
+ print("Timeout while waiting for shell")
+ sys.exit(1)
+
+ child.sendline("poweroff\r")
+
+ try:
+ child.expect(["System halted", pexpect.TIMEOUT], timeout=60)
+ child.expect(pexpect.EOF)
+ except pexpect.EOF:
+ pass
+ except pexpect.TIMEOUT:
+ # Qemu may not exit properly after "System halted", ignore.
+ print("Cannot halt machine")
+
+ sys.exit(0)
+
+
+if __name__ == "__main__":
+ main()