summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heat/engine/stack.py15
-rw-r--r--heat_integrationtests/functional/test_create_update.py34
2 files changed, 47 insertions, 2 deletions
diff --git a/heat/engine/stack.py b/heat/engine/stack.py
index 406794df0..ebaf1165b 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 a84dcde0e..72f5f87fe 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)))