From f1a0918ad31f68d2ac318d2b4860a07bf0f0c2fa Mon Sep 17 00:00:00 2001 From: Nathaniel Case Date: Fri, 20 Jul 2018 11:02:21 -0400 Subject: [PATCH] Eos subnet overlap fix (#43023) * Detect overlapping subnet & provide better errors (cherry picked from commit dba975470d0468ddaa8268d96f65f4cbf94434bf) --- lib/ansible/module_utils/network/eos/eos.py | 6 +++++- lib/ansible/plugins/httpapi/eos.py | 15 +++++++++++++-- lib/ansible/plugins/terminal/eos.py | 3 ++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/ansible/module_utils/network/eos/eos.py b/lib/ansible/module_utils/network/eos/eos.py index de873bb6d5..b7ee53d64f 100644 --- a/lib/ansible/module_utils/network/eos/eos.py +++ b/lib/ansible/module_utils/network/eos/eos.py @@ -382,7 +382,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 b079351d8f..db821e88bf 100644 --- a/lib/ansible/plugins/httpapi/eos.py +++ b/lib/ansible/plugins/httpapi/eos.py @@ -87,7 +87,12 @@ class HttpApi: 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: @@ -153,7 +158,13 @@ class HttpApi: 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 3eb3c15b03..5f6d48dff8 100644 --- a/lib/ansible/plugins/terminal/eos.py +++ b/lib/ansible/plugins/terminal/eos.py @@ -45,7 +45,8 @@ class TerminalModule(TerminalBase): re.compile(br"[^\r\n]+ not found", re.I), 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"% More than \d+ OSPF instance", re.I), + re.compile(br"% Subnet [0-9a-f.:/]+ overlaps", re.I), ] def on_open_shell(self):