summaryrefslogtreecommitdiff
path: root/ironic/conductor
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-04-26 12:28:54 +0000
committerGerrit Code Review <review@openstack.org>2020-04-26 12:28:54 +0000
commitb083a02d1c0822e539af9cd0c1a037a92a1a74c3 (patch)
treedc32524eb228fa77a2de82c8e05a3d8456e45bed /ironic/conductor
parent378f374a2a24c346849c22c5c3c5f190d12d6f76 (diff)
parent4795c4a8b8896129228fba5a09b87d0551f6e140 (diff)
downloadironic-b083a02d1c0822e539af9cd0c1a037a92a1a74c3.tar.gz
Merge "Support executing in-band deploy steps"
Diffstat (limited to 'ironic/conductor')
-rw-r--r--ironic/conductor/deployments.py7
-rw-r--r--ironic/conductor/manager.py9
-rw-r--r--ironic/conductor/steps.py13
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()