From e89f8bae86518d9b3548b9744046817751336fa7 Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Wed, 10 Apr 2019 10:35:31 -0500 Subject: [PATCH] Extend jinja2 nested undefined support to keys/indices (#55094) --- .../jinja2_nested_undefined_getitem.yaml | 2 ++ lib/ansible/template/__init__.py | 4 ++++ .../targets/template/tasks/main.yml | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 changelogs/fragments/jinja2_nested_undefined_getitem.yaml diff --git a/changelogs/fragments/jinja2_nested_undefined_getitem.yaml b/changelogs/fragments/jinja2_nested_undefined_getitem.yaml new file mode 100644 index 0000000000..27c6865fbd --- /dev/null +++ b/changelogs/fragments/jinja2_nested_undefined_getitem.yaml @@ -0,0 +1,2 @@ +minor_changes: +- jinja2 - accesses to keys/indices on an undefined value now return further undefined values rather than throwing an exception diff --git a/lib/ansible/template/__init__.py b/lib/ansible/template/__init__.py index a3e6af1062..c5256c218c 100644 --- a/lib/ansible/template/__init__.py +++ b/lib/ansible/template/__init__.py @@ -207,6 +207,10 @@ class AnsibleUndefined(StrictUndefined): # Return original Undefined object to preserve the first failure context return self + def __getitem__(self, key): + # Return original Undefined object to preserve the first failure context + return self + def __repr__(self): return 'AnsibleUndefined' diff --git a/test/integration/targets/template/tasks/main.yml b/test/integration/targets/template/tasks/main.yml index 64d08fe32c..6fd25e1095 100644 --- a/test/integration/targets/template/tasks/main.yml +++ b/test/integration/targets/template/tasks/main.yml @@ -666,6 +666,24 @@ - list_var.0.foo.bar | default('DEFAULT') == 'DEFAULT' - list_var.1.foo is not defined - list_var.1.foo | default('DEFAULT') == 'DEFAULT' + - dict_var is defined + - dict_var['bar'] is defined + - dict_var['bar']['baz'] is not defined + - dict_var['bar']['baz'] | default('DEFAULT') == 'DEFAULT' + - dict_var['bar']['baz']['abc'] is not defined + - dict_var['bar']['baz']['abc'] | default('DEFAULT') == 'DEFAULT' + - dict_var['baz'] is not defined + - dict_var['baz']['abc'] is not defined + - dict_var['baz']['abc'] | default('DEFAULT') == 'DEFAULT' + - list_var[0] is defined + - list_var[1] is not defined + - list_var[0]['foo'] is defined + - list_var[0]['foo']['bar'] is not defined + - list_var[0]['foo']['bar'] | default('DEFAULT') == 'DEFAULT' + - list_var[1]['foo'] is not defined + - list_var[1]['foo'] | default('DEFAULT') == 'DEFAULT' + - dict_var['bar'].baz is not defined + - dict_var['bar'].baz | default('DEFAULT') == 'DEFAULT' - template: src: template_destpath_test.j2