From a1a0bc4699945a555ea5e6edc33c71dc8bbede8a Mon Sep 17 00:00:00 2001 From: Jiri Stransky Date: Fri, 23 Nov 2018 16:54:10 +0100 Subject: [PATCH] Set DeployIdentifier on update/upgrade/ffwd prepare actions We have separate actions for deploy vs. upgrade prepare, because on upgrade prepare we don't want to trigger Ansible. DeployIdentifier was left out from the upgrade prepare action, which got exposed as a bug after we fixed --skip-deploy-identifier functionality in Ibab17dcaeebea65135fca4f40562109c90f36c27. Over time it would be good to further improve code sharing between `overcloud deploy` and `overcloud update/upgrade/ffwd prepare`, but for now we need a backportable fix so we just set DeployIdentifier in the upgrade prepare action. Additionally it turned out that we never updated the plan env via the UpdateStackAction as intended, which is now fixed too. Change-Id: Iefaff07995ae47dcef58739eaf90c4026fe255b0 Closes-Bug: #1804858 (cherry picked from commit c907add512817363207ba8899a3cb14e122078d4) --- tripleo_common/actions/package_update.py | 14 +++++- .../tests/actions/test_package_update.py | 43 ++++++++++++------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/tripleo_common/actions/package_update.py b/tripleo_common/actions/package_update.py index 727fcb6c6..ab43de547 100644 --- a/tripleo_common/actions/package_update.py +++ b/tripleo_common/actions/package_update.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. import logging +import time from heatclient.common import template_utils from heatclient import exc as heat_exc @@ -52,7 +53,11 @@ class UpdateStackAction(templates.ProcessTemplatesAction): LOG.exception(err_msg) return actions.Result(error=err_msg) - update_env = {} + update_env = { + 'parameter_defaults': { + 'DeployIdentifier': int(time.time()), + }, + } noop_env = { 'resource_registry': { @@ -72,6 +77,13 @@ class UpdateStackAction(templates.ProcessTemplatesAction): noop_env['resource_registry'].update(role_env) update_env.update(noop_env) template_utils.deep_update(env, update_env) + try: + plan_utils.put_env(swift, env) + except swiftexceptions.ClientException as err: + err_msg = ("Error updating environment for plan %s: %s" % ( + self.container, err)) + LOG.exception(err_msg) + return actions.Result(error=err_msg) # process all plan files and create or update a stack processed_data = super(UpdateStackAction, self).run(context) diff --git a/tripleo_common/tests/actions/test_package_update.py b/tripleo_common/tests/actions/test_package_update.py index a508e0e03..7876e8507 100644 --- a/tripleo_common/tests/actions/test_package_update.py +++ b/tripleo_common/tests/actions/test_package_update.py @@ -29,40 +29,39 @@ class UpdateStackActionTest(base.TestCase): @mock.patch('tripleo_common.actions.base.TripleOAction.get_object_client') @mock.patch('tripleo_common.actions.base.TripleOAction.' 'get_orchestration_client') - @mock.patch('tripleo_common.actions.base.TripleOAction.' - 'get_compute_client') @mock.patch('heatclient.common.template_utils.get_template_contents') + @mock.patch('tripleo_common.utils.plan.put_env') @mock.patch('tripleo_common.utils.plan.get_env') @mock.patch('tripleo_common.utils.plan.update_in_env') - @mock.patch('heatclient.common.template_utils.deep_update') - def test_run(self, mock_deepupdate, + def test_run(self, mock_updateinenv, mock_getenv, + mock_putenv, mock_template_contents, - mock_compute_client, - mock_orchestration_client, - mock_object_client, + mock_get_orchestration_client, + mock_get_object_client, mock_templates_run): mock_ctx = mock.MagicMock() heat = mock.MagicMock() heat.stacks.get.return_value = mock.MagicMock( - stack_name='stack', id='stack_id') - mock_orchestration_client.return_value = heat + stack_name='mycloud', id='stack_id') + mock_get_orchestration_client.return_value = heat mock_template_contents.return_value = ({}, { 'heat_template_version': '2016-04-30' }) mock_swift = mock.MagicMock() env = { - 'parameters': { + 'name': 'mycloud', + 'parameter_defaults': { 'ControllerCount': 1, 'ComputeCount': 1, 'ObjectStorageCount': 0, 'BlockStorageCount': 0, 'CephStorageCount': 0, }, - 'stack_name': 'overcloud', + 'stack_name': 'mycloud', 'stack_status': "CREATE_COMPLETE", 'outputs': [ {'output_key': 'RoleConfig', @@ -95,15 +94,29 @@ class UpdateStackActionTest(base.TestCase): 'when': ['existing', 'list']}] }}}]} - update_env = {'resource_registry': - {'OS::TripleO::DeploymentSteps': 'OS::Heat::None'}} mock_getenv.return_value = env mock_swift.get_object.return_value = ({}, env) - mock_object_client.return_value = mock_swift + mock_get_object_client.return_value = mock_swift action = package_update.UpdateStackAction(self.timeout, container=self.container) action.run(mock_ctx) - mock_deepupdate.assert_called_once_with(env, update_env) + mock_putenv.assert_called_once_with(mock_swift, { + 'name': env['name'], + 'resource_registry': { + 'OS::TripleO::DeploymentSteps': 'OS::Heat::None', + }, + 'parameter_defaults': { + 'DeployIdentifier': mock.ANY, + 'ControllerCount': 1, + 'ComputeCount': 1, + 'ObjectStorageCount': 0, + 'BlockStorageCount': 0, + 'CephStorageCount': 0, + }, + 'stack_name': env['stack_name'], + 'stack_status': env['stack_status'], + 'outputs': env['outputs'], + }) heat.stacks.update.assert_called_once_with('stack_id')