Fix redfish BIOS apply config error handling
Instead of using process_event('fail') use error_handlers,
otherwise in case of failure node gets stuck and fails
because of timeout, instead of failing earlier due to
step failure.
Besides adding new unit tests, also update related unit tests
to test for success correctly and have realistic data.
Story: 2008307
Task: 41196
Change-Id: If28ccb252a87610e3fd3dc78e1ed75bb8ca1cdcf
(cherry picked from commit 70b7ca345f
)
This commit is contained in:
parent
e2b55a8cb8
commit
e21361afb0
|
@ -332,8 +332,8 @@ class RedfishBIOS(base.BIOSInterface):
|
|||
last_error = (_('Redfish BIOS apply_configuration step failed. '
|
||||
'Attributes %(attrs)s are not updated.') %
|
||||
{'attrs': attrs_not_updated})
|
||||
LOG.error(error_msg)
|
||||
task.node.last_error = last_error
|
||||
if task.node.provision_state in [states.CLEANING, states.CLEANWAIT,
|
||||
states.DEPLOYING, states.DEPLOYWAIT]:
|
||||
task.process_event('fail')
|
||||
if task.node.provision_state in [states.CLEANING, states.CLEANWAIT]:
|
||||
LOG.error(error_msg)
|
||||
manager_utils.cleaning_error_handler(task, last_error)
|
||||
if task.node.provision_state in [states.DEPLOYING, states.DEPLOYWAIT]:
|
||||
manager_utils.deploying_error_handler(task, error_msg, last_error)
|
||||
|
|
|
@ -236,7 +236,8 @@ class RedfishBiosTestCase(db_base.DbTestCase):
|
|||
self._test_step_pre_reboot()
|
||||
|
||||
@mock.patch.object(redfish_utils, 'get_system', autospec=True)
|
||||
def _test_step_post_reboot(self, mock_get_system):
|
||||
def _test_step_post_reboot(self, mock_get_system,
|
||||
attributes_after_reboot=None):
|
||||
if self.node.deploy_step:
|
||||
step_data = self.node.deploy_step
|
||||
else:
|
||||
|
@ -246,6 +247,14 @@ class RedfishBiosTestCase(db_base.DbTestCase):
|
|||
if step == 'factory_reset':
|
||||
check_fields = ['post_factory_reset_reboot_requested']
|
||||
if step == 'apply_configuration':
|
||||
mock_bios = mock.Mock()
|
||||
# if attributes after reboot not provided then mimic success
|
||||
# by returning the same as requested
|
||||
mock_bios.attributes = attributes_after_reboot \
|
||||
or self.node.driver_internal_info['requested_bios_attrs']
|
||||
mock_system = mock.Mock()
|
||||
mock_system.bios = mock_bios
|
||||
mock_get_system.return_value = mock_system
|
||||
check_fields = ['post_config_reboot_requested',
|
||||
'requested_bios_attrs']
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
|
@ -279,13 +288,56 @@ class RedfishBiosTestCase(db_base.DbTestCase):
|
|||
node.save()
|
||||
self._test_step_post_reboot()
|
||||
|
||||
def test_apply_conf_post_reboot_cleaning(self):
|
||||
data = [{'name': 'ProcTurboMode', 'value': 'Disabled'},
|
||||
@mock.patch.object(manager_utils, 'cleaning_error_handler', autospec=True)
|
||||
@mock.patch.object(manager_utils, 'deploying_error_handler', autospec=True)
|
||||
def test_apply_conf_post_reboot_cleaning(self,
|
||||
mock_deploying_error_handler,
|
||||
mock_cleaning_error_handler):
|
||||
data = [{'name': 'ProcTurboMode', 'value': 'Enabled'},
|
||||
{'name': 'NicBoot1', 'value': 'NetworkBoot'}]
|
||||
self.node.clean_step = {'priority': 100, 'interface': 'bios',
|
||||
'step': 'apply_configuration',
|
||||
'argsinfo': {'settings': data}}
|
||||
requested_attrs = {'ProcTurboMode': 'Enabled',
|
||||
'NicBoot1': 'NetworkBoot'}
|
||||
node = self.node
|
||||
driver_internal_info = node.driver_internal_info
|
||||
driver_internal_info['post_config_reboot_requested'] = True
|
||||
driver_internal_info['requested_bios_attrs'] = requested_attrs
|
||||
self.node.driver_internal_info = driver_internal_info
|
||||
self.node.save()
|
||||
self._test_step_post_reboot()
|
||||
mock_cleaning_error_handler.assert_not_called()
|
||||
mock_deploying_error_handler.assert_not_called()
|
||||
|
||||
@mock.patch.object(manager_utils, 'cleaning_error_handler', autospec=True)
|
||||
def test_apply_conf_post_reboot_cleaning_failed(
|
||||
self, mock_cleaning_error_handler):
|
||||
data = [{'name': 'ProcTurboMode', 'value': 'Enabled'}]
|
||||
self.node.clean_step = {'priority': 100, 'interface': 'bios',
|
||||
'step': 'apply_configuration',
|
||||
'argsinfo': {'settings': data}}
|
||||
requested_attrs = {'ProcTurboMode': 'Enabled'}
|
||||
attributes_after_reboot = {'ProcTurboMode': 'Disabled'}
|
||||
node = self.node
|
||||
driver_internal_info = node.driver_internal_info
|
||||
driver_internal_info['post_config_reboot_requested'] = True
|
||||
driver_internal_info['requested_bios_attrs'] = requested_attrs
|
||||
self.node.driver_internal_info = driver_internal_info
|
||||
self.node.provision_state = states.CLEANING
|
||||
self.node.save()
|
||||
self._test_step_post_reboot(
|
||||
attributes_after_reboot=attributes_after_reboot)
|
||||
mock_cleaning_error_handler.assert_called_once()
|
||||
|
||||
def test_apply_conf_post_reboot_deploying(self):
|
||||
data = [{'name': 'ProcTurboMode', 'value': 'Disabled'},
|
||||
{'name': 'NicBoot1', 'value': 'NetworkBoot'}]
|
||||
self.node.deploy_step = {'priority': 100, 'interface': 'bios',
|
||||
'step': 'apply_configuration',
|
||||
'argsinfo': {'settings': data}}
|
||||
requested_attrs = {'ProcTurboMode': 'Enabled',
|
||||
'NicBoot1': 'NetworkBoot'}
|
||||
node = self.node
|
||||
driver_internal_info = node.driver_internal_info
|
||||
driver_internal_info['post_config_reboot_requested'] = True
|
||||
|
@ -294,20 +346,25 @@ class RedfishBiosTestCase(db_base.DbTestCase):
|
|||
self.node.save()
|
||||
self._test_step_post_reboot()
|
||||
|
||||
def test_apply_conf_post_reboot_deploying(self):
|
||||
data = [{'name': 'ProcTurboMode', 'value': 'Disabled'},
|
||||
{'name': 'NicBoot1', 'value': 'NetworkBoot'}]
|
||||
@mock.patch.object(manager_utils, 'deploying_error_handler', autospec=True)
|
||||
def test_apply_conf_post_reboot_deploying_failed(
|
||||
self, mock_deploying_error_handler):
|
||||
data = [{'name': 'ProcTurboMode', 'value': 'Enabled'}]
|
||||
self.node.deploy_step = {'priority': 100, 'interface': 'bios',
|
||||
'step': 'apply_configuration',
|
||||
'argsinfo': {'settings': data}}
|
||||
requested_attrs = {'ProcTurboMode': 'Enabled'}
|
||||
attributes_after_reboot = {'ProcTurboMode': 'Disabled'}
|
||||
node = self.node
|
||||
driver_internal_info = node.driver_internal_info
|
||||
driver_internal_info['post_config_reboot_requested'] = True
|
||||
driver_internal_info['requested_bios_attrs'] = requested_attrs
|
||||
self.node.driver_internal_info = driver_internal_info
|
||||
self.node.provision_state = states.DEPLOYWAIT
|
||||
self.node.save()
|
||||
self._test_step_post_reboot()
|
||||
self._test_step_post_reboot(
|
||||
attributes_after_reboot=attributes_after_reboot)
|
||||
mock_deploying_error_handler.assert_called_once()
|
||||
|
||||
@mock.patch.object(redfish_utils, 'get_system', autospec=True)
|
||||
def test_factory_reset_fail(self, mock_get_system):
|
||||
|
@ -345,7 +402,8 @@ class RedfishBiosTestCase(db_base.DbTestCase):
|
|||
def test_check_bios_attrs(self, mock_get_system):
|
||||
settings = [{'name': 'ProcTurboMode', 'value': 'Disabled'},
|
||||
{'name': 'NicBoot1', 'value': 'NetworkBoot'}]
|
||||
requested_attrs = {'ProcTurboMode': 'Enabled'}
|
||||
requested_attrs = {'ProcTurboMode': 'Enabled',
|
||||
'NicBoot1': 'NetworkBoot'}
|
||||
with task_manager.acquire(self.context, self.node.uuid,
|
||||
shared=False) as task:
|
||||
attributes = mock_get_system(task.node).bios.attributes
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
fixes:
|
||||
- |
|
||||
Fixes ``redfish`` BIOS ``apply_configuration`` clean and deploy step to
|
||||
fail correctly in case of error when checking if BIOS updates are
|
||||
successfully applied. Before the fix when BIOS updates were unsuccessful,
|
||||
then node cleaning or deploying failed with timeout instead of actual error
|
||||
in clean or deploy step.
|
Loading…
Reference in New Issue