diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 406794df0a..ebaf1165bc 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -12,6 +12,7 @@ # under the License. import collections +import contextlib import copy import eventlet import functools @@ -379,6 +380,15 @@ class Stack(collections.Mapping): self._db_resources = _db_resources return self._db_resources + @contextlib.contextmanager + def _previous_definition(self, stk_defn): + cur_defn = self.defn + try: + self.defn = stk_defn + yield + finally: + self.defn = cur_defn + def _resource_from_db_resource(self, db_res, stk_def_cache=None): tid = db_res.current_template_id if tid is None: @@ -407,8 +417,9 @@ class Stack(collections.Mapping): except KeyError: return None - res = resource.Resource(db_res.name, defn, self) - res._load_data(db_res) + with self._previous_definition(stk_def): + res = resource.Resource(db_res.name, defn, self) + res._load_data(db_res) return res def resource_get(self, name): diff --git a/heat_integrationtests/functional/test_create_update.py b/heat_integrationtests/functional/test_create_update.py index a84dcde0e3..72f5f87fe1 100644 --- a/heat_integrationtests/functional/test_create_update.py +++ b/heat_integrationtests/functional/test_create_update.py @@ -790,3 +790,37 @@ resources: expected_status='UPDATE_FAILED') self.update_stack(stack_identifier, template=template, expected_status='UPDATE_COMPLETE') + + @test.requires_convergence + def test_update_failed_changed_env_list_resources(self): + template = { + 'heat_template_version': 'rocky', + 'resources': { + 'test1': { + 'type': 'OS::Heat::TestResource', + 'properties': { + 'value': 'foo' + } + }, + 'my_res': { + 'type': 'My::TestResource', + 'depends_on': 'test1' + }, + 'test2': { + 'depends_on': 'my_res', + 'type': 'OS::Heat::TestResource' + } + } + } + env = {'resource_registry': + {'My::TestResource': 'OS::Heat::TestResource'}} + stack_identifier = self.stack_create( + template=template, environment=env) + update_template = copy.deepcopy(template) + update_template['resources']['test1']['properties']['fail'] = 'true' + update_template['resources']['test2']['depends_on'] = 'test1' + del update_template['resources']['my_res'] + self.update_stack(stack_identifier, + template=update_template, + expected_status='UPDATE_FAILED') + self.assertEqual(3, len(self.list_resources(stack_identifier)))