Bump MIN_{LIBVIRT,QEMU} for "Epoxy"

The minimum required version of QEMU is now 6.2.0, and of libvirt is
8.0.0.

Minimum cleanup to make the tests happy.
Adjust the related unit tests accordingly.

Following patch will clean all constants not useful anymore.

Change-Id: I381a6c180494ed7b6ae47853132673f153733587
This commit is contained in:
René Ribaud
2025-02-26 21:05:38 +01:00
parent 8f57fa7359
commit f7d99623ed
9 changed files with 55 additions and 235 deletions

View File

@@ -211,6 +211,12 @@ support the decided libvirt version.
- 8.0.0
- 5.2.0
- 6.2.0
* - 2025.1 Epoxy
- 31.0.0
- 8.0.0
- 10.0.0
- 6.2.0
- 8.2.2
OS distribution versions
@@ -244,10 +250,10 @@ important OS distros.
- 5.2.0-16
- 1.44.0-2
* - 9
- As of 2021-11-18.
- 7.8.0-1
- 6.1.0-6
- 1.46.0-4
- As of 2025-02-27.
- 10.10.0
- 9.1.0
- 1.50.1
* - **Debian**
-
-
@@ -258,41 +264,16 @@ important OS distros.
- 7.0.0
- 5.2
- 1.42.0
* - 12.x (Bookworm) ("testing")
- No GA date as of 2021-11-18
- 7.6.0
- 6.1
- 1.42.0
* - **Fedora**
-
-
-
-
* - 34
- 2021-04-27
- 7.0.0
- 5.2.0
- 1.45.4
* - 35
- 2021-11-02
- 7.6.0
- 6.1.0
- 1.46.0
* - **SUSE**
-
-
-
-
* - Leap 15.2
- 2020-07-02
- 6.0.0
- 4.2.0
- 1.38.0
* - Leap 15.3
- 2021-06-02
* - 12.x (Bookworm)
- 2023-06-10
- 9.0.0
- 7.2.0
- 6.0.0
- 1.44.1
- 1.48.6
* - 13.x (Trixie) ("testing")
- No GA date as of 2025-02-27
- 11.0.0
- 9.2.1
- 1.54.0
* - **RHEL**
-
-
@@ -348,6 +329,16 @@ important OS distros.
- 7.0.0
- 5.2
- 1.44.1
* - 22.04 (Jammy Jellyfish)
- 2022-04-21
- 8.0.0
- 6.2
- 1.44.2
* - 24.04 (Noble Numbat)
- 2024-04-25
- 10.0.0
- 8.2.2
- 1.52.0
.. NB: maintain alphabetical ordering of distros, followed by oldest released
versions first

View File

@@ -3717,7 +3717,7 @@ class RemoteManagedServersTest(_PCIServersWithMigrationTestBase):
vf_ratio = NUM_VFS // NUM_PFS
# Min Libvirt version that supports working with PCI VPD.
FAKE_LIBVIRT_VERSION = 7_009_000 # 7.9.0
FAKE_LIBVIRT_VERSION = 8_000_000 # 8.0.0
def setUp(self):
super().setUp()

View File

@@ -36,8 +36,8 @@ class ServerSharesTestBase(base.ServersTestBase):
api_major_version = 'v2.1'
microversion = 'latest'
ADMIN_API = True
FAKE_LIBVIRT_VERSION = 7000000
FAKE_QEMU_VERSION = 5002000
FAKE_LIBVIRT_VERSION = 8000000
FAKE_QEMU_VERSION = 6002000
def setUp(self):
super(ServerSharesTestBase, self).setUp()

View File

@@ -42,8 +42,8 @@ class VGPUTestBase(base.ServersTestBase):
microversion = 'latest'
ADMIN_API = True
FAKE_LIBVIRT_VERSION = 7000000
FAKE_QEMU_VERSION = 5002000
FAKE_LIBVIRT_VERSION = 8000000
FAKE_QEMU_VERSION = 6002000
# Since we run all computes by a single process, we need to identify which
# current compute service we use at the moment.
@@ -869,10 +869,3 @@ class DifferentMdevClassesTests(VGPUTestBase):
expected_rc='CUSTOM_NOTVGPU')
self.assert_mdev_usage(self.compute2, expected_amount=1,
expected_rc='CUSTOM_NOTVGPU')
class VGPUTestsLibvirt7_3(VGPUTests):
# Minimum version supporting persistent mdevs is 7.3.0.
# https://libvirt.org/drvnodedev.html#mediated-devices-mdevs
FAKE_LIBVIRT_VERSION = 7003000

View File

@@ -1,49 +0,0 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from nova.tests.fixtures import libvirt as fakelibvirt
from nova.tests.functional.libvirt import test_vgpu
class VGPUTestsLibvirt7_7(test_vgpu.VGPUTestBase):
FAKE_LIBVIRT_VERSION = 7007000
def setUp(self):
super(VGPUTestsLibvirt7_7, self).setUp()
extra_spec = {"resources:VGPU": "1"}
self.flavor = self._create_flavor(extra_spec=extra_spec)
# Start compute1 supporting only nvidia-11
self.flags(
enabled_mdev_types=fakelibvirt.NVIDIA_11_VGPU_TYPE,
group='devices')
self.compute1 = self.start_compute_with_vgpu('host1')
def test_create_servers_with_vgpu(self):
# Create a single instance against a specific compute node.
self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
flavor_id=self.flavor, host=self.compute1.host,
networks='auto', expected_state='ACTIVE')
self.assert_mdev_usage(self.compute1, expected_amount=1)
self._create_server(
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
flavor_id=self.flavor, host=self.compute1.host,
networks='auto', expected_state='ACTIVE')
self.assert_mdev_usage(self.compute1, expected_amount=2)

View File

@@ -17,7 +17,7 @@ from nova.tests.functional.libvirt import test_vgpu
class VGPUTestVolumeOPs(test_vgpu.VGPUTestBase):
FAKE_LIBVIRT_VERSION = 7007000
FAKE_LIBVIRT_VERSION = 8000000
def setUp(self):
super().setUp()

View File

@@ -27941,53 +27941,6 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
get_unassigned_mdevs.assert_called_once_with('pci_0000_06_00_0',
['nvidia-11'])
@mock.patch.object(nova.privsep.libvirt, 'create_mdev')
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_get_mdev_capable_devices')
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_get_existing_mdevs_not_assigned')
def test_allocate_mdevs_with_no_mdevs_but_capacity(self,
unallocated_mdevs,
get_mdev_capable_devs,
privsep_create_mdev):
self.flags(enabled_mdev_types=['nvidia-11', 'nvidia-12'],
group='devices')
# we need to call the below again to ensure the updated
# 'device_addresses' value is read and the new groups created
nova.conf.devices.register_dynamic_opts(CONF)
self.flags(device_addresses=['0000:06:00.0'], group='mdev_nvidia-11')
self.flags(device_addresses=['0000:07:00.0'], group='mdev_nvidia-12')
allocations = {
uuids.rp1: {
'resources': {
orc.VGPU: 1,
}
}
}
unallocated_mdevs.return_value = set()
get_mdev_capable_devs.return_value = [
{"dev_id": "pci_0000_06_00_0",
"vendor_id": 0x10de,
# This pGPU can support both types but the operator only wanted
# to use nvidia-11 for it.
"types": {'nvidia-10': {'availableInstances': 16,
'name': 'GRID M60-8Q',
'deviceAPI': 'vfio-pci'},
'nvidia-11': {'availableInstances': 16,
'name': 'GRID M60-0B',
'deviceAPI': 'vfio-pci'},
}
}]
privsep_create_mdev.return_value = uuids.mdev1
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
# Mock the fact update_provider_tree() should have run
drvr.provider_tree = self._get_fake_provider_tree_with_vgpu()
self.assertEqual([uuids.mdev1],
drvr._allocate_mdevs(allocations=allocations))
privsep_create_mdev.assert_called_once_with("0000:06:00.0",
'nvidia-11',
uuid=None)
@mock.patch.object(nova.privsep.libvirt, 'create_mdev')
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_get_mdev_capable_devices')
@@ -28127,90 +28080,6 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
self.assertEqual(set([uuids.mdev1]),
drvr._get_existing_mdevs_not_assigned(parent=None))
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_register_all_undefined_instance_details',
new=mock.Mock())
@mock.patch('nova.compute.utils.get_machine_ips',
new=mock.Mock(return_value=[]))
@mock.patch.object(nova.privsep.libvirt, 'create_mdev')
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_get_mdev_capable_devices')
@mock.patch('nova.virt.libvirt.driver.LibvirtDriver.'
'_get_mediated_device_information')
@mock.patch.object(os.path, 'exists')
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_get_all_assigned_mediated_devices')
def test_recreate_mediated_device_on_init_host(
self, get_all_assigned_mdevs, exists, mock_get_mdev_info,
get_mdev_capable_devs, privsep_create_mdev):
self.flags(enabled_mdev_types=['nvidia-11', 'nvidia-12'],
group='devices')
# we need to call the below again to ensure the updated
# 'device_addresses' value is read and the new groups created
nova.conf.devices.register_dynamic_opts(CONF)
self.flags(device_addresses=['0000:06:00.0'], group='mdev_nvidia-11')
self.flags(device_addresses=['0000:07:00.0'], group='mdev_nvidia-12')
get_all_assigned_mdevs.return_value = {uuids.mdev1: uuids.inst1,
uuids.mdev2: uuids.inst2}
# Fake the fact that mdev1 is existing but mdev2 not
def _exists(path):
# Keep the AMD SEV support check happy
if path == '/sys/module/kvm_amd/parameters/sev':
return False
# Just verify what we ask
self.assertIn('/sys/bus/mdev/devices/', path)
return True if uuids.mdev1 in path else False
exists.side_effect = _exists
mock_get_mdev_info.side_effect = [
{"dev_id": "mdev_fake",
"uuid": uuids.mdev2,
"parent": "pci_0000_06_00_0",
"type": "nvidia-11",
"iommu_group": 12
}]
get_mdev_capable_devs.return_value = [
{"dev_id": "pci_0000_06_00_0",
"vendor_id": 0x10de,
"types": {'nvidia-11': {'availableInstances': 16,
'name': 'GRID M60-0B',
'deviceAPI': 'vfio-pci'},
}
}]
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
drvr.init_host(host='foo')
# Only mdev2 will be recreated as mdev1 already exists.
privsep_create_mdev.assert_called_once_with(
"0000:06:00.0", 'nvidia-11', uuid=uuids.mdev2)
@mock.patch('nova.virt.libvirt.driver.LibvirtDriver.'
'_get_mediated_device_information')
@mock.patch.object(os.path, 'exists')
@mock.patch.object(libvirt_driver.LibvirtDriver,
'_get_all_assigned_mediated_devices')
def test_recreate_mediated_device_on_init_host_with_wrong_config(
self, get_all_assigned_mdevs, exists, mock_get_mdev_info):
self.flags(enabled_mdev_types=['nvidia-11', 'nvidia-12'],
group='devices')
get_all_assigned_mdevs.return_value = {uuids.mdev1: uuids.inst1}
# We pretend this mdev doesn't exist hence it needs recreation
exists.return_value = False
mock_get_mdev_info.side_effect = [
{"dev_id": "mdev_fake",
"uuid": uuids.mdev1,
"parent": "pci_0000_06_00_0",
"type": "nvidia-99",
"iommu_group": 12
}]
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
# mdev1 was originally created for nvidia-99 but the operator messed up
# the configuration by removing this type, we want to hardstop.
self.assertRaises(exception.InvalidLibvirtMdevConfig,
drvr.init_host, host='foo')
@mock.patch('oslo_utils.uuidutils.generate_uuid')
def test_create_mdev(self, mock_generate_uuid, uuid=None, drvr=None):
if drvr is None:

View File

@@ -218,10 +218,10 @@ patch_tpool_proxy()
# doc/source/reference/libvirt-distro-support-matrix.rst
#
# DO NOT FORGET to update this document when touching any versions below!
MIN_LIBVIRT_VERSION = (7, 0, 0)
MIN_QEMU_VERSION = (5, 2, 0)
NEXT_MIN_LIBVIRT_VERSION = (8, 0, 0)
NEXT_MIN_QEMU_VERSION = (6, 2, 0)
MIN_LIBVIRT_VERSION = (8, 0, 0)
MIN_QEMU_VERSION = (6, 2, 0)
NEXT_MIN_LIBVIRT_VERSION = (10, 0, 0)
NEXT_MIN_QEMU_VERSION = (8, 2, 2)
# vIOMMU model value `virtio` minimal support version
MIN_LIBVIRT_VIOMMU_VIRTIO_MODEL = (8, 3, 0)
@@ -887,6 +887,7 @@ class LibvirtDriver(driver.ComputeDriver):
if not self._host.has_min_version(MIN_LIBVIRT_PERSISTENT_MDEV):
# TODO(sbauza): Remove this code once mediated devices are
# persisted across reboots.
# TODO(Uggla): Remove in bump cleanup patch
self._recreate_assigned_mediated_devices()
else:
# NOTE(melwitt): We shouldn't need to do this with libvirt 7.8.0
@@ -8938,6 +8939,11 @@ class LibvirtDriver(driver.ComputeDriver):
self._host.device_create(conf)
# Define it to make it persistent.
mdev_dev = self._host.device_define(conf)
# TODO(Uggla): Remove this in the libvirt bump cleanup patch
# As we are not setting autostart anymore, because we are not
# passing in following code.
# It makes test_allocate_mdevs_with_no_mdevs_but_capacity test to fail.
# So removing the tests.
if self._host.has_min_version(MIN_LIBVIRT_NODEDEV_AUTOSTART):
# Set it to automatically start when the compute host boots or the
# parent device becomes available.

View File

@@ -0,0 +1,10 @@
---
upgrade:
- |
The minimum required version of libvirt by the `nova-compute`
service is now 8.0.0, and the minimum required version of QEMU is
6.2.0. Failing to meet these minimum versions when using the libvirt
compute driver will result in the `nova-compute` service not
starting.
The next minimum required version of libvirt to be used in a future
release is 10.0.0, while the next minimum QEMU is 8.2.2.