Do not fail rules rollback on bad formatting key
The reason we're running rollback may be because some keys are not present. We don't want to fail due to that, see bug 1686942 for an example. Change-Id: Iac242df9987f1ce0c7a6db4f70440fa8f2aabc46 Closes-Bug: #1686942
This commit is contained in:
parent
f5791da9e2
commit
ce4fb10115
@ -201,6 +201,7 @@ class IntrospectionRule(object):
|
||||
ext_mgr = plugins_base.rule_actions_manager()
|
||||
for act in self._actions:
|
||||
ext = ext_mgr[act.action].obj
|
||||
|
||||
for formatted_param in ext.FORMATTED_PARAMS:
|
||||
value = act.params.get(formatted_param)
|
||||
if not value or not isinstance(value, six.string_types):
|
||||
@ -212,15 +213,22 @@ class IntrospectionRule(object):
|
||||
try:
|
||||
act.params[formatted_param] = value.format(data=data)
|
||||
except KeyError as e:
|
||||
raise utils.Error(_('Invalid formatting variable key '
|
||||
'provided: %s') % e,
|
||||
node_info=node_info, data=data)
|
||||
|
||||
LOG.debug('Running %(what)s action `%(action)s %(params)s`',
|
||||
{'action': act.action, 'params': act.params,
|
||||
'what': method},
|
||||
node_info=node_info, data=data)
|
||||
getattr(ext, method)(node_info, act.params)
|
||||
if rollback:
|
||||
LOG.warning('Invalid formatting variable key provided:'
|
||||
' %(key)s, skipping rollback for action '
|
||||
'%(action)s',
|
||||
{'key': e, 'action': act.action})
|
||||
break
|
||||
else:
|
||||
raise utils.Error(_('Invalid formatting variable key '
|
||||
'provided: %s') % e,
|
||||
node_info=node_info, data=data)
|
||||
else:
|
||||
LOG.debug('Running %(what)s action `%(action)s %(params)s`',
|
||||
{'action': act.action, 'params': act.params,
|
||||
'what': method},
|
||||
node_info=node_info, data=data)
|
||||
getattr(ext, method)(node_info, act.params)
|
||||
|
||||
LOG.debug('Successfully applied %s',
|
||||
'rollback actions' if rollback else 'actions',
|
||||
|
@ -445,6 +445,23 @@ class TestApplyActions(BaseTest):
|
||||
self.act_mock.rollback.call_count)
|
||||
self.assertFalse(self.act_mock.apply.called)
|
||||
|
||||
@mock.patch.object(rules.LOG, 'warning', autospec=True)
|
||||
def test_rollback_ignores_formatting_failures(self, mock_log,
|
||||
mock_ext_mgr):
|
||||
self.rule = rules.create(
|
||||
actions_json=[
|
||||
{'action': 'set-attribute',
|
||||
'path': '/driver_info/ipmi_address',
|
||||
'value': '{data[foo][bar]}'}],
|
||||
conditions_json=self.conditions_json
|
||||
)
|
||||
mock_ext_mgr.return_value.__getitem__.return_value = self.ext_mock
|
||||
|
||||
self.rule.apply_actions(self.node_info, rollback=True, data=self.data)
|
||||
|
||||
self.assertTrue(mock_log.called)
|
||||
self.assertFalse(self.act_mock.rollback.called)
|
||||
|
||||
|
||||
@mock.patch.object(rules, 'get_all', autospec=True)
|
||||
class TestApply(BaseTest):
|
||||
|
@ -0,0 +1,7 @@
|
||||
---
|
||||
fixes:
|
||||
- |
|
||||
Do not fail the whole introspection due to a value formatting error during
|
||||
introspection rules rollback. See `bug 1686942
|
||||
<https://bugs.launchpad.net/ironic-inspector/+bug/1686942>`_ for an example
|
||||
and detailed investigation.
|
Loading…
Reference in New Issue
Block a user