|
@@ -10,103 +10,12 @@
|
|
|
|
|
|
import os
|
|
|
|
|
|
-from avocado_qemu import Test, BUILD_DIR
|
|
|
+from avocado_qemu import LinuxTest, BUILD_DIR
|
|
|
|
|
|
-from qemu.accel import kvm_available
|
|
|
-from qemu.accel import tcg_available
|
|
|
-
|
|
|
-from avocado.utils import cloudinit
|
|
|
-from avocado.utils import network
|
|
|
-from avocado.utils import vmimage
|
|
|
-from avocado.utils import datadrainer
|
|
|
-from avocado.utils.path import find_command
|
|
|
from avocado import skipIf
|
|
|
|
|
|
-ACCEL_NOT_AVAILABLE_FMT = "%s accelerator does not seem to be available"
|
|
|
-KVM_NOT_AVAILABLE = ACCEL_NOT_AVAILABLE_FMT % "KVM"
|
|
|
-TCG_NOT_AVAILABLE = ACCEL_NOT_AVAILABLE_FMT % "TCG"
|
|
|
-
|
|
|
-
|
|
|
-class BootLinuxBase(Test):
|
|
|
- def download_boot(self):
|
|
|
- self.log.debug('Looking for and selecting a qemu-img binary to be '
|
|
|
- 'used to create the bootable snapshot image')
|
|
|
- # If qemu-img has been built, use it, otherwise the system wide one
|
|
|
- # will be used. If none is available, the test will cancel.
|
|
|
- qemu_img = os.path.join(BUILD_DIR, 'qemu-img')
|
|
|
- if not os.path.exists(qemu_img):
|
|
|
- qemu_img = find_command('qemu-img', False)
|
|
|
- if qemu_img is False:
|
|
|
- self.cancel('Could not find "qemu-img", which is required to '
|
|
|
- 'create the bootable image')
|
|
|
- vmimage.QEMU_IMG = qemu_img
|
|
|
-
|
|
|
- self.log.info('Downloading/preparing boot image')
|
|
|
- # Fedora 31 only provides ppc64le images
|
|
|
- image_arch = self.arch
|
|
|
- if image_arch == 'ppc64':
|
|
|
- image_arch = 'ppc64le'
|
|
|
- try:
|
|
|
- boot = vmimage.get(
|
|
|
- 'fedora', arch=image_arch, version='31',
|
|
|
- checksum=self.chksum,
|
|
|
- algorithm='sha256',
|
|
|
- cache_dir=self.cache_dirs[0],
|
|
|
- snapshot_dir=self.workdir)
|
|
|
- except:
|
|
|
- self.cancel('Failed to download/prepare boot image')
|
|
|
- return boot.path
|
|
|
-
|
|
|
- def prepare_cloudinit(self, ssh_pubkey=None):
|
|
|
- self.log.info('Preparing cloudinit image')
|
|
|
- try:
|
|
|
- cloudinit_iso = os.path.join(self.workdir, 'cloudinit.iso')
|
|
|
- self.phone_home_port = network.find_free_port()
|
|
|
- cloudinit.iso(cloudinit_iso, self.name,
|
|
|
- username='root',
|
|
|
- password='password',
|
|
|
- # QEMU's hard coded usermode router address
|
|
|
- phone_home_host='10.0.2.2',
|
|
|
- phone_home_port=self.phone_home_port,
|
|
|
- authorized_key=ssh_pubkey)
|
|
|
- except Exception:
|
|
|
- self.cancel('Failed to prepare the cloudinit image')
|
|
|
- return cloudinit_iso
|
|
|
-
|
|
|
-class BootLinux(BootLinuxBase):
|
|
|
- """
|
|
|
- Boots a Linux system, checking for a successful initialization
|
|
|
- """
|
|
|
-
|
|
|
- timeout = 900
|
|
|
- chksum = None
|
|
|
-
|
|
|
- def setUp(self, ssh_pubkey=None):
|
|
|
- super(BootLinux, self).setUp()
|
|
|
- self.vm.add_args('-smp', '2')
|
|
|
- self.vm.add_args('-m', '1024')
|
|
|
- self.set_up_boot()
|
|
|
- self.set_up_cloudinit(ssh_pubkey)
|
|
|
-
|
|
|
- def set_up_boot(self):
|
|
|
- path = self.download_boot()
|
|
|
- self.vm.add_args('-drive', 'file=%s' % path)
|
|
|
-
|
|
|
- def set_up_cloudinit(self, ssh_pubkey=None):
|
|
|
- cloudinit_iso = self.prepare_cloudinit(ssh_pubkey)
|
|
|
- self.vm.add_args('-drive', 'file=%s,format=raw' % cloudinit_iso)
|
|
|
-
|
|
|
- def launch_and_wait(self):
|
|
|
- self.vm.set_console()
|
|
|
- self.vm.launch()
|
|
|
- console_drainer = datadrainer.LineLogger(self.vm.console_socket.fileno(),
|
|
|
- logger=self.log.getChild('console'))
|
|
|
- console_drainer.start()
|
|
|
- self.log.info('VM launched, waiting for boot confirmation from guest')
|
|
|
- cloudinit.wait_for_phone_home(('0.0.0.0', self.phone_home_port), self.name)
|
|
|
-
|
|
|
|
|
|
-class BootLinuxX8664(BootLinux):
|
|
|
+class BootLinuxX8664(LinuxTest):
|
|
|
"""
|
|
|
:avocado: tags=arch:x86_64
|
|
|
"""
|
|
@@ -118,8 +27,7 @@ def test_pc_i440fx_tcg(self):
|
|
|
:avocado: tags=machine:pc
|
|
|
:avocado: tags=accel:tcg
|
|
|
"""
|
|
|
- if not tcg_available(self.qemu_bin):
|
|
|
- self.cancel(TCG_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("tcg")
|
|
|
self.vm.add_args("-accel", "tcg")
|
|
|
self.launch_and_wait()
|
|
|
|
|
@@ -128,8 +36,7 @@ def test_pc_i440fx_kvm(self):
|
|
|
:avocado: tags=machine:pc
|
|
|
:avocado: tags=accel:kvm
|
|
|
"""
|
|
|
- if not kvm_available(self.arch, self.qemu_bin):
|
|
|
- self.cancel(KVM_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("kvm")
|
|
|
self.vm.add_args("-accel", "kvm")
|
|
|
self.launch_and_wait()
|
|
|
|
|
@@ -138,8 +45,7 @@ def test_pc_q35_tcg(self):
|
|
|
:avocado: tags=machine:q35
|
|
|
:avocado: tags=accel:tcg
|
|
|
"""
|
|
|
- if not tcg_available(self.qemu_bin):
|
|
|
- self.cancel(TCG_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("tcg")
|
|
|
self.vm.add_args("-accel", "tcg")
|
|
|
self.launch_and_wait()
|
|
|
|
|
@@ -148,13 +54,12 @@ def test_pc_q35_kvm(self):
|
|
|
:avocado: tags=machine:q35
|
|
|
:avocado: tags=accel:kvm
|
|
|
"""
|
|
|
- if not kvm_available(self.arch, self.qemu_bin):
|
|
|
- self.cancel(KVM_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("kvm")
|
|
|
self.vm.add_args("-accel", "kvm")
|
|
|
self.launch_and_wait()
|
|
|
|
|
|
|
|
|
-class BootLinuxAarch64(BootLinux):
|
|
|
+class BootLinuxAarch64(LinuxTest):
|
|
|
"""
|
|
|
:avocado: tags=arch:aarch64
|
|
|
:avocado: tags=machine:virt
|
|
@@ -175,8 +80,7 @@ def test_virt_tcg(self):
|
|
|
:avocado: tags=accel:tcg
|
|
|
:avocado: tags=cpu:max
|
|
|
"""
|
|
|
- if not tcg_available(self.qemu_bin):
|
|
|
- self.cancel(TCG_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("tcg")
|
|
|
self.vm.add_args("-accel", "tcg")
|
|
|
self.vm.add_args("-cpu", "max")
|
|
|
self.vm.add_args("-machine", "virt,gic-version=2")
|
|
@@ -189,8 +93,7 @@ def test_virt_kvm_gicv2(self):
|
|
|
:avocado: tags=cpu:host
|
|
|
:avocado: tags=device:gicv2
|
|
|
"""
|
|
|
- if not kvm_available(self.arch, self.qemu_bin):
|
|
|
- self.cancel(KVM_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("kvm")
|
|
|
self.vm.add_args("-accel", "kvm")
|
|
|
self.vm.add_args("-cpu", "host")
|
|
|
self.vm.add_args("-machine", "virt,gic-version=2")
|
|
@@ -203,8 +106,7 @@ def test_virt_kvm_gicv3(self):
|
|
|
:avocado: tags=cpu:host
|
|
|
:avocado: tags=device:gicv3
|
|
|
"""
|
|
|
- if not kvm_available(self.arch, self.qemu_bin):
|
|
|
- self.cancel(KVM_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("kvm")
|
|
|
self.vm.add_args("-accel", "kvm")
|
|
|
self.vm.add_args("-cpu", "host")
|
|
|
self.vm.add_args("-machine", "virt,gic-version=3")
|
|
@@ -212,7 +114,7 @@ def test_virt_kvm_gicv3(self):
|
|
|
self.launch_and_wait()
|
|
|
|
|
|
|
|
|
-class BootLinuxPPC64(BootLinux):
|
|
|
+class BootLinuxPPC64(LinuxTest):
|
|
|
"""
|
|
|
:avocado: tags=arch:ppc64
|
|
|
"""
|
|
@@ -224,13 +126,12 @@ def test_pseries_tcg(self):
|
|
|
:avocado: tags=machine:pseries
|
|
|
:avocado: tags=accel:tcg
|
|
|
"""
|
|
|
- if not tcg_available(self.qemu_bin):
|
|
|
- self.cancel(TCG_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("tcg")
|
|
|
self.vm.add_args("-accel", "tcg")
|
|
|
self.launch_and_wait()
|
|
|
|
|
|
|
|
|
-class BootLinuxS390X(BootLinux):
|
|
|
+class BootLinuxS390X(LinuxTest):
|
|
|
"""
|
|
|
:avocado: tags=arch:s390x
|
|
|
"""
|
|
@@ -243,7 +144,6 @@ def test_s390_ccw_virtio_tcg(self):
|
|
|
:avocado: tags=machine:s390-ccw-virtio
|
|
|
:avocado: tags=accel:tcg
|
|
|
"""
|
|
|
- if not tcg_available(self.qemu_bin):
|
|
|
- self.cancel(TCG_NOT_AVAILABLE)
|
|
|
+ self.require_accelerator("tcg")
|
|
|
self.vm.add_args("-accel", "tcg")
|
|
|
self.launch_and_wait()
|