Create replacement resources with correct requires

When we create a replacement resource, do so with the correct requires list
that it will ultimately have, instead of a copy of the old resource's
requires.

This will happen anyway when Resource.create_convergence() is actually
called (which is on the other end of an RPC message, so it may not actually
happen if another transition starts), but this makes it consistent from the
start.

Change-Id: Idf75a55be8d75e55c893ec1fb6ee3704f46bdc4f
This commit is contained in:
Zane Bitter 2017-07-21 21:32:46 -04:00
parent 8edccc98b1
commit ebfe225e41
4 changed files with 10 additions and 7 deletions

View File

@ -110,11 +110,11 @@ class CheckResource(object):
self._handle_failure(cnxt, stack, failure_reason)
def _handle_resource_replacement(self, cnxt,
current_traversal, new_tmpl_id,
current_traversal, new_tmpl_id, requires,
rsrc, stack, adopt_stack_data):
"""Create a replacement resource and trigger a check on it."""
try:
new_res_id = rsrc.make_replacement(new_tmpl_id)
new_res_id = rsrc.make_replacement(new_tmpl_id, requires)
except exception.UpdateInProgress:
LOG.info("No replacement created - "
"resource already locked by new traversal")
@ -145,7 +145,7 @@ class CheckResource(object):
stack, self.msg_queue)
except resource.UpdateReplace:
self._handle_resource_replacement(cnxt, current_traversal,
tmpl.id,
tmpl.id, requires,
rsrc, stack,
adopt_stack_data)
return False

View File

@ -378,7 +378,7 @@ class Resource(status.ResourceStatus):
curr_stack.defn = latest_stk_defn
return resource, initial_stk_defn, curr_stack
def make_replacement(self, new_tmpl_id):
def make_replacement(self, new_tmpl_id, requires):
"""Create a replacement resource in the database.
Returns the DB ID of the new resource, or None if the new resource
@ -392,7 +392,7 @@ class Resource(status.ResourceStatus):
'name': self.name,
'rsrc_prop_data_id': None,
'needed_by': self.needed_by,
'requires': self.requires,
'requires': list(requires),
'replaces': self.id,
'action': self.INIT,
'status': self.COMPLETE,

View File

@ -346,7 +346,8 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
# lets say C is update-replaced
is_update = True
trav_id = self.stack.current_traversal
replacementC_id = resC.make_replacement(self.stack.t.id)
replacementC_id = resC.make_replacement(self.stack.t.id,
set(resC.requires))
replacementC, stack, _ = resource.Resource.load(self.ctx,
replacementC_id,
trav_id,

View File

@ -715,13 +715,15 @@ class ResourceTest(common.HeatTestCase):
res.store()
new_tmpl_id = 2
self.assertIsNotNone(res.id)
new_id = res.make_replacement(new_tmpl_id)
new_requires = {1, 2, 4}
new_id = res.make_replacement(new_tmpl_id, new_requires)
new_res = resource_objects.Resource.get_obj(res.context, new_id)
self.assertEqual(new_id, res.replaced_by)
self.assertEqual(res.id, new_res.replaces)
self.assertIsNone(new_res.physical_resource_id)
self.assertEqual(new_tmpl_id, new_res.current_template_id)
self.assertItemsEqual(list(new_requires), new_res.requires)
def test_metadata_default(self):
tmpl = rsrc_defn.ResourceDefinition('test_resource', 'Foo')