summaryrefslogtreecommitdiff
path: root/ironic/conductor
diff options
context:
space:
mode:
authorShivanand Tendulker <stendulker@gmail.com>2018-07-03 03:48:06 -0400
committerShivanand Tendulker <stendulker@gmail.com>2018-07-24 02:18:08 -0400
commit7c5a04c1149f14900f504f32e000a7b4e69e661f (patch)
tree69cc13b9e189079bb464632a99d3b85d6c630d86 /ironic/conductor
parent3347e155b38cf5bb9f308e23df416dbce17c3404 (diff)
downloadironic-7c5a04c1149f14900f504f32e000a7b4e69e661f.tar.gz
Fix for failure in cleaning
The cleaning operation may fail, if an in-band clean step were to execute after the completion of out-of-band clean step that performs reboot of the node. The failure is caused because of race condition where in cleaning is resumed before the Ironic Python Agent(IPA) is ready to execute clean steps. Story: #2002731 Task: #22580 Change-Id: Idaacb9fbb1ea3ac82cdb6769df05d8206660c8cb
Diffstat (limited to 'ironic/conductor')
-rw-r--r--ironic/conductor/manager.py14
1 files changed, 14 insertions, 0 deletions
diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py
index 203178292..582f3c36f 100644
--- a/ironic/conductor/manager.py
+++ b/ironic/conductor/manager.py
@@ -1236,6 +1236,19 @@ class ConductorManager(base_manager.BaseConductorManager):
try:
result = interface.execute_clean_step(task, step)
except Exception as e:
+ if isinstance(e, exception.AgentConnectionFailed):
+ if task.node.driver_internal_info.get('cleaning_reboot'):
+ LOG.info('Agent is not yet running on node %(node)s '
+ 'after cleaning reboot, waiting for agent to '
+ 'come up to run next clean step %(step)s.',
+ {'node': node.uuid, 'step': step})
+ driver_internal_info['skip_current_clean_step'] = False
+ node.driver_internal_info = driver_internal_info
+ target_state = (states.MANAGEABLE if manual_clean
+ else None)
+ task.process_event('wait', target_state=target_state)
+ return
+
msg = (_('Node %(node)s failed step %(step)s: '
'%(exc)s') %
{'node': node.uuid, 'exc': e,
@@ -1270,6 +1283,7 @@ class ConductorManager(base_manager.BaseConductorManager):
driver_internal_info = node.driver_internal_info
driver_internal_info['clean_steps'] = None
driver_internal_info.pop('clean_step_index', None)
+ driver_internal_info.pop('cleaning_reboot', None)
node.driver_internal_info = driver_internal_info
node.save()
try: