Esempio n. 1
0
    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))
Esempio n. 2
0
 def mock_execute(self, cmd):
     if 'current_user' in cmd:
         raise ProgrammingError()
     return self.execute(cmd)
Esempio n. 3
0
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"))