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:
parent
7cdadf1155
commit
8260579b2c
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user