summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Borean <jborean93@gmail.com>2018-12-07 04:11:44 +1000
committerMatt Davis <nitzmahone@users.noreply.github.com>2018-12-06 10:11:44 -0800
commit6713c3bcfd33e20f00ec5e0f9391e4cb865df518 (patch)
treeefb769d719e1e80fbc873b483743f798e19b670d
parent8c3f78069356b2777116442c9f944c7e8d4a6db3 (diff)
downloadansible-6713c3bcfd33e20f00ec5e0f9391e4cb865df518.tar.gz
ansible-test: recursively scan setup dependencies (#49170) (#49216)
* ansible-test: recursively scan setup dependencies * removed need for default set() (cherry picked from commit 694c505452790d0a55413b3ac157d3dbf6be1ebb)
-rw-r--r--test/runner/lib/target.py24
1 files changed, 21 insertions, 3 deletions
diff --git a/test/runner/lib/target.py b/test/runner/lib/target.py
index 5713562ce5..f2c5540302 100644
--- a/test/runner/lib/target.py
+++ b/test/runner/lib/target.py
@@ -340,8 +340,9 @@ def analyze_integration_target_dependencies(integration_targets):
:type integration_targets: list[IntegrationTarget]
:rtype: dict[str,set[str]]
"""
- hidden_role_target_names = set(t.name for t in integration_targets if t.type == 'role' and 'hidden/' in t.aliases)
- normal_role_targets = [t for t in integration_targets if t.type == 'role' and 'hidden/' not in t.aliases]
+ role_targets = [t for t in integration_targets if t.type == 'role']
+ hidden_role_target_names = set(t.name for t in role_targets if 'hidden/' in t.aliases)
+
dependencies = collections.defaultdict(set)
# handle setup dependencies
@@ -350,7 +351,7 @@ def analyze_integration_target_dependencies(integration_targets):
dependencies[setup_target_name].add(target.name)
# intentionally primitive analysis of role meta to avoid a dependency on pyyaml
- for role_target in normal_role_targets:
+ for role_target in role_targets:
meta_dir = os.path.join(role_target.path, 'meta')
if not os.path.isdir(meta_dir):
@@ -374,6 +375,23 @@ def analyze_integration_target_dependencies(integration_targets):
if hidden_target_name in meta_line:
dependencies[hidden_target_name].add(role_target.name)
+ while True:
+ changes = 0
+
+ for dummy, dependent_target_names in dependencies.items():
+ for dependent_target_name in list(dependent_target_names):
+ new_target_names = dependencies.get(dependent_target_name)
+
+ if new_target_names:
+ for new_target_name in new_target_names:
+ if new_target_name not in dependent_target_names:
+ dependent_target_names.add(new_target_name)
+ changes += 1
+ dependent_target_names.remove(dependent_target_name)
+
+ if not changes:
+ break
+
return dependencies