tests: Stop mocking 'nova.virt.libvirt.utils.get_arch'

In change I03febf6ad7d76c7eec818d3b16a3ef8b26dcd84c we introduced a mock
of nova.virt.libvirt.utils.get_arch' to the 'FakeLibvirtFixture'. This
was a follow-up to change Icf55488e61793d5b055d230c8524df8210cd00fd
which introduced this mock for many individual libvirt-related tests. In
change I458b1db091e33c0b835e44b5a86de6c0a08f99a3, we decided to poison
'os.uname' rather than 'get_arch' since that was the underlying cause of
test differences, but we never extended this reasoning to the existing
mocks of 'get_arch'. The mocking of 'get_arch' is now a hindrance to any
test that wants to validate behavior where the architecture requested
via image metadata (the 'hw_architecture' property) differs from the
host architecture, so it is time to make this switch and stop mocking
'get_arch' (almost) entirely.

Change-Id: Iff5ca9f4a51fe30435e57f0a9ca3d43a2065978c
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane 2021-03-05 09:56:21 +00:00
parent c8a6f8d2e5
commit a65e4201cc
3 changed files with 94 additions and 68 deletions

View File

@ -12,6 +12,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import collections
import sys
import textwrap
import time
@ -229,6 +230,10 @@ PGPU1_PCI_ADDR = 'pci_0000_81_00_0'
PGPU2_PCI_ADDR = 'pci_0000_81_01_0'
PGPU3_PCI_ADDR = 'pci_0000_81_02_0'
os_uname = collections.namedtuple(
'uname_result', ['sysname', 'nodename', 'release', 'version', 'machine'],
)
class FakePCIDevice(object):
"""Generate a fake PCI device.
@ -1931,9 +1936,10 @@ class FakeLibvirtFixture(fixtures.Fixture):
'nova.virt.libvirt.host.Host._log_host_capabilities'))
# Ensure tests perform the same on all host architectures
self.useFixture(fixtures.MockPatch(
'nova.virt.libvirt.utils.get_arch',
return_value=obj_fields.Architecture.X86_64))
fake_uname = os_uname(
'Linux', '', '5.4.0-0-generic', '', obj_fields.Architecture.X86_64)
self.useFixture(
fixtures.MockPatch('os.uname', return_value=fake_uname))
disable_event_thread(self)

View File

@ -14,9 +14,7 @@
# under the License.
import binascii
from collections import defaultdict
from collections import deque
from collections import OrderedDict
import collections
import contextlib
import copy
import datetime
@ -123,7 +121,6 @@ from nova.virt.libvirt import vif as libvirt_vif
from nova.virt.libvirt.volume import fs as fs_drivers
from nova.virt.libvirt.volume import volume as volume_drivers
CONF = nova.conf.CONF
_fake_network_info = fake_network.fake_get_instance_nw_info
@ -391,7 +388,7 @@ _fake_NodeDevXml_parents = {
for name, xml in _fake_NodeDevXml.items()
}
_fake_NodeDevXml_children = defaultdict(list)
_fake_NodeDevXml_children = collections.defaultdict(list)
for key, val in _fake_NodeDevXml_parents.items():
_fake_NodeDevXml_children[val].append(key)
@ -570,14 +567,14 @@ def fake_disk_info_byname(instance, type='qcow2'):
:param instance: The instance we're generating fake disk_info for.
:param type: libvirt's disk type.
:return: disk_info
:rtype: OrderedDict
:rtype: collections.OrderedDict
"""
instance_dir = os.path.join(CONF.instances_path, instance.uuid)
def instance_path(name):
return os.path.join(instance_dir, name)
disk_info = OrderedDict()
disk_info = collections.OrderedDict()
# root disk
if (instance.image_ref is not None and
@ -1007,11 +1004,13 @@ class LibvirtConnTestCase(test.NoDBTestCase,
self.useFixture(fakelibvirt.FakeLibvirtFixture())
# ensure tests perform the same on all host architectures
_p = mock.patch(
'nova.virt.libvirt.utils.get_arch',
return_value=fields.Architecture.X86_64)
self.mock_get_arch = _p.start()
# ensure tests perform the same on all host architectures; this is
# already done by the fakelibvirt fixture but we want to change the
# architecture in some tests
_p = mock.patch('os.uname')
self.mock_uname = _p.start()
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.X86_64)
self.addCleanup(_p.stop)
self.test_instance = _create_test_instance()
@ -1407,14 +1406,16 @@ class LibvirtConnTestCase(test.NoDBTestCase,
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_register_instance_machine_type', new=mock.Mock())
def test_min_version_ppc_ok(self):
self.mock_get_arch.return_value = fields.Architecture.PPC64
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.PPC64)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
drvr.init_host("dummyhost")
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_register_instance_machine_type', new=mock.Mock())
def test_min_version_s390_ok(self):
self.mock_get_arch.return_value = fields.Architecture.S390X
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.S390X)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
drvr.init_host("dummyhost")
@ -3465,7 +3466,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
domain_caps = vconfig.LibvirtConfigDomainCaps()
domain_caps._features = vconfig.LibvirtConfigDomainCapsFeatures()
domain_caps._features.features = [sev_feature]
fake_domain_caps.return_value = defaultdict(
fake_domain_caps.return_value = collections.defaultdict(
dict, {'x86_64': {'q35': domain_caps}})
@mock.patch.object(host.Host, 'get_domain_capabilities')
@ -4909,7 +4910,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
}
for guestarch, expect_hpet in hpet_map.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
cfg = drvr._get_guest_config(
instance_ref, [], image_meta, disk_info)
@ -4953,7 +4955,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
}
for guestarch, expect_hpet in hpet_map.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
cfg = drvr._get_guest_config(
instance_ref, [], image_meta, disk_info)
@ -4998,7 +5001,9 @@ class LibvirtConnTestCase(test.NoDBTestCase,
}
for guestarch, expect_hpet in hpet_map.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
cfg = drvr._get_guest_config(
instance_ref, [], image_meta, disk_info)
self.assertIsInstance(
@ -5041,7 +5046,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
}
for guestarch, expect_hpet in hpet_map.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
cfg = drvr._get_guest_config(
instance_ref, [], image_meta, disk_info)
@ -5068,7 +5074,9 @@ class LibvirtConnTestCase(test.NoDBTestCase,
self.assertEqual(2, len(cfg.clock.timers))
def test_get_guest_config_windows_timer(self):
self.mock_get_arch.return_value = fields.Architecture.I686
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.I686)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
instance_ref = objects.Instance(**self.test_instance)
instance_ref['os_type'] = 'windows'
@ -5406,7 +5414,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
fields.Architecture.AARCH64: 'sda',
}
for guestarch, disk in disk_map.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
disk_info = blockinfo.get_disk_info(
CONF.libvirt.virt_type, instance_ref, image_meta)
@ -5782,7 +5791,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
fields.Architecture.AARCH64: 'virtio',
}
for guestarch, video_type in video_map.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
cfg = self._get_guest_config_with_graphics()
@ -5830,9 +5840,10 @@ class LibvirtConnTestCase(test.NoDBTestCase,
fields.Architecture.S390X: vconfig.LibvirtConfigGuestConsole}
for guest_arch, device_type in expected.items():
self.mock_get_arch.return_value = guest_arch
guest = vconfig.LibvirtConfigGuest()
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guest_arch)
guest = vconfig.LibvirtConfigGuest()
drvr._create_consoles(virt_type="kvm", guest_cfg=guest,
instance=instance, flavor={},
image_meta={})
@ -5852,33 +5863,36 @@ class LibvirtConnTestCase(test.NoDBTestCase,
self.flags(enabled=True, group='serial_console')
self.flags(virt_type="qemu", group='libvirt')
flavor = 'fake_flavor'
image_meta = objects.ImageMeta()
image_meta = objects.ImageMeta.from_dict({})
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
guest = vconfig.LibvirtConfigGuest()
instance = objects.Instance(**self.test_instance)
self.mock_get_arch.return_value = fields.Architecture.X86_64
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.X86_64)
self.assertRaises(
exception.SerialPortNumberLimitExceeded,
drvr._create_consoles,
"kvm", guest, instance, flavor, image_meta)
self.mock_get_arch.assert_called_with(image_meta)
self.mock_uname.assert_called_once()
mock_get_port_number.assert_called_with(flavor, image_meta)
self.mock_get_arch.reset_mock()
self.mock_uname.reset_mock()
mock_get_port_number.reset_mock()
self.mock_get_arch.return_value = fields.Architecture.S390
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.S390)
drvr._create_consoles("kvm", guest, instance, flavor, image_meta)
self.mock_get_arch.assert_called_with(image_meta)
self.mock_uname.assert_called_once()
mock_get_port_number.assert_called_with(flavor, image_meta)
self.mock_get_arch.reset_mock()
self.mock_uname.reset_mock()
mock_get_port_number.reset_mock()
self.mock_get_arch.return_value = fields.Architecture.S390X
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.S390X)
drvr._create_consoles("kvm", guest, instance, flavor, image_meta)
self.mock_get_arch.assert_called_with(image_meta)
self.mock_uname.assert_called_once()
mock_get_port_number.assert_called_with(flavor, image_meta)
@mock.patch('nova.console.serial.acquire_port')
@ -6038,9 +6052,10 @@ class LibvirtConnTestCase(test.NoDBTestCase,
def _test_consoles(arch_to_mock, serial_enabled,
expected_device_type, expected_device_cls,
virt_type='qemu'):
guest_cfg = vconfig.LibvirtConfigGuest()
self.mock_get_arch.return_value = arch_to_mock
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', arch_to_mock)
self.flags(enabled=serial_enabled, group='serial_console')
guest_cfg = vconfig.LibvirtConfigGuest()
instance = objects.Instance(**self.test_instance)
drvr._create_consoles(virt_type, guest_cfg, instance=instance,
@ -6218,7 +6233,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
def test_get_guest_config_with_type_kvm_on_s390(self):
self.flags(enabled=False, group='vnc')
self.flags(virt_type='kvm', group='libvirt')
self.mock_get_arch.return_value = fields.Architecture.S390X
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.S390X)
self._stub_host_capabilities_cpu_arch(fields.Architecture.S390X)
@ -7581,7 +7597,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
return caps
self.flags(virt_type="kvm", group="libvirt")
self.mock_get_arch.return_value = fields.Architecture.ARMV7
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.ARMV7)
instance_ref = objects.Instance(**self.test_instance)
image_meta = objects.ImageMeta.from_dict(self.test_image_meta)
@ -7623,7 +7640,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
self.flags(virt_type="kvm",
group="libvirt")
self.mock_get_arch.return_value = fields.Architecture.AARCH64
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.AARCH64)
instance_ref = objects.Instance(**self.test_instance)
image_meta = objects.ImageMeta.from_dict(self.test_image_meta)
@ -7674,7 +7692,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
caps.host.cpu = cpu
return caps
self.mock_get_arch.return_value = fields.Architecture.AARCH64
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.AARCH64)
self.stub_out('nova.virt.libvirt.host.Host.get_capabilities',
get_host_capabilities_stub)
self.flags(enabled=True, server_listen='10.0.0.1', group='vnc')
@ -7844,7 +7863,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
image_meta = objects.ImageMeta.from_dict(self.test_image_meta)
expected = (fields.Architecture.PPC64, fields.Architecture.PPC)
for guestarch in expected:
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
cfg = drvr._get_guest_config(
instance_ref, [], image_meta, disk_info)
@ -8588,7 +8608,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
self.fail('Did not find a USB host controller')
# while PPC64 should always get a USB controller, regardless of config
self.mock_get_arch.return_value = fields.Architecture.PPC64
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', fields.Architecture.PPC64)
image_meta = objects.ImageMeta.from_dict(self.test_image_meta)
disk_info = blockinfo.get_disk_info(
CONF.libvirt.virt_type, instance_ref, image_meta)
@ -8704,7 +8725,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
}
for guestarch, expected_disk in expected.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
image_meta = objects.ImageMeta.from_dict({"disk_format": "iso"})
self._check_xml_and_disk_bus(image_meta, None, (expected_disk,))
@ -8747,7 +8769,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
"disk_format": "iso"})
for guestarch, expected_disk in expected.items():
self.mock_get_arch.return_value = guestarch
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.4.0-0-generic', '', guestarch)
self._check_xml_and_disk_bus(
image_meta,
@ -9278,9 +9301,11 @@ class LibvirtConnTestCase(test.NoDBTestCase,
{'mountpoint': u'/dev/vdb',
'attachment_id': u'd6128a7b-19c8-4a3e-8036-011396df95ac'})])
mock_volume_get.return_value = (
{'attachments': OrderedDict(attachments), 'multiattach': True,
'id': 'd30559cf-f092-4693-8589-0d0a1e7d9b1f'})
mock_volume_get.return_value = {
'attachments': collections.OrderedDict(attachments),
'multiattach': True,
'id': 'd30559cf-f092-4693-8589-0d0a1e7d9b1f',
}
fake_connection_info = {
'multiattach': True,
@ -9317,9 +9342,11 @@ class LibvirtConnTestCase(test.NoDBTestCase,
{'mountpoint': u'/dev/vdb',
'attachment_id': u'd6128a7b-19c8-4a3e-8036-011396df95ac'})])
mock_volume_get.return_value = (
{'attachments': OrderedDict(attachments), 'multiattach': True,
'id': 'd30559cf-f092-4693-8589-0d0a1e7d9b1f'})
mock_volume_get.return_value = {
'attachments': collections.OrderedDict(attachments),
'multiattach': True,
'id': 'd30559cf-f092-4693-8589-0d0a1e7d9b1f',
}
fake_connection_info = {
'multiattach': True,
@ -12697,7 +12724,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
expected_switch=False):
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
instance = objects.Instance(**self.test_instance)
drvr.active_migrations[instance.uuid] = deque()
drvr.active_migrations[instance.uuid] = collections.deque()
dom = fakelibvirt.Domain(drvr._get_connection(), "<domain/>", True)
guest = libvirt_guest.Guest(dom)
finish_event = eventlet.event.Event()
@ -19915,7 +19942,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
instance = fake_instance.fake_instance_obj(
None, name='instancename', id=1,
uuid='c83a75d4-4d53-4be5-9a40-04d9c0389ff8')
drvr.active_migrations[instance.uuid] = deque()
drvr.active_migrations[instance.uuid] = collections.deque()
drvr.live_migration_force_complete(instance)
self.assertEqual(
1, drvr.active_migrations[instance.uuid].count("force-complete"))

View File

@ -12,8 +12,6 @@
# License for the specific language governing permissions and limitations
# under the License.
import collections
import fixtures
from lxml import etree
import mock
@ -38,11 +36,6 @@ from nova.virt.libvirt import vif
CONF = cfg.CONF
os_uname = collections.namedtuple(
'uname_result', ['sysname', 'nodename', 'release', 'version', 'machine'],
)
class LibvirtVifTestCase(test.NoDBTestCase):
gateway_bridge_4 = network_model.IP(address='101.168.1.1', type='gateway')
@ -514,7 +507,7 @@ class LibvirtVifTestCase(test.NoDBTestCase):
# multiqueue configuration is host OS specific
_a = mock.patch('os.uname')
self.mock_uname = _a.start()
self.mock_uname.return_value = os_uname(
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '5.10.13-200-generic', '', 'x86_64')
self.addCleanup(_a.stop)
@ -653,34 +646,34 @@ class LibvirtVifTestCase(test.NoDBTestCase):
self._test_virtio_multiqueue(4, '4')
def test_virtio_multiqueue_in_kernel_2(self):
self.mock_uname.return_value = os_uname(
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '2.6.32-21-generic', '', '')
self._test_virtio_multiqueue(10, '1')
def test_virtio_multiqueue_in_kernel_3(self):
self.mock_uname.return_value = os_uname(
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '3.19.0-47-generic', '', '')
self._test_virtio_multiqueue(10, '8')
def test_virtio_multiqueue_in_kernel_4(self):
self.mock_uname.return_value = os_uname(
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '4.2.0-35-generic', '', '')
self._test_virtio_multiqueue(10, '10')
def test_virtio_multiqueue_in_kernel_2_max_queues(self):
self.mock_uname.return_value = os_uname(
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '2.6.32-21-generic', '', '')
self.flags(max_queues=2, group='libvirt')
self._test_virtio_multiqueue(10, '2')
def test_virtio_multiqueue_in_kernel_3_max_queues(self):
self.mock_uname.return_value = os_uname(
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '3.19.0-47-generic', '', '')
self.flags(max_queues=2, group='libvirt')
self._test_virtio_multiqueue(10, '2')
def test_virtio_multiqueue_in_kernel_4_max_queues(self):
self.mock_uname.return_value = os_uname(
self.mock_uname.return_value = fakelibvirt.os_uname(
'Linux', '', '4.2.0-35-generic', '', '')
self.flags(max_queues=2, group='libvirt')
self._test_virtio_multiqueue(10, '2')