diff --git a/nova/tests/unit/virt/libvirt/cpu/test_api.py b/nova/tests/unit/virt/libvirt/cpu/test_api.py index 890f4566c4..11900592b6 100644 --- a/nova/tests/unit/virt/libvirt/cpu/test_api.py +++ b/nova/tests/unit/virt/libvirt/cpu/test_api.py @@ -243,3 +243,42 @@ class TestAPI(test.NoDBTestCase): api.validate_all_dedicated_cpus() # no assert we want to make sure the validation won't raise if # no dedicated cpus are configured + + @mock.patch.object(core, 'get_governor') + @mock.patch.object(core, 'get_online') + def test_validate_all_dedicated_cpus_for_cpu_state_no_governor_ignored( + self, mock_get_online, mock_get_governor + ): + self.flags(cpu_power_management=True, group='libvirt') + self.flags(cpu_dedicated_set='0-2', group='compute') + self.flags(cpu_power_management_strategy='cpu_state', group='libvirt') + + mock_get_online.return_value = True + mock_get_governor.side_effect = FileNotFoundError( + "File /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor " + "could not be found.") + + api.validate_all_dedicated_cpus() + + self.assertEqual(2, len(mock_get_governor.mock_calls)) + + @mock.patch.object(core, 'get_governor') + @mock.patch.object(core, 'get_online') + def test_validate_all_dedicated_cpus_for_governor_error( + self, mock_get_online, mock_get_governor + ): + self.flags(cpu_power_management=True, group='libvirt') + self.flags(cpu_dedicated_set='0-2', group='compute') + self.flags(cpu_power_management_strategy='governor', group='libvirt') + + mock_get_online.return_value = True + mock_get_governor.side_effect = FileNotFoundError( + "File /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor " + "could not be found.") + + ex = self.assertRaises( + exception.InvalidConfiguration, api.validate_all_dedicated_cpus) + self.assertIn( + "[libvirt]cpu_power_management_strategy is 'governor', " + "but the host OS does not support governors for CPU0", + str(ex)) diff --git a/nova/virt/libvirt/cpu/api.py b/nova/virt/libvirt/cpu/api.py index 4725188439..17ee964969 100644 --- a/nova/virt/libvirt/cpu/api.py +++ b/nova/virt/libvirt/cpu/api.py @@ -143,7 +143,24 @@ def validate_all_dedicated_cpus() -> None: continue pcpu = Core(pcpu) # we need to collect the governors strategy and the CPU states - governors.add(pcpu.governor) + try: + governors.add(pcpu.governor) + except FileNotFoundError as e: + # NOTE(gibi): When + # /sys/devices/system/cpu/cpuX/cpufreq/scaling_governor does + # not exist it means the host OS does not support any governors. + # If cpu_state strategy is requested we can ignore this as + # governors will not be used but if governor strategy is requested + # we need to report an error and stop as the host is not properly + # configured + if CONF.libvirt.cpu_power_management_strategy == 'governor': + msg = _( + "[libvirt]cpu_power_management_strategy is 'governor', " + "but the host OS does not support governors for CPU%d" + % pcpu.ident + ) + raise exception.InvalidConfiguration(msg) from e + cpu_states.add(pcpu.online) if CONF.libvirt.cpu_power_management_strategy == 'cpu_state': # all the cores need to have the same governor strategy