Streamline conversion of resources to convergence

Use a single write to the database to convert each resource. Add a
method to the versioned object class that encapsulates the DB-specific
information, and get rid of the Resource.set_requires() classmethod that
just calls a method on the versioned object instance that's passed to
it.

Change-Id: Ieca7e0f0642c38c44fb8d7729333a0ccd93c9cb4
This commit is contained in:
Zane Bitter 2018-04-26 14:57:16 -04:00
parent 7cdadf1155
commit 8260579b2c
3 changed files with 19 additions and 25 deletions

View File

@ -531,13 +531,6 @@ class Resource(status.ResourceStatus):
"""
pass
@classmethod
def set_requires(cls, db_rsrc, requires):
if db_rsrc:
db_rsrc.update_and_save(
{'requires': requires}
)
def _break_if_required(self, action, hook):
"""Block the resource until the hook is cleared if there is one."""
if self.stack.env.registry.matches_hook(self.name, hook):

View File

@ -1498,14 +1498,6 @@ class Stack(collections.Mapping):
rsrcs[existing_rsrc_db.name] = existing_rsrc_db
return rsrcs
def set_resource_deps(self):
curr_name_translated_dep = self.dependencies.translate(lambda res:
res.id)
ext_rsrcs_db = self.db_active_resources_get()
for r in self.dependencies:
r.requires = list(curr_name_translated_dep.requires(r.id))
resource.Resource.set_requires(ext_rsrcs_db[r.id], r.requires)
def _compute_convg_dependencies(self, existing_resources,
current_template_deps, current_resources):
def make_graph_key(rsrc):
@ -2238,21 +2230,24 @@ class Stack(collections.Mapping):
return False
def migrate_to_convergence(self):
values = {'current_template_id': self.t.id}
db_rsrcs = self.db_active_resources_get()
res_id_dep = self.dependencies.translate(lambda res: res.id)
current_template_id = self.t.id
if db_rsrcs is not None:
for res in db_rsrcs.values():
# delete db resources not in current_template_id
try:
self.defn.resource_definition(res.name)
except KeyError:
for db_res in db_rsrcs.values():
requires = set(res_id_dep.requires(db_res.id))
r = self.resources.get(db_res.name)
if r is None:
# delete db resources not in current_template_id
LOG.warning("Resource %(res)s not found in template "
"for stack %(st)s, deleting from db.",
{'res': res.name, 'st': self.id})
resource_objects.Resource.delete(self.context, res.id)
{'res': db_res.name, 'st': self.id})
resource_objects.Resource.delete(self.context, db_res.id)
else:
res.update_and_save(values=values)
self.set_resource_deps()
r.requires = requires
db_res.convert_to_convergence(current_template_id,
requires)
self.current_traversal = uuidutils.generate_uuid()
self.convergence = True
prev_raw_template_id = self.prev_raw_template_id

View File

@ -340,6 +340,12 @@ class Resource(
self._context,
resource_db)
def convert_to_convergence(self, current_template_id, requires):
return self.update_and_save({
'current_template_id': current_template_id,
'requires': sorted(requires, reverse=True),
})
@staticmethod
def encrypt_properties_data(data):
if cfg.CONF.encrypt_parameters_and_properties and data: