Ansible Errors, Don't hide stacked messages when yaml (#83933) (#83999)

Also remove redundant msg now that we fixed yaml case
So no more need to %s % e.

Co-authored-by: Abhijeet Kasurde <akasurde@redhat.com>
(cherry picked from commit 0c8efa29b2)
pull/84025/head
Brian Coca 2 months ago committed by GitHub
parent d954d15543
commit f0badf8970
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,2 @@
bugfixes:
- Errors now preserve stacked error messages even when YAML is involved.

@ -66,14 +66,18 @@ class AnsibleError(Exception):
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
message = [self._message] message = [self._message]
# Add from previous exceptions
if self.orig_exc:
message.append('. %s' % to_native(self.orig_exc))
# Add from yaml to give specific file/line no
if isinstance(self.obj, AnsibleBaseYAMLObject): if isinstance(self.obj, AnsibleBaseYAMLObject):
extended_error = self._get_extended_error() extended_error = self._get_extended_error()
if extended_error and not self._suppress_extended_error: if extended_error and not self._suppress_extended_error:
message.append( message.append(
'\n\n%s' % to_native(extended_error) '\n\n%s' % to_native(extended_error)
) )
elif self.orig_exc:
message.append('. %s' % to_native(self.orig_exc))
return ''.join(message) return ''.join(message)

@ -18,7 +18,7 @@ from ansible import context
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable, AnsibleAssertionError from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable, AnsibleAssertionError
from ansible.module_utils.six import string_types from ansible.module_utils.six import string_types
from ansible.module_utils.parsing.convert_bool import boolean from ansible.module_utils.parsing.convert_bool import boolean
from ansible.module_utils.common.text.converters import to_text, to_native from ansible.module_utils.common.text.converters import to_text
from ansible.parsing.dataloader import DataLoader from ansible.parsing.dataloader import DataLoader
from ansible.playbook.attribute import Attribute, FieldAttribute, ConnectionFieldAttribute, NonInheritableFieldAttribute from ansible.playbook.attribute import Attribute, FieldAttribute, ConnectionFieldAttribute, NonInheritableFieldAttribute
from ansible.plugins.loader import module_loader, action_loader from ansible.plugins.loader import module_loader, action_loader
@ -560,14 +560,14 @@ class FieldAttributeBase:
setattr(self, name, value) setattr(self, name, value)
except (TypeError, ValueError) as e: except (TypeError, ValueError) as e:
value = getattr(self, name) value = getattr(self, name)
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to %s. " raise AnsibleParserError(f"the field '{name}' has an invalid value ({value!r}), and could not be converted to {attribute.isa}.",
"The error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds(), orig_exc=e) obj=self.get_ds(), orig_exc=e)
except (AnsibleUndefinedVariable, 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':
if name == 'args': if name == 'args':
msg = "The task includes an option with an undefined variable. The error was: %s" % (to_native(e)) msg = "The task includes an option with an undefined variable."
else: else:
msg = "The field '%s' has an invalid value, which includes an undefined variable. The error was: %s" % (name, to_native(e)) msg = f"The field '{name}' has an invalid value, which includes an undefined variable."
raise AnsibleParserError(msg, obj=self.get_ds(), orig_exc=e) raise AnsibleParserError(msg, obj=self.get_ds(), orig_exc=e)
self._finalized = True self._finalized = True

@ -714,7 +714,9 @@
- name: check that proper error message is emitted when in operator is used - name: check that proper error message is emitted when in operator is used
assert: assert:
that: "\"The error was: 'y' is undefined\n\n\" in error.msg" that:
- '"The task includes an option with an undefined variable" in error.msg'
- "\"'y' is undefined\n\n\" in error.msg"
- template: - template:
src: template_import_macro_globals.j2 src: template_import_macro_globals.j2

Loading…
Cancel
Save