Message ID | 20180920171756.1009-1-crosa@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add "boot_linux" acceptance test | expand |
Hi Cleber, On Thu, Sep 20, 2018 at 6:18 PM Cleber Rosa <crosa@redhat.com> 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 <crosa@redhat.com> > --- > 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 <crosa@redhat.com> > +# > +# 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?
On 9/26/18 2:27 PM, Philippe Mathieu-Daudé wrote: > Hi Cleber, > > On Thu, Sep 20, 2018 at 6:18 PM Cleber Rosa <crosa@redhat.com> 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 <crosa@redhat.com> >> --- >> 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 <crosa@redhat.com> >> +# >> +# 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.
On 9/27/18 1:05 AM, Cleber Rosa wrote: > On 9/26/18 2:27 PM, Philippe Mathieu-Daudé wrote: >> Hi Cleber, >> >> On Thu, Sep 20, 2018 at 6:18 PM Cleber Rosa <crosa@redhat.com> 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 <crosa@redhat.com> >>> --- >>> 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 <crosa@redhat.com> >>> +# >>> +# 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". Shame on me, I applied this patch on top of your "venv-requirements" series, expecting it would contain: avocado-framework==65.0 pycdlib==1.6.0 but it indeed contains: avocado-framework==64.0 > 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. >
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 <crosa@redhat.com> +# +# 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)
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 <crosa@redhat.com> --- tests/acceptance/boot_linux.py | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/acceptance/boot_linux.py