fix(domain-filters): support dependency expansion via seed param

- Added missing 'Iterable' import in 'canonical_domains_map' to avoid NameError.
- Introduced 'seed' parameter so the filter can start traversal from current play apps
  while still emitting canonical domains for discovered dependencies (e.g. web-svc-collabora).
- Updated 01_constructor.yml to pass full 'applications' and a clean 'seed' list
  (using dict2items → key) instead of '.keys()' method calls, fixing integration
  test error: 'reference to application keys is invalid'.

This resolves issues where collabora domains were missing and integration tests failed.

Ref: https://chatgpt.com/share/68a51f9b-3924-800f-a41b-803d8dd10397
This commit is contained in:
Kevin Veen-Birkenbach 2025-08-20 03:07:14 +02:00
parent b867a52471
commit 6d70f78989
No known key found for this signature in database
GPG Key ID: 44D8F11FD62F878E
2 changed files with 17 additions and 8 deletions

View File

@ -5,6 +5,7 @@ import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from module_utils.entity_name_utils import get_entity_name
from module_utils.role_dependency_resolver import RoleDependencyResolver
from typing import Iterable
class FilterModule(object):
@ -18,6 +19,7 @@ class FilterModule(object):
*,
recursive: bool = False,
roles_base_dir: str | None = None,
seed: Iterable[str] | None = None,
):
"""
Build { app_id: [canonical domains...] }.
@ -28,7 +30,8 @@ class FilterModule(object):
if not isinstance(apps, dict):
raise AnsibleFilterError(f"'apps' must be a dict, got {type(apps).__name__}")
app_keys = set(apps.keys())
app_keys = set(apps.keys())
seed_keys = set(seed) if seed is not None else app_keys
if recursive:
roles_base_dir = roles_base_dir or os.path.join(os.getcwd(), "roles")
@ -38,18 +41,18 @@ class FilterModule(object):
)
resolver = RoleDependencyResolver(roles_base_dir)
# WICHTIG: resolve_run_after=False (hart)
discovered_roles = resolver.resolve_transitively(
start_roles=app_keys,
start_roles=seed_keys,
resolve_include_role=True,
resolve_import_role=True,
resolve_dependencies=True,
resolve_run_after=False,
max_depth=None,
)
# all discovered roles that actually have config entries in `apps`
target_apps = discovered_roles & app_keys
else:
target_apps = app_keys
target_apps = seed_keys
result = {}
seen_domains = {}

View File

@ -41,10 +41,16 @@
- name: Merge current play domain definitions
set_fact:
current_play_domains: >-
{{ current_play_applications |
canonical_domains_map(PRIMARY_DOMAIN) |
combine(domains | default({}, true), recursive=True)
current_play_domains: >-
{{
applications
| canonical_domains_map(
PRIMARY_DOMAIN,
recursive=True,
roles_base_dir=([ playbook_dir, 'roles' ] | path_join),
seed=(current_play_applications | dict2items | map(attribute='key') | list)
)
| combine(domains | default({}, true), recursive=True)
}}
- name: Merge domain definitions for all domains