qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Add "boot_linux" acceptance test


From: Cleber Rosa
Subject: Re: [Qemu-devel] [PATCH] Add "boot_linux" acceptance test
Date: Wed, 26 Sep 2018 19:05:08 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0


On 9/26/18 2:27 PM, Philippe Mathieu-Daudé wrote:
> Hi Cleber,
> 
> On Thu, Sep 20, 2018 at 6:18 PM Cleber Rosa <address@hidden> wrote:
>>
>> This acceptance test, validates that a full blown Linux guest can
>> successfully boot in QEMU.  In this specific case, the guest
>> chosen is Fedora version 28.  By passing parameters, the same
>> test can attempt to boot different distros, arches, etc.
>>
>> The method for checking the successfull boot is based on "cloudinit"
>> and its "phone home" feature.  The guest is given an ISO image
>> with the location of the phone home server, and the information to
>> post (the instance ID).  Upon receiving the correct information,
>> from the guest, the test is considered to have PASSed.
>>
>> This test is currently limited to user mode networking only, and
>> instructs the guest to connect to the "router" address that is hard
>> coded in QEMU.
>>
>> This test requires features present in Avocado version 64.0, and when
>> running under Python 3, requires a fix to the avocado.utils.vmimage
>> library (to be included in version 65.0).  To create the cloudinit ISO
>> image that will be used to configure the guest, the pycdlib library is
>> also required.  The idea for a effortless execution of this test, is
>> to set those requirements, that is:
>>
>>    avocado-framework==65.0
>>    pycdlib==1.6.0
>>
>> In the "tests/venv-requirements.txt" file introduced in another patch
>> series.
>>
>> Reference: 
>> https://lists.gnu.org/archive/html/qemu-devel/2018-09/msg02503.html
>> Reference: 
>> https://github.com/avocado-framework/avocado/commit/02c47b1eade667d18fb0adef3293d86a6b5fd2e9
>> Signed-off-by: Cleber Rosa <address@hidden>
>> ---
>>  tests/acceptance/boot_linux.py | 52 ++++++++++++++++++++++++++++++++++
>>  1 file changed, 52 insertions(+)
>>  create mode 100644 tests/acceptance/boot_linux.py
>>
>> diff --git a/tests/acceptance/boot_linux.py b/tests/acceptance/boot_linux.py
>> new file mode 100644
>> index 0000000000..658211f15f
>> --- /dev/null
>> +++ b/tests/acceptance/boot_linux.py
>> @@ -0,0 +1,52 @@
>> +# Functional test that boots a complete Linux system via a cloud image
>> +#
>> +# Copyright (c) 2018 Red Hat, Inc.
>> +#
>> +# Author:
>> +#  Cleber Rosa <address@hidden>
>> +#
>> +# This work is licensed under the terms of the GNU GPL, version 2 or
>> +# later.  See the COPYING file in the top-level directory.
>> +
>> +import os
>> +
>> +from avocado_qemu import Test
>> +
>> +from avocado.utils import cloudinit
>> +from avocado.utils import network
>> +from avocado.utils import vmimage
>> +
>> +
>> +class BootLinux(Test):
>> +    """
>> +    Boots a Linux system, checking for a successful initialization
>> +
>> +    :avocado: enable
>> +    """
>> +
>> +    timeout = 600
>> +
>> +    def test(self):
>> +        self.vm.set_machine(self.params.get('machine', default='pc'))
>> +        self.vm.add_args('-accel', self.params.get('accel', default='kvm'))
>> +        self.vm.add_args('-smp', self.params.get('smp', default='2'))
>> +        self.vm.add_args('-m', self.params.get('memory', default='4096'))
>> +
>> +        arch = self.params.get('arch', default=os.uname()[4])
>> +        distro = self.params.get('distro', default='fedora')
>> +        version = self.params.get('version', default='28')
>> +        boot = vmimage.get(distro, arch=arch, version=version,
>> +                           cache_dir=self.cache_dirs[0],
>> +                           snapshot_dir=self.workdir)
>> +        self.vm.add_args('-drive', 'file=%s' % boot.path)
>> +
>> +        cloudinit_iso = os.path.join(self.workdir, 'cloudinit.iso')
>> +        phone_home_port = network.find_free_port()
>> +        cloudinit.iso(cloudinit_iso, self.name,
>> +                      # QEMU's hard coded usermode router address
>> +                      phone_home_host='10.0.2.2',
>> +                      phone_home_port=phone_home_port)
>> +        self.vm.add_args('-drive', 'file=%s' % cloudinit_iso)
>> +
>> +        self.vm.launch()
>> +        cloudinit.wait_for_phone_home(('0.0.0.0', phone_home_port), 
>> self.name)
>> --
>> 2.17.1
>>
> 
> Using:
> 
> (venv) $ avocado run tests/acceptance
> 
> I'm getting:
> 
> DEBUG| DATA (filename=output.expected) => NOT FOUND (data sources:
> variant, test, file)
> DEBUG| PARAMS (key=qemu_bin, path=*,
> default=x86_64-softmmu/qemu-system-x86_64) =>
> 'x86_64-softmmu/qemu-system-x86_64'
> DEBUG| PARAMS (key=machine, path=*, default=pc) => 'pc'
> DEBUG| PARAMS (key=accel, path=*, default=kvm) => 'kvm'
> DEBUG| PARAMS (key=smp, path=*, default=2) => '2'
> DEBUG| PARAMS (key=memory, path=*, default=4096) => '4096'
> DEBUG| PARAMS (key=arch, path=*, default=x86_64) => 'x86_64'
> DEBUG| PARAMS (key=distro, path=*, default=fedora) => 'fedora'
> DEBUG| PARAMS (key=version, path=*, default=28) => '28'
> ERROR|
> ERROR| Reproduced traceback from:
> /build/tests/venv/lib64/python3.6/site-packages/avocado/core/test.py:831
> ERROR| Traceback (most recent call last):
> ERROR|   File "/home/philmd/source/qemu/tests/acceptance/boot_linux.py",
> line 40, in test
> ERROR|     snapshot_dir=self.workdir)
> ERROR|   File 
> "/build/tests/venv/lib64/python3.6/site-packages/avocado/utils/vmimage.py",
> line 371, in get
> ERROR|     url=cls.get_image_url(),
> ERROR|   File 
> "/build/tests/venv/lib64/python3.6/site-packages/avocado/utils/vmimage.py",
> line 144, in get_image_url
> ERROR|     if int(self.version) >= 28:
> ERROR|   File 
> "/build/tests/venv/lib64/python3.6/site-packages/avocado/utils/vmimage.py",
> line 81, in version
> ERROR|     return self._best_version or self.get_version()
> ERROR|   File 
> "/build/tests/venv/lib64/python3.6/site-packages/avocado/utils/vmimage.py",
> line 90, in get_version
> ERROR|     parser.feed(urlopen(self.url_versions).read())
> ERROR|   File "/usr/lib64/python3.6/html/parser.py", line 110, in feed
> ERROR|     self.rawdata = self.rawdata + data
> ERROR| TypeError: must be str, not bytes
> 
> Any hint?
> 

Yep, this is the bug I meant in the commit message:

"when running under Python 3, requires a fix to the avocado.utils.vmimage".

Right now, your best bet to run this test is the latest Avocado master,
or 64.0 on Python 2.

We should be releasing 65.0 next Monday (Oct 1st) so thing will be
smooth for this test.

Thanks for trying it out!

- Cleber.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]