diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index cbe5bbabf1f0..f7f00b52f916 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -24831,6 +24831,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' diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 9a89fbe38170..870e8039b6ad 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -6793,6 +6793,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: