From 9f46f6eb30e7fa2b88f0038c8f7e37c0db6ba6c5 Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Thu, 20 Jan 2022 13:30:42 -0600 Subject: [PATCH] Attempt 2: Catch errors getting filters and tests (#76806) --- changelogs/fragments/74127-bad-filter-2.yml | 5 +++++ lib/ansible/template/__init__.py | 3 +-- .../foo/bar/plugins/filter/bad_collection_filter2.py | 10 ++++++++++ test/integration/targets/jinja_plugins/tasks/main.yml | 4 +++- 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/74127-bad-filter-2.yml create mode 100644 test/integration/targets/jinja_plugins/collections/ansible_collections/foo/bar/plugins/filter/bad_collection_filter2.py diff --git a/changelogs/fragments/74127-bad-filter-2.yml b/changelogs/fragments/74127-bad-filter-2.yml new file mode 100644 index 00000000000..39ef02b0669 --- /dev/null +++ b/changelogs/fragments/74127-bad-filter-2.yml @@ -0,0 +1,5 @@ +bugfixes: +- Templating - Ensure we catch exceptions when getting ``.filters`` and + ``.tests`` attributes on their respective plugins and properly error, + instead of aborting which results in no filters being added to the + jinja2 environment diff --git a/lib/ansible/template/__init__.py b/lib/ansible/template/__init__.py index e5e93237a29..129fb4fcf0e 100644 --- a/lib/ansible/template/__init__.py +++ b/lib/ansible/template/__init__.py @@ -546,9 +546,8 @@ class JinjaPluginIntercept(MutableMapping): except Exception as e: raise TemplateSyntaxError(to_native(e), 0) - method_map = getattr(plugin_impl, self._method_map_name) - try: + method_map = getattr(plugin_impl, self._method_map_name) func_items = method_map().items() except Exception as e: display.warning( diff --git a/test/integration/targets/jinja_plugins/collections/ansible_collections/foo/bar/plugins/filter/bad_collection_filter2.py b/test/integration/targets/jinja_plugins/collections/ansible_collections/foo/bar/plugins/filter/bad_collection_filter2.py new file mode 100644 index 00000000000..96e726ac481 --- /dev/null +++ b/test/integration/targets/jinja_plugins/collections/ansible_collections/foo/bar/plugins/filter/bad_collection_filter2.py @@ -0,0 +1,10 @@ +# Copyright (c) 2021 Matt Martz +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + + +class FilterModule: + pass diff --git a/test/integration/targets/jinja_plugins/tasks/main.yml b/test/integration/targets/jinja_plugins/tasks/main.yml index 012ec9542cf..013baecb2c9 100644 --- a/test/integration/targets/jinja_plugins/tasks/main.yml +++ b/test/integration/targets/jinja_plugins/tasks/main.yml @@ -17,6 +17,8 @@ - | result.stderr|regex_findall('bad_test')|length == 2 - | - result.stderr|regex_findall('bad_collection_filter')|length == 2 + result.stderr|regex_findall('bad_collection_filter')|length == 3 + - | + result.stderr|regex_findall('bad_collection_filter2')|length == 1 - | result.stderr|regex_findall('bad_collection_test')|length == 2