templar: ensure that exceptions are handled, fix 'AttributeError' (#48792)

* templar: ensure that exceptions are handled

* Fix AttributeError: object has no attribute 'message'

'message' attribute is deprecated since Python 2.6 and not available
with Python 3.

Simple reproducer:

    - hosts: localhost
      vars:
        not_json: "{{ 'test str' | from_json }}"
      tasks:
        - command: "echo {{ not_json }}"

(cherry picked from commit 62c05033d6)
This commit is contained in:
Pilou 2018-11-29 15:56:23 +01:00 committed by Toshio Kuratomi
parent 91d3857c36
commit 2aa0f366d2
3 changed files with 8 additions and 1 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- Fix AttributeError (Python 3 only) when an exception occurs while rendering a template

View file

@ -108,7 +108,7 @@ class AnsibleJ2Vars(Mapping):
except AnsibleUndefinedVariable: except AnsibleUndefinedVariable:
raise raise
except Exception as e: except Exception as e:
msg = getattr(e, 'message') or to_native(e) msg = getattr(e, 'message', None) or to_native(e)
raise AnsibleError("An unhandled exception occurred while templating '%s'. " raise AnsibleError("An unhandled exception occurred while templating '%s'. "
"Error was a %s, original message: %s" % (to_native(variable), type(e), msg)) "Error was a %s, original message: %s" % (to_native(variable), type(e), msg))

View file

@ -50,6 +50,7 @@ class BaseTemplar(object):
some_unsafe_var=wrap_var("unsafe_blip"), some_unsafe_var=wrap_var("unsafe_blip"),
some_static_unsafe_var=wrap_var("static_unsafe_blip"), some_static_unsafe_var=wrap_var("static_unsafe_blip"),
some_unsafe_keyword=wrap_var("{{ foo }}"), some_unsafe_keyword=wrap_var("{{ foo }}"),
str_with_error="{{ 'str' | from_json }}",
) )
self.fake_loader = DictDataLoader({ self.fake_loader = DictDataLoader({
"/path/to/my_file.txt": "foo\n", "/path/to/my_file.txt": "foo\n",
@ -200,6 +201,10 @@ class TestTemplarTemplate(BaseTemplar, unittest.TestCase):
self.templar.template, self.templar.template,
data) data)
def test_template_with_error(self):
"""Check that AnsibleError is raised, fail if an unhandled exception is raised"""
self.assertRaises(AnsibleError, self.templar.template, "{{ str_with_error }}")
class TestTemplarCleanData(BaseTemplar, unittest.TestCase): class TestTemplarCleanData(BaseTemplar, unittest.TestCase):
def test_clean_data(self): def test_clean_data(self):