From 0ad4b7b7853fdae62020f8524ba3e038ca399680 Mon Sep 17 00:00:00 2001 From: Nathaniel Case Date: Thu, 24 May 2018 14:25:19 -0400 Subject: [PATCH] Fixes to httpapi for EAPI (#40675) * Replace errant uses of str * Hook up become to eapi * Hook become up to nxapi, too --- lib/ansible/modules/network/eos/eos_banner.py | 4 ++-- lib/ansible/plugins/connection/httpapi.py | 11 ++++----- lib/ansible/plugins/httpapi/eos.py | 23 ++++++++++++++----- lib/ansible/plugins/httpapi/nxos.py | 15 ++++++++++-- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/lib/ansible/modules/network/eos/eos_banner.py b/lib/ansible/modules/network/eos/eos_banner.py index bec70da2ba..18d12d5807 100644 --- a/lib/ansible/modules/network/eos/eos_banner.py +++ b/lib/ansible/modules/network/eos/eos_banner.py @@ -100,7 +100,7 @@ def map_obj_to_commands(updates, module): state = module.params['state'] if state == 'absent' and have.get('text'): - if isinstance(have['text'], str): + if isinstance(have['text'], string_types): commands.append('no banner %s' % module.params['banner']) elif have['text'].get('loginBanner') or have['text'].get('motd'): commands.append({'cmd': 'no banner %s' % module.params['banner']}) @@ -147,7 +147,7 @@ def map_config_to_obj(module): def map_params_to_obj(module): text = module.params['text'] if text: - text = str(text).strip() + text = to_text(text).strip() return { 'banner': module.params['banner'], diff --git a/lib/ansible/plugins/connection/httpapi.py b/lib/ansible/plugins/connection/httpapi.py index 05c8d52f50..ed8fd6a3f1 100644 --- a/lib/ansible/plugins/connection/httpapi.py +++ b/lib/ansible/plugins/connection/httpapi.py @@ -188,6 +188,8 @@ class Connection(ConnectionBase): self._httpapi = httpapi_loader.get(network_os, self) if self._httpapi: + if hasattr(self._httpapi, 'set_become'): + self._httpapi.set_become(play_context) display.vvvv('loaded API plugin for network_os %s' % network_os, host=self._play_context.remote_addr) else: raise AnsibleConnectionFailure('unable to load API plugin for network_os %s' % network_os) @@ -229,13 +231,8 @@ class Connection(ConnectionBase): play_context.deserialize(pc_data) messages = ['updating play_context for connection'] - if self._play_context.become is False and play_context.become is True: - self._enable = True - messages.append('authorizing connection') - - elif self._play_context.become is True and not play_context.become: - self._enable = False - messages.append('deauthorizing connection') + if self._play_context.become ^ play_context.become: + self._httpapi.set_become(play_context) self._play_context = play_context return messages diff --git a/lib/ansible/plugins/httpapi/eos.py b/lib/ansible/plugins/httpapi/eos.py index ad4fa8b0f8..d659903a49 100644 --- a/lib/ansible/plugins/httpapi/eos.py +++ b/lib/ansible/plugins/httpapi/eos.py @@ -21,11 +21,13 @@ except ImportError: class HttpApi: def __init__(self, connection): self.connection = connection + self._become = False def send_request(self, data, **message_kwargs): - if 'become' in message_kwargs: + data = to_list(data) + if self._become: display.vvvv('firing event: on_become') - # TODO ??? self._terminal.on_become(passwd=auth_pass) + data.insert(0, {"cmd": "enable", "input": self._become_pass}) output = message_kwargs.get('output', 'text') request = request_builder(data, output) @@ -33,12 +35,23 @@ class HttpApi: response = self.connection.send('/command-api', request, headers=headers, method='POST') response = json.loads(to_text(response.read())) - return handle_response(response) + results = handle_response(response) + + if self._become: + results = results[1:] + if len(results) == 1: + results = results[0] + + return results def get_prompt(self): # Hack to keep @enable_mode working return '#' + def set_become(self, play_context): + self._become = play_context.become + self._become_pass = getattr(play_context, 'become_pass') or '' + # Imported from module_utils def edit_config(self, config, commit=False, replace=False): """Loads the configuration onto the remote devices @@ -148,11 +161,9 @@ def handle_response(response): else: results.append(json.dumps(result)) - if len(results) == 1: - return results[0] return results def request_builder(commands, output, reqid=None): - params = dict(version=1, cmds=to_list(commands), format=output) + params = dict(version=1, cmds=commands, format=output) return json.dumps(dict(jsonrpc='2.0', id=reqid, method='runCmds', params=params)) diff --git a/lib/ansible/plugins/httpapi/nxos.py b/lib/ansible/plugins/httpapi/nxos.py index a9b37d729e..2a49257823 100644 --- a/lib/ansible/plugins/httpapi/nxos.py +++ b/lib/ansible/plugins/httpapi/nxos.py @@ -22,12 +22,19 @@ class HttpApi: self.connection = connection def _run_queue(self, queue, output): + if self._become: + display.vvvv('firing event: on_become') + queue.insert(0, 'enable') request = request_builder(queue, output) - headers = {'Content-Type': 'application/json'} + response = self.connection.send('/ins', request, headers=headers, method='POST') response = json.loads(to_text(response.read())) - return handle_response(response) + results = handle_response(response) + + if self._become: + results = results[1:] + return results def send_request(self, data, **message_kwargs): output = None @@ -62,6 +69,10 @@ class HttpApi: return responses[0] return responses + def set_become(self, play_context): + self._become = play_context.become + self._become_pass = getattr(play_context, 'become_pass') or '' + # Migrated from module_utils def edit_config(self, command): responses = self.send_request(command, output='config')