diff mbox series

Add "boot_linux" acceptance test

Message ID 20180920171756.1009-1-crosa@redhat.com (mailing list archive)
State New, archived
Headers show
Series Add "boot_linux" acceptance test | expand

Commit Message

Cleber Rosa Sept. 20, 2018, 5:17 p.m. UTC
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

Comments

Philippe Mathieu-Daudé Sept. 26, 2018, 6:27 p.m. UTC | #1
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?
Cleber Rosa Sept. 26, 2018, 11:05 p.m. UTC | #2
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.
Philippe Mathieu-Daudé Sept. 26, 2018, 11:41 p.m. UTC | #3
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 mbox series

Patch

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)