Refactor exclude_nested_providers()
Because exclude_nested_providers() had several iteration loops that were redundant, this patch refactors it. Change-Id: I3e7b222c8e6c278d1b66a1068a9f05b70c41428a
This commit is contained in:
parent
768cc88902
commit
3a732f8715
@ -262,39 +262,29 @@ class RequestWideSearchContext(object):
|
|||||||
"""
|
"""
|
||||||
if self._nested_aware or not self.has_trees:
|
if self._nested_aware or not self.has_trees:
|
||||||
return allocation_requests, provider_summaries
|
return allocation_requests, provider_summaries
|
||||||
# Build a temporary dict, keyed by root RP UUID of sets of UUIDs of all
|
|
||||||
# RPs in that tree.
|
|
||||||
tree_rps_by_root = collections.defaultdict(set)
|
|
||||||
for ps in provider_summaries:
|
|
||||||
rp_uuid = ps.resource_provider.uuid
|
|
||||||
root_uuid = ps.resource_provider.root_provider_uuid
|
|
||||||
tree_rps_by_root[root_uuid].add(rp_uuid)
|
|
||||||
# We use this to get a list of sets of providers in each tree
|
|
||||||
tree_sets = list(tree_rps_by_root.values())
|
|
||||||
|
|
||||||
for a_req in allocation_requests[:]:
|
filtered_areqs = []
|
||||||
alloc_rp_uuids = set([
|
|
||||||
arr.resource_provider.uuid for arr in a_req.resource_requests])
|
|
||||||
# If more than one allocation is provided by the same tree, kill
|
|
||||||
# that allocation request.
|
|
||||||
if any(len(tree_set & alloc_rp_uuids) > 1 for tree_set in
|
|
||||||
tree_sets):
|
|
||||||
allocation_requests.remove(a_req)
|
|
||||||
|
|
||||||
# Exclude eliminated providers from the provider summaries.
|
|
||||||
all_rp_uuids = set()
|
all_rp_uuids = set()
|
||||||
for a_req in allocation_requests:
|
for a_req in allocation_requests:
|
||||||
all_rp_uuids |= set(
|
root_by_rp = {
|
||||||
arr.resource_provider.uuid for arr in a_req.resource_requests)
|
arr.resource_provider.uuid:
|
||||||
for ps in provider_summaries[:]:
|
arr.resource_provider.root_provider_uuid
|
||||||
if ps.resource_provider.uuid not in all_rp_uuids:
|
for arr in a_req.resource_requests}
|
||||||
provider_summaries.remove(ps)
|
# If more than one allocation is provided by the same tree,
|
||||||
|
# we need to skip that allocation request.
|
||||||
|
if len(root_by_rp) == len(set(root_by_rp.values())):
|
||||||
|
filtered_areqs.append(a_req)
|
||||||
|
all_rp_uuids |= set(root_by_rp)
|
||||||
|
|
||||||
|
# Exclude eliminated providers from the provider summaries.
|
||||||
|
filtered_summaries = [ps for ps in provider_summaries
|
||||||
|
if ps.resource_provider.uuid in all_rp_uuids]
|
||||||
|
|
||||||
LOG.debug(
|
LOG.debug(
|
||||||
'Excluding nested providers yields %d allocation requests and '
|
'Excluding nested providers yields %d allocation requests and '
|
||||||
'%d provider summaries', len(allocation_requests),
|
'%d provider summaries', len(filtered_areqs),
|
||||||
len(provider_summaries))
|
len(filtered_summaries))
|
||||||
return allocation_requests, provider_summaries
|
return filtered_areqs, filtered_summaries
|
||||||
|
|
||||||
def limit_results(self, alloc_request_objs, summary_objs):
|
def limit_results(self, alloc_request_objs, summary_objs):
|
||||||
# Limit the number of allocation request objects. We do this after
|
# Limit the number of allocation request objects. We do this after
|
||||||
|
Loading…
Reference in New Issue
Block a user