Browse Source

Fix the vGPU dynamic options race

As we lookup the existing dynamic options *before* creating them as
_get_supported_vgpu_types() is called *before* compute init_host(),
we need to make sure we call again the dynamic options registration
within it.

Change-Id: Ib9387c381d39fac389374c731b210815c6d4af03
Closes-Bug: #1900006
(cherry picked from commit 2bd8900d9b)
changes/07/784907/1
Sylvain Bauza 7 months ago
parent
commit
c7d9d6d9dd
2 changed files with 19 additions and 0 deletions
  1. +14
    -0
      nova/tests/unit/virt/libvirt/test_driver.py
  2. +5
    -0
      nova/virt/libvirt/driver.py

+ 14
- 0
nova/tests/unit/virt/libvirt/test_driver.py View File

@ -24988,6 +24988,20 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
libvirt_driver.LibvirtDriver,
fake.FakeVirtAPI(), False)
@mock.patch.object(nova.conf.devices, 'register_dynamic_opts')
def test_get_supported_vgpu_types_registering_dynamic_opts(self, rdo):
self.flags(enabled_vgpu_types=['nvidia-11', 'nvidia-12'],
group='devices')
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
drvr._get_supported_vgpu_types()
# Okay below is confusing, but remember, ._get_supported_vgpu_types()
# is first called by the LibvirtDriver object creation, so when
# calling the above drvr._get_supported_vgpu_types() method, it will
# be the second time that register_dynamic_opts() will be called.
rdo.assert_has_calls([mock.call(CONF), mock.call(CONF)])
def test_get_vgpu_type_per_pgpu(self):
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
device = 'pci_0000_84_00_0'


+ 5
- 0
nova/virt/libvirt/driver.py View File

@ -6894,6 +6894,11 @@ class LibvirtDriver(driver.ComputeDriver):
if not CONF.devices.enabled_vgpu_types:
return []
# Make sure we register all the types as the compute service could
# be calling this method before init_host()
if len(CONF.devices.enabled_vgpu_types) > 1:
nova.conf.devices.register_dynamic_opts(CONF)
for vgpu_type in CONF.devices.enabled_vgpu_types:
group = getattr(CONF, 'vgpu_%s' % vgpu_type, None)
if group is None or not group.device_addresses:


Loading…
Cancel
Save