diff options
author | Shivanand Tendulker <stendulker@gmail.com> | 2018-07-03 03:48:06 -0400 |
---|---|---|
committer | Shivanand Tendulker <stendulker@gmail.com> | 2018-07-24 02:18:08 -0400 |
commit | 7c5a04c1149f14900f504f32e000a7b4e69e661f (patch) | |
tree | 69cc13b9e189079bb464632a99d3b85d6c630d86 /ironic/conductor | |
parent | 3347e155b38cf5bb9f308e23df416dbce17c3404 (diff) | |
download | ironic-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.py | 14 |
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: |