diff --git a/lib/ansible/plugins/connection/httpapi.py b/lib/ansible/plugins/connection/httpapi.py index ed13aa0e139..70ae0cc6ae1 100644 --- a/lib/ansible/plugins/connection/httpapi.py +++ b/lib/ansible/plugins/connection/httpapi.py @@ -206,12 +206,12 @@ class Connection(NetworkConnectionBase): httpapi = httpapi_loader.get(self._network_os, self) if httpapi: + display.vvvv('loaded API plugin for network_os %s' % self._network_os, host=self._play_context.remote_addr) + self._implementation_plugins.append(httpapi) httpapi.set_become(self._play_context) httpapi.login(self.get_option('remote_user'), self.get_option('password')) - display.vvvv('loaded API plugin for network_os %s' % self._network_os, host=self._play_context.remote_addr) else: raise AnsibleConnectionFailure('unable to load API plugin for network_os %s' % self._network_os) - self._implementation_plugins.append(httpapi) cliconf = cliconf_loader.get(self._network_os, self) if cliconf: @@ -258,7 +258,9 @@ class Connection(NetworkConnectionBase): return self.send(path, data, **kwargs) raise AnsibleConnectionFailure('Could not connect to {0}: {1}'.format(self._url, exc.reason)) - # Try to assign a new auth token if one is given - self._auth = self.update_auth(response) or self._auth + response_text = response.read() - return response + # Try to assign a new auth token if one is given + self._auth = self.update_auth(response, response_text) or self._auth + + return response, response_text diff --git a/lib/ansible/plugins/httpapi/__init__.py b/lib/ansible/plugins/httpapi/__init__.py index e1794e2554f..0fa89d67e76 100644 --- a/lib/ansible/plugins/httpapi/__init__.py +++ b/lib/ansible/plugins/httpapi/__init__.py @@ -36,7 +36,7 @@ class HttpApiBase(AnsiblePlugin): """ pass - def update_auth(self, response): + def update_auth(self, response, response_text): """Return per-request auth token. The response should be a dictionary that can be plugged into the diff --git a/lib/ansible/plugins/httpapi/eos.py b/lib/ansible/plugins/httpapi/eos.py index 638c96fb118..2e40c947576 100644 --- a/lib/ansible/plugins/httpapi/eos.py +++ b/lib/ansible/plugins/httpapi/eos.py @@ -30,14 +30,13 @@ class HttpApi(HttpApiBase): request = request_builder(data, output) headers = {'Content-Type': 'application/json-rpc'} - response = self.connection.send('/command-api', request, headers=headers, method='POST') - response_text = to_text(response.read()) + response, response_text = self.connection.send('/command-api', request, headers=headers, method='POST') try: - response = json.loads(response_text) + response_text = json.loads(response_text) except ValueError: raise ConnectionError('Response was not valid JSON, got {0}'.format(response_text)) - results = handle_response(response) + results = handle_response(response_text) if self._become: results = results[1:] @@ -50,8 +49,7 @@ class HttpApi(HttpApiBase): # Fake a prompt for @enable_mode if self._become: return '#' - else: - return '>' + return '>' # Imported from module_utils def edit_config(self, config, commit=False, replace=False): @@ -113,7 +111,13 @@ class HttpApi(HttpApiBase): responses = list() def run_queue(queue, output): - response = to_list(self.send_request(queue, output=output)) + try: + response = to_list(self.send_request(queue, output=output)) + except Exception as exc: + if check_rc: + raise + return to_text(exc) + if output == 'json': response = [json.loads(item) for item in response] return response diff --git a/lib/ansible/plugins/httpapi/nxos.py b/lib/ansible/plugins/httpapi/nxos.py index 4d03d7725d5..45958bb7f80 100644 --- a/lib/ansible/plugins/httpapi/nxos.py +++ b/lib/ansible/plugins/httpapi/nxos.py @@ -27,14 +27,13 @@ class HttpApi(HttpApiBase): request = request_builder(queue, output) headers = {'Content-Type': 'application/json'} - response = self.connection.send('/ins', request, headers=headers, method='POST') - response_text = to_text(response.read()) + response, response_text = self.connection.send('/ins', request, headers=headers, method='POST') try: - response = json.loads(response_text) + response_text = json.loads(response_text) except ValueError: raise ConnectionError('Response was not valid JSON, got {0}'.format(response_text)) - results = handle_response(response) + results = handle_response(response_text) if self._become: results = results[1:]