diff --git a/plugins/lookup/guide_role.py b/plugins/lookup/guide_role.py index c3ef01ef10..54774c2a35 100644 --- a/plugins/lookup/guide_role.py +++ b/plugins/lookup/guide_role.py @@ -24,6 +24,7 @@ from ansible.plugins.lookup import LookupBase from plugins.lookup.deployment import running_apps from utils.roles.validation.invokable import list_invokable_app_ids +from utils.templating.vars import resolve_var ENV_VAR = "APP_ID" @@ -60,7 +61,14 @@ class LookupModule(LookupBase): ) -> list[str]: vars_ = variables or getattr(self._templar, "available_variables", {}) or {} application_id = ( - str(terms[0]) if terms else str(vars_.get("application_id", "")) + str(terms[0]) + if terms + else str( + resolve_var( + getattr(self, "_templar", None), vars_.get("application_id") + ) + or "" + ) ) return [ guide_role( diff --git a/tests/unit/python/plugins/lookup/test_guide_role.py b/tests/unit/python/plugins/lookup/test_guide_role.py index 313571345b..28e06fcfc2 100644 --- a/tests/unit/python/plugins/lookup/test_guide_role.py +++ b/tests/unit/python/plugins/lookup/test_guide_role.py @@ -9,6 +9,14 @@ INVOKABLE = ["web-app-docs", "web-app-nextcloud", "svc-db-postgres", "dsk-gnt-cl NO_PIN = {ENV_VAR: ""} +class _Templar: + def __init__(self, resolved): + self._resolved = resolved + + def template(self, value): + return self._resolved.get(value, value) + + class TestGuideRole(unittest.TestCase): def test_the_only_invokable_peer_wins(self): self.assertEqual( @@ -116,6 +124,23 @@ class TestGuideRoleLookup(unittest.TestCase): ) self.assertEqual(result, ["web-app-docs"]) + @patch.dict(os.environ, NO_PIN) + @patch("plugins.lookup.guide_role.list_invokable_app_ids") + def test_a_variable_that_is_still_a_template_is_resolved(self, invokable): + """The play holds application_id raw, so a role that sets it from + another variable would otherwise be compared as '{{ ... }}'.""" + invokable.return_value = INVOKABLE + lookup = LookupModule() + lookup._templar = _Templar({"{{ stack_app }}": "web-app-docs"}) + result = lookup.run( + [], + variables={ + "application_id": "{{ stack_app }}", + "group_names": ["web-app-docs", "web-app-nextcloud"], + }, + ) + self.assertEqual(result, ["web-app-nextcloud"]) + @patch.dict(os.environ, {ENV_VAR: " dsk-gnt-claude "}) @patch("plugins.lookup.guide_role.list_invokable_app_ids") def test_the_environment_pins_the_role(self, invokable):