1*8dcac1cfSThomas Huth#!/usr/bin/env python3 2*8dcac1cfSThomas Huth# 3bbbd9b6eSWillian Rampazzo# Linux initrd integration test. 482d4c923SWainer dos Santos Moschetta# 582d4c923SWainer dos Santos Moschetta# Copyright (c) 2018 Red Hat, Inc. 682d4c923SWainer dos Santos Moschetta# 782d4c923SWainer dos Santos Moschetta# Author: 882d4c923SWainer dos Santos Moschetta# Wainer dos Santos Moschetta <wainersm@redhat.com> 982d4c923SWainer dos Santos Moschetta# 1082d4c923SWainer dos Santos Moschetta# This work is licensed under the terms of the GNU GPL, version 2 or 1182d4c923SWainer dos Santos Moschetta# later. See the COPYING file in the top-level directory. 1282d4c923SWainer dos Santos Moschetta 133c1de3afSAlex Bennéeimport os 148f1c89ecSLi Zhijianimport logging 1582d4c923SWainer dos Santos Moschettaimport tempfile 1682d4c923SWainer dos Santos Moschetta 17*8dcac1cfSThomas Huthfrom qemu_test import QemuSystemTest, Asset 18*8dcac1cfSThomas Huthfrom unittest import skipUnless 1982d4c923SWainer dos Santos Moschetta 2082d4c923SWainer dos Santos Moschetta 212283b627SPhilippe Mathieu-Daudéclass LinuxInitrd(QemuSystemTest): 2282d4c923SWainer dos Santos Moschetta """ 2382d4c923SWainer dos Santos Moschetta Checks QEMU evaluates correctly the initrd file passed as -initrd option. 2482d4c923SWainer dos Santos Moschetta """ 2582d4c923SWainer dos Santos Moschetta 268f1c89ecSLi Zhijian timeout = 300 2782d4c923SWainer dos Santos Moschetta 28*8dcac1cfSThomas Huth ASSET_F18_KERNEL = Asset( 29*8dcac1cfSThomas Huth ('https://archives.fedoraproject.org/pub/archive/fedora/linux/' 30*8dcac1cfSThomas Huth 'releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz'), 31*8dcac1cfSThomas Huth '1a27cb42559ce29237ac186699d063556ad69c8349d732bb1bd8d614e5a8cc2e') 32*8dcac1cfSThomas Huth 33*8dcac1cfSThomas Huth ASSET_F28_KERNEL = Asset( 34*8dcac1cfSThomas Huth ('https://archives.fedoraproject.org/pub/archive/fedora/linux/' 35*8dcac1cfSThomas Huth 'releases/28/Everything/x86_64/os/images/pxeboot/vmlinuz'), 36*8dcac1cfSThomas Huth 'd05909c9d4a742a6fcc84dcc0361009e4611769619cc187a07107579a035f24e') 37*8dcac1cfSThomas Huth 383c7156fdSLi Zhijian def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self): 3982d4c923SWainer dos Santos Moschetta """ 4082d4c923SWainer dos Santos Moschetta Pretends to boot QEMU with an initrd file with size of 2GiB 4182d4c923SWainer dos Santos Moschetta and expect it exits with error message. 423c7156fdSLi Zhijian Fedora-18 shipped with linux-3.6 which have not supported xloadflags 433c7156fdSLi Zhijian cannot support more than 2GiB initrd. 4482d4c923SWainer dos Santos Moschetta """ 45*8dcac1cfSThomas Huth self.set_machine('pc') 46*8dcac1cfSThomas Huth kernel_path = self.ASSET_F18_KERNEL.fetch() 4782d4c923SWainer dos Santos Moschetta max_size = 2 * (1024 ** 3) - 1 4882d4c923SWainer dos Santos Moschetta 4982d4c923SWainer dos Santos Moschetta with tempfile.NamedTemporaryFile() as initrd: 5082d4c923SWainer dos Santos Moschetta initrd.seek(max_size) 5182d4c923SWainer dos Santos Moschetta initrd.write(b'\0') 5282d4c923SWainer dos Santos Moschetta initrd.flush() 53c80c6bebSWainer dos Santos Moschetta self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name, 54c80c6bebSWainer dos Santos Moschetta '-m', '4096') 55c80c6bebSWainer dos Santos Moschetta self.vm.set_qmp_monitor(enabled=False) 56c80c6bebSWainer dos Santos Moschetta self.vm.launch() 57c80c6bebSWainer dos Santos Moschetta self.vm.wait() 58c80c6bebSWainer dos Santos Moschetta self.assertEqual(self.vm.exitcode(), 1) 5982d4c923SWainer dos Santos Moschetta expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % ( 6082d4c923SWainer dos Santos Moschetta max_size + 1) 61c80c6bebSWainer dos Santos Moschetta self.assertRegex(self.vm.get_log(), expected_msg) 628f1c89ecSLi Zhijian 639b45cc99SAlex Bennée @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab') 648f1c89ecSLi Zhijian def test_with_2gib_file_should_work_with_linux_v4_16(self): 658f1c89ecSLi Zhijian """ 668f1c89ecSLi Zhijian QEMU has supported up to 4 GiB initrd for recent kernel 678f1c89ecSLi Zhijian Expect guest can reach 'Unpacking initramfs...' 688f1c89ecSLi Zhijian """ 69*8dcac1cfSThomas Huth self.set_machine('pc') 70*8dcac1cfSThomas Huth kernel_path = self.ASSET_F28_KERNEL.fetch() 718f1c89ecSLi Zhijian max_size = 2 * (1024 ** 3) + 1 728f1c89ecSLi Zhijian 738f1c89ecSLi Zhijian with tempfile.NamedTemporaryFile() as initrd: 748f1c89ecSLi Zhijian initrd.seek(max_size) 758f1c89ecSLi Zhijian initrd.write(b'\0') 768f1c89ecSLi Zhijian initrd.flush() 778f1c89ecSLi Zhijian 788f1c89ecSLi Zhijian self.vm.set_console() 798f1c89ecSLi Zhijian kernel_command_line = 'console=ttyS0' 808f1c89ecSLi Zhijian self.vm.add_args('-kernel', kernel_path, 818f1c89ecSLi Zhijian '-append', kernel_command_line, 828f1c89ecSLi Zhijian '-initrd', initrd.name, 838f1c89ecSLi Zhijian '-m', '5120') 848f1c89ecSLi Zhijian self.vm.launch() 858f1c89ecSLi Zhijian console = self.vm.console_socket.makefile() 868f1c89ecSLi Zhijian console_logger = logging.getLogger('console') 878f1c89ecSLi Zhijian while True: 888f1c89ecSLi Zhijian msg = console.readline() 898f1c89ecSLi Zhijian console_logger.debug(msg.strip()) 908f1c89ecSLi Zhijian if 'Unpacking initramfs...' in msg: 918f1c89ecSLi Zhijian break 928f1c89ecSLi Zhijian if 'Kernel panic - not syncing' in msg: 938f1c89ecSLi Zhijian self.fail("Kernel panic reached") 94*8dcac1cfSThomas Huth 95*8dcac1cfSThomas Huthif __name__ == '__main__': 96*8dcac1cfSThomas Huth QemuSystemTest.main() 97