Add the convergence resource replacement logic
Implements blueprint convergence-resource-replacement Change-Id: I1b04de15d7212c111dd312a93f2798847424c6e3
This commit is contained in:
parent
ad104c51bf
commit
c6bb1f8a07
|
@ -255,9 +255,23 @@ class Resource(object):
|
||||||
return resource, stack
|
return resource, stack
|
||||||
|
|
||||||
def make_replacement(self):
|
def make_replacement(self):
|
||||||
# NOTE(sirushtim): Used for mocking. Will be complete
|
# 1. create the replacement with "replaces" = self.id
|
||||||
# once convergence-resource-replacement is implemented.
|
# Don't set physical_resource_id so that a create is triggered.
|
||||||
pass
|
rs = {'stack_id': self.stack.id,
|
||||||
|
'name': self.name,
|
||||||
|
'properties_data': self._stored_properties_data,
|
||||||
|
'needed_by': self.needed_by,
|
||||||
|
'requires': self.requires,
|
||||||
|
'replaces': self.id,
|
||||||
|
'current_template_id': self.current_template_id,
|
||||||
|
'stack_name': self.stack.name}
|
||||||
|
new_rs = resource_objects.Resource.create(self.context, rs)
|
||||||
|
|
||||||
|
# 2. update the current resource to be replaced_by the one above.
|
||||||
|
rs = resource_objects.Resource.get_obj(self.context, self.id)
|
||||||
|
self.replaced_by = new_rs.id
|
||||||
|
rs.update_and_save({'replaced_by': self.replaced_by})
|
||||||
|
return new_rs.id
|
||||||
|
|
||||||
def reparse(self):
|
def reparse(self):
|
||||||
self.properties = self.t.properties(self.properties_schema,
|
self.properties = self.t.properties(self.properties_schema,
|
||||||
|
|
|
@ -119,9 +119,11 @@ class WorkerService(service.Service):
|
||||||
try:
|
try:
|
||||||
check_resource_update(rsrc, tmpl.id, data)
|
check_resource_update(rsrc, tmpl.id, data)
|
||||||
except resource.UpdateReplace:
|
except resource.UpdateReplace:
|
||||||
# NOTE(sirushtim): Implemented by spec
|
new_res_id = rsrc.make_replacement()
|
||||||
# convergence-resource-replacement.
|
self._rpc_client.check_resource(cnxt,
|
||||||
rsrc.make_replacement()
|
new_res_id,
|
||||||
|
current_traversal,
|
||||||
|
data, is_update)
|
||||||
return
|
return
|
||||||
except resource.UpdateInProgress:
|
except resource.UpdateInProgress:
|
||||||
return
|
return
|
||||||
|
|
|
@ -377,6 +377,18 @@ class ResourceTest(common.HeatTestCase):
|
||||||
self.assertEqual(res.COMPLETE, db_res.status)
|
self.assertEqual(res.COMPLETE, db_res.status)
|
||||||
self.assertEqual('test_update', db_res.status_reason)
|
self.assertEqual('test_update', db_res.status_reason)
|
||||||
|
|
||||||
|
def test_make_replacement(self):
|
||||||
|
tmpl = rsrc_defn.ResourceDefinition('test_resource', 'Foo')
|
||||||
|
res = generic_rsrc.GenericResource('test_res_upd', tmpl, self.stack)
|
||||||
|
res._store()
|
||||||
|
self.assertIsNotNone(res.id)
|
||||||
|
new_id = res.make_replacement()
|
||||||
|
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.nova_instance)
|
||||||
|
|
||||||
def test_parsed_template(self):
|
def test_parsed_template(self):
|
||||||
join_func = cfn_funcs.Join(None,
|
join_func = cfn_funcs.Join(None,
|
||||||
'Fn::Join', [' ', ['bar', 'baz', 'quux']])
|
'Fn::Join', [' ', ['bar', 'baz', 'quux']])
|
||||||
|
|
Loading…
Reference in New Issue