Merge "Calculate convergence required_by from graph in Stack"

This commit is contained in:
Zuul 2018-06-19 04:39:45 +00:00 committed by Gerrit Code Review
commit 418ef9c4a2
2 changed files with 18 additions and 2 deletions

View File

@ -761,8 +761,8 @@ class Resource(status.ResourceStatus):
reqd_by = self.stack.dependencies.required_by(self)
except KeyError:
if self.stack.convergence:
# for convergence, fall back to building from needed_by
needed_by_ids = self.needed_by or set()
# for convergence, fall back to building from node graph
needed_by_ids = self.stack.dependent_resource_ids(self.id)
reqd_by = [r for r in self.stack.resources.values()
if r.id in needed_by_ids]
else:

View File

@ -1516,6 +1516,22 @@ class Stack(collections.Mapping):
return self._convg_deps
def dependent_resource_ids(self, resource_id):
"""Return a set of resource IDs that are dependent on another.
Given a resource ID, return a set of all other resource IDs that are
dependent on that one - that is to say, those that must be cleaned up
before the given resource is cleaned up.
"""
assert self.convergence, 'Invalid call for non-convergence stack'
clean_node = ConvergenceNode(resource_id, False)
deps = self.convergence_dependencies
if clean_node not in deps:
return set()
# Looking for the cleanup node, so use requires instead of required_by
dep_nodes = deps.requires(clean_node)
return set(n.rsrc_id for n in dep_nodes if not n.is_update)
def reset_stack_and_resources_in_progress(self, reason):
for name, rsrc in six.iteritems(self.resources):
if rsrc.status == rsrc.IN_PROGRESS: