Fixes to skip validation of in-band deploy steps before agent boot

Validation should not fail even if any deploy step requested in the deployment
template is not available, unless inband deploy steps are retrieved.

Change-Id: I173e6b1a8037698d41f355c7ef55f7389594be1e
(cherry picked from commit 8c191ceb5a)
This commit is contained in:
Shivanand Tendulker 2020-07-15 14:02:43 -04:00 committed by Dmitry Tantsur
parent 778d654070
commit bc4024facc
2 changed files with 35 additions and 1 deletions

View File

@ -98,7 +98,7 @@ def start_deploy(task, manager, configdrive=None, event='deploy'):
task.driver.power.validate(task) task.driver.power.validate(task)
task.driver.deploy.validate(task) task.driver.deploy.validate(task)
utils.validate_instance_info_traits(task.node) utils.validate_instance_info_traits(task.node)
conductor_steps.validate_deploy_templates(task) conductor_steps.validate_deploy_templates(task, skip_missing=True)
except exception.InvalidParameterValue as e: except exception.InvalidParameterValue as e:
raise exception.InstanceDeployFailure( raise exception.InstanceDeployFailure(
_("Failed to validate deploy or power info for node " _("Failed to validate deploy or power info for node "

View File

@ -19,6 +19,7 @@ from oslo_db import exception as db_exception
from oslo_utils import uuidutils from oslo_utils import uuidutils
from ironic.common import exception from ironic.common import exception
from ironic.common import images
from ironic.common import states from ironic.common import states
from ironic.common import swift from ironic.common import swift
from ironic.conductor import deployments from ironic.conductor import deployments
@ -372,6 +373,39 @@ class DoNodeDeployTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):
self.assertIsNotNone(node.last_error) self.assertIsNotNone(node.last_error)
self.assertFalse(mock_deploy.called) self.assertFalse(mock_deploy.called)
@mock.patch.object(task_manager.TaskManager, 'process_event',
autospec=True)
@mock.patch('ironic.drivers.modules.fake.FakePower.validate')
@mock.patch('ironic.drivers.modules.fake.FakeDeploy.validate')
@mock.patch.object(conductor_steps, 'validate_deploy_templates',
autospec=True)
@mock.patch.object(conductor_utils, 'validate_instance_info_traits',
autospec=True)
@mock.patch.object(images, 'is_whole_disk_image', autospec=True)
def test_start_deploy(self, mock_iwdi, mock_validate_traits,
mock_validate_templates, mock_deploy_validate,
mock_power_validate, mock_process_event):
self._start_service()
mock_iwdi.return_value = False
node = obj_utils.create_test_node(self.context, driver='fake-hardware',
provision_state=states.AVAILABLE,
target_provision_state=states.ACTIVE)
task = task_manager.TaskManager(self.context, node.uuid)
deployments.start_deploy(task, self.service, configdrive=None,
event='deploy')
node.refresh()
self.assertTrue(mock_iwdi.called)
mock_power_validate.assert_called_once_with(task)
mock_deploy_validate.assert_called_once_with(task)
mock_validate_traits.assert_called_once_with(task.node)
mock_validate_templates.assert_called_once_with(
task, skip_missing=True)
mock_process_event.assert_called_with(
mock.ANY, 'deploy', call_args=(
deployments.do_node_deploy, task, 1, None),
callback=mock.ANY, err_handler=mock.ANY)
@mgr_utils.mock_record_keepalive @mgr_utils.mock_record_keepalive
class DoNextDeployStepTestCase(mgr_utils.ServiceSetUpMixin, class DoNextDeployStepTestCase(mgr_utils.ServiceSetUpMixin,