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 jinja2.exceptions import UndefinedError
from ansible.errors import AnsibleParserError from ansible.errors import AnsibleParserError, AnsibleUndefinedVariable
from ansible.parsing.dataloader import DataLoader from ansible.parsing.dataloader import DataLoader
from ansible.playbook.attribute import Attribute, FieldAttribute from ansible.playbook.attribute import Attribute, FieldAttribute
from ansible.utils.boolean import boolean from ansible.utils.boolean import boolean
@ -386,7 +386,7 @@ class Base:
except (TypeError, ValueError) as e: except (TypeError, ValueError) as e:
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s." 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()) " 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': 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." 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()) " The error was: %s" % (name,e), obj=self.get_ds())

View file

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