Properly wrap objects using json default encoder

Our custom encoder for the to_json filter was simply returning the
object if it was not a HostVars object, leading in some cases to a
TypeError when the data contained an undefined variable. This lead
to an odd error message being propagated up, so we now properly catch
this as an undefined variable error.

Fixes #15610

(cherry picked from commit c24c0f5f6b)
This commit is contained in:
James Cammarata 2016-06-23 09:17:06 -05:00
parent cb520bd86a
commit 7da2265e10
2 changed files with 3 additions and 3 deletions

View file

@ -31,7 +31,7 @@ from ansible.compat.six import iteritems, string_types
from jinja2.exceptions import UndefinedError
from ansible.errors import AnsibleParserError
from ansible.errors import AnsibleParserError, AnsibleUndefinedVariable
from ansible.parsing.dataloader import DataLoader
from ansible.playbook.attribute import Attribute, FieldAttribute
from ansible.utils.boolean import boolean
@ -386,7 +386,7 @@ class Base:
except (TypeError, ValueError) as e:
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s."
" Error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds())
except UndefinedError as e:
except (AnsibleUndefinedVariable, UndefinedError) as e:
if templar._fail_on_undefined_errors and name != 'name':
raise AnsibleParserError("the field '%s' has an invalid value, which appears to include a variable that is undefined."
" The error was: %s" % (name,e), obj=self.get_ds())

View file

@ -68,7 +68,7 @@ class AnsibleJSONEncoder(json.JSONEncoder):
if isinstance(o, HostVars):
return dict(o)
else:
return o
return json.JSONEncoder.default(o)
def to_yaml(a, *args, **kw):
'''Make verbose, human readable yaml'''