diff --git a/heat/engine/resource.py b/heat/engine/resource.py index b964805d0b..e4074fbe2c 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -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): diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 448d7c26db..8314814af1 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -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 diff --git a/heat/objects/resource.py b/heat/objects/resource.py index ef4992ac50..3aba3405f1 100644 --- a/heat/objects/resource.py +++ b/heat/objects/resource.py @@ -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: