def _request(self, method, path, server=None, **kwargs): """Execute a request to the cluster A server is selected from the server pool. """ while True: next_server = server or self._get_server() try: response = self.server_pool[next_server].request( method, path, **kwargs) redirect_location = response.get_redirect_location() if redirect_location and 300 <= response.status <= 308: redirect_server = _server_url(redirect_location) self._add_server(redirect_server) return self._request(method, path, server=redirect_server, **kwargs) if not server and response.status in SRV_UNAVAILABLE_STATUSES: with self._lock: # drop server from active ones self._drop_server(next_server, response.reason) else: return response except ( urllib3.exceptions.MaxRetryError, urllib3.exceptions.ReadTimeoutError, urllib3.exceptions.SSLError, urllib3.exceptions.HTTPError, urllib3.exceptions.ProxyError, ) as ex: ex_message = _ex_to_message(ex) if server: raise ConnectionError( "Server not available, exception: %s" % ex_message) with self._lock: # drop server from active ones self._drop_server(next_server, ex_message) except Exception as e: raise ProgrammingError(_ex_to_message(e))
def mock_execute(self, cmd): if 'current_user' in cmd: raise ProgrammingError() return self.execute(cmd)
def _json_from_response(response): try: return json.loads(six.text_type(response.data, 'utf-8')) except ValueError: raise ProgrammingError("Invalid server response of content-type '%s'" % response.headers.get("content-type", "unknown"))