[pwmgmt]ignore missin governor when cpu_state used

When cpu_state power management strategy is requested nova-compute
should not fail to start if there is no cpufreq governor is supported by
the host.

Closes-Bug: #2045966
Change-Id: Ice2fa47bdab320a7e472fbb4767761448d176bad
This commit is contained in:
Balazs Gibizer
2023-12-08 12:10:11 +01:00
parent 3ee643b459
commit ed2ac71a46
2 changed files with 57 additions and 1 deletions
@@ -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))
+18 -1
View File
@@ -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