diff options
Diffstat (limited to 'ironic/conductor')
-rw-r--r-- | ironic/conductor/deployments.py | 7 | ||||
-rw-r--r-- | ironic/conductor/manager.py | 9 | ||||
-rw-r--r-- | ironic/conductor/steps.py | 13 |
3 files changed, 24 insertions, 5 deletions
diff --git a/ironic/conductor/deployments.py b/ironic/conductor/deployments.py index 152bbce43..3c7eadb2b 100644 --- a/ironic/conductor/deployments.py +++ b/ironic/conductor/deployments.py @@ -88,6 +88,7 @@ def start_deploy(task, manager, configdrive=None, event='deploy'): node.instance_info = instance_info driver_internal_info = node.driver_internal_info + driver_internal_info.pop('steps_validated', None) # Infer the image type to make sure the deploy driver # validates only the necessary variables for different # image types. @@ -185,8 +186,9 @@ def do_node_deploy(task, conductor_id=None, configdrive=None): traceback=True, clean_up=False) try: - # This gets the deploy steps and puts them in the node's - # driver_internal_info['deploy_steps']. + # This gets the deploy steps (if any) and puts them in the node's + # driver_internal_info['deploy_steps']. In-band steps are skipped since + # we know that an agent is not running yet. conductor_steps.set_node_deployment_steps(task) except exception.InstanceDeployFailure as e: with excutils.save_and_reraise_exception(): @@ -313,6 +315,7 @@ def do_next_deploy_step(task, step_index, conductor_id): driver_internal_info.pop('deploy_step_index', None) driver_internal_info.pop('deployment_reboot', None) driver_internal_info.pop('deployment_polling', None) + driver_internal_info.pop('steps_validated', None) # Remove the agent_url cached from the deployment. driver_internal_info.pop('agent_url', None) node.driver_internal_info = driver_internal_info diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py index 4a588c874..7a44ca12b 100644 --- a/ironic/conductor/manager.py +++ b/ironic/conductor/manager.py @@ -872,6 +872,15 @@ class ConductorManager(base_manager.BaseConductorManager): save_required = False info = node.driver_internal_info + + # Agent is running, we're ready to validate the remaining steps + if not info.get('steps_validated'): + conductor_steps.validate_deploy_templates(task) + conductor_steps.set_node_deployment_steps( + task, reset_current=False) + info['steps_validated'] = True + save_required = True + try: skip_current_step = info.pop('skip_current_deploy_step') except KeyError: diff --git a/ironic/conductor/steps.py b/ironic/conductor/steps.py index 3fb539e34..09ecf5fa2 100644 --- a/ironic/conductor/steps.py +++ b/ironic/conductor/steps.py @@ -87,6 +87,11 @@ def is_equivalent(step1, step2): and step1.get('step') == step2.get('step')) +def find_step(steps, step): + """Find an identical step in the list of steps.""" + return next((x for x in steps if is_equivalent(x, step)), None) + + def _get_steps(task, interfaces, get_method, enabled=False, sort_step_key=None): """Get steps for task.node. @@ -299,19 +304,21 @@ def _get_all_deployment_steps(task): return _sorted_steps(steps, _deploy_step_key) -def set_node_deployment_steps(task): +def set_node_deployment_steps(task, reset_current=True): """Set up the node with deployment step information for deploying. Get the deploy steps from the driver. + :param reset_current: Whether to reset the current step to the first one. :raises: InstanceDeployFailure if there was a problem getting the deployment steps. """ node = task.node driver_internal_info = node.driver_internal_info driver_internal_info['deploy_steps'] = _get_all_deployment_steps(task) - node.deploy_step = {} - driver_internal_info['deploy_step_index'] = None + if reset_current: + node.deploy_step = {} + driver_internal_info['deploy_step_index'] = None node.driver_internal_info = driver_internal_info node.save() |