diff --git a/lib/ansible/module_utils/network/eos/eos.py b/lib/ansible/module_utils/network/eos/eos.py index 28b37f205f7..d41497a711c 100644 --- a/lib/ansible/module_utils/network/eos/eos.py +++ b/lib/ansible/module_utils/network/eos/eos.py @@ -153,7 +153,7 @@ class Cli: try: response = conn.edit_config(commands, commit, replace) except ConnectionError as exc: - message = getattr(exc, 'err', exc) + message = getattr(exc, 'err', to_text(exc)) if "check mode is not supported without configuration session" in message: self._module.warn("EOS can not check config without config session") response = {'changed': True} @@ -341,7 +341,11 @@ class Eapi: commands = ['configure session %s' % session, 'abort'] self.send_request(commands) err = response['error'] - self._module.fail_json(msg=err['message'], code=err['code']) + error_text = [] + for data in err['data']: + error_text.extend(data.get('errors', [])) + error_text = '\n'.join(error_text) or err['message'] + self._module.fail_json(msg=error_text, code=err['code']) commands = ['configure session %s' % session, 'show session-config diffs'] if commit: diff --git a/lib/ansible/plugins/httpapi/eos.py b/lib/ansible/plugins/httpapi/eos.py index 5a699e23fc9..638c96fb118 100644 --- a/lib/ansible/plugins/httpapi/eos.py +++ b/lib/ansible/plugins/httpapi/eos.py @@ -85,7 +85,12 @@ class HttpApi(HttpApiBase): else: commands.append(command) - response = self.send_request(commands) + try: + response = self.send_request(commands) + except Exception: + commands = ['configure session %s' % session, 'abort'] + response = self.send_request(commands, output='text') + raise commands = ['configure session %s' % session, 'show session-config diffs'] if commit: @@ -152,7 +157,13 @@ class HttpApi(HttpApiBase): def handle_response(response): if 'error' in response: error = response['error'] - raise ConnectionError(error['message'], code=error['code']) + + error_text = [] + for data in error['data']: + error_text.extend(data.get('errors', [])) + error_text = '\n'.join(error_text) or error['message'] + + raise ConnectionError(error_text, code=error['code']) results = [] for result in response['result']: diff --git a/lib/ansible/plugins/terminal/eos.py b/lib/ansible/plugins/terminal/eos.py index 625aab1e0dd..14cd3674923 100644 --- a/lib/ansible/plugins/terminal/eos.py +++ b/lib/ansible/plugins/terminal/eos.py @@ -46,7 +46,8 @@ class TerminalModule(TerminalBase): re.compile(br"'[^']' +returned error code: ?\d+"), re.compile(br"[^\r\n]\/bin\/(?:ba)?sh"), re.compile(br"% More than \d+ OSPF instance", re.I), - re.compile(br"Maximum number of pending sessions has been reached") + re.compile(br"% Subnet [0-9a-f.:/]+ overlaps", re.I), + re.compile(br"Maximum number of pending sessions has been reached"), ] def on_open_shell(self):