summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZane Bitter <zbitter@redhat.com>2018-08-31 17:08:58 -0400
committerRabi Mishra <ramishra@redhat.com>2018-09-26 08:58:53 +0000
commitaed195c8d8ee0cb9ece00327517517f1f7d796f1 (patch)
treebe474d062bfdbcdfb78f3f37f980bb2a22cfb2a0
parenteb60b6740ff79e98cfb719d8221a4667948e3c8b (diff)
downloadheat-aed195c8d8ee0cb9ece00327517517f1f7d796f1.tar.gz
Update resource definitions after legacy in-place update
Since we remove a resource's definition after it is deleted, we must also update a resource's definition after it is updated. Otherwise, a resource that depended on the now-deleted resource prior to its last in-place update could remain in the template, leaving the stack inoperable since it is unable to calculate its own dependencies. We already update the template in the backup stack when updating resources in-place, and in the main stack when creating replacement resources. Also update the main template when resources are updated in-place, not just when they are replaced. Change-Id: I97ddc6a970ffd27bfd40bb8f6bec8d1cbf28a815 Story: #2003612 Task: 24946 Task: 25740 (cherry picked from commit 75c912181d75f2d4db365a784687b761694ed15a and 8bb1cef48f1b5bc06954af63f35721937919d6d2)
-rw-r--r--heat/engine/update.py2
-rw-r--r--heat/tests/openstack/heat/test_value.py6
-rw-r--r--heat_integrationtests/functional/test_create_update.py36
3 files changed, 41 insertions, 3 deletions
diff --git a/heat/engine/update.py b/heat/engine/update.py
index 3bd96cc3a..cd8baba62 100644
--- a/heat/engine/update.py
+++ b/heat/engine/update.py
@@ -184,6 +184,8 @@ class StackUpdate(object):
res_name)
self.previous_stack.t.add_resource(new_res.t)
self.previous_stack.t.store(self.previous_stack.context)
+ self.existing_stack.t.add_resource(new_res.t)
+ self.existing_stack.t.store(self.existing_stack.context)
LOG.info("Resource %(res_name)s for stack "
"%(stack_name)s updated",
diff --git a/heat/tests/openstack/heat/test_value.py b/heat/tests/openstack/heat/test_value.py
index 2f75c8d22..0ce0a500e 100644
--- a/heat/tests/openstack/heat/test_value.py
+++ b/heat/tests/openstack/heat/test_value.py
@@ -226,7 +226,7 @@ class TestValueUpdate(TestValue):
param2=True, param_type2="boolean")),
]
- def test_value(self):
+ def test_value_update(self):
ts1, tl1 = self.get_strict_and_loose_templates(self.param_type1)
ts2, tl2 = self.get_strict_and_loose_templates(self.param_type2)
@@ -244,7 +244,7 @@ class TestValueUpdate(TestValue):
else:
# starting with param2, updating to param1
p2, p1, e2, e1 = self.param1, self.param2, env1, env2
- stack = self.create_stack(t_initial, env=e1)
+ stack = self.create_stack(copy.deepcopy(t_initial), env=e1)
self.assertEqual(p1, stack['my_value2'].FnGetAtt('value'))
res1_id = stack['my_value'].id
res2_id = stack['my_value2'].id
@@ -252,7 +252,7 @@ class TestValueUpdate(TestValue):
updated_stack = parser.Stack(
stack.context, 'updated_stack',
- template.Template(t_updated, env=e2))
+ template.Template(copy.deepcopy(t_updated), env=e2))
updated_stack.validate()
stack.update(updated_stack)
self.assertEqual(p2, stack['my_value2'].FnGetAtt('value'))
diff --git a/heat_integrationtests/functional/test_create_update.py b/heat_integrationtests/functional/test_create_update.py
index 4b06fcb33..1e4248622 100644
--- a/heat_integrationtests/functional/test_create_update.py
+++ b/heat_integrationtests/functional/test_create_update.py
@@ -722,3 +722,39 @@ resources:
}
}
self._test_conditional(test3)
+
+ def test_inplace_update_old_ref_deleted_failed_stack(self):
+ template = '''
+heat_template_version: pike
+resources:
+ test1:
+ type: OS::Heat::TestResource
+ properties:
+ value: test
+ test2:
+ type: OS::Heat::TestResource
+ properties:
+ value: {get_attr: [test1, output]}
+ test3:
+ type: OS::Heat::TestResource
+ properties:
+ value: test3
+ fail: false
+ action_wait_secs:
+ update: 5
+'''
+ stack_identifier = self.stack_create(
+ template=template)
+
+ _template = template.replace('test1:',
+ 'test-1:').replace('fail: false',
+ 'fail: true')
+ updated_template = _template.replace(
+ '{get_attr: [test1',
+ '{get_attr: [test-1').replace('value: test3',
+ 'value: test-3')
+ self.update_stack(stack_identifier,
+ template=updated_template,
+ expected_status='UPDATE_FAILED')
+ self.update_stack(stack_identifier, template=template,
+ expected_status='UPDATE_COMPLETE')