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 c907add512)
This commit is contained in:
Jiri Stransky 2018-11-23 16:54:10 +01:00
parent 7ba229abb2
commit a1a0bc4699
2 changed files with 41 additions and 16 deletions

View File

@ -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)

View File

@ -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')