Merge "Bump MIN_{LIBVIRT,QEMU} for "Epoxy""

This commit is contained in:
Zuul 2025-03-18 12:43:44 +00:00 committed by Gerrit Code Review
commit 6042300453
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

@ -4879,7 +4879,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

@ -28043,53 +28043,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')
@ -28229,90 +28182,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

@ -219,10 +219,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)
@ -892,6 +892,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
@ -8987,6 +8988,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.