def _handle_request_error(self, e): if e.args[0] in [ pycurl.E_COULDNT_CONNECT, pycurl.E_COULDNT_RESOLVE_HOST, pycurl.E_OPERATION_TIMEOUTED, ]: msg = ("Could not connect to Octane. Please check your " "internet connection and try again. If this problem " "persists, you should check Octane's service status at " "https://twitter.com/octanestatus, or let us know at " "[email protected].") should_retry = True elif e.args[0] in [pycurl.E_SSL_CACERT, pycurl.E_SSL_PEER_CERTIFICATE]: msg = ("Could not verify Octane's SSL certificate. Please make " "sure that your network is not intercepting certificates. " "If this problem persists, let us know at " "[email protected].") should_retry = False else: msg = ("Unexpected error communicating with Octane. If this " "problem persists, let us know at [email protected].") should_retry = False msg = textwrap.fill(msg) + "\n\n(Network error: " + e.args[1] + ")" raise error.APIConnectionError(msg, should_retry=should_retry)
def _handle_request_error(self, e, url): if isinstance(e, urlfetch.InvalidURLError): msg = ("The Octane library attempted to fetch an " "invalid URL (%r). This is likely due to a bug " "in the Octane Python bindings. Please let us know " "at [email protected]." % (url, )) elif isinstance(e, urlfetch.DownloadError): msg = "There was a problem retrieving data from Octane." elif isinstance(e, urlfetch.ResponseTooLargeError): msg = ("There was a problem receiving all of your data from " "Octane. This is likely due to a bug in Octane. " "Please let us know at [email protected].") else: msg = ("Unexpected error communicating with Octane. If this " "problem persists, let us know at [email protected].") msg = textwrap.fill(msg) + "\n\n(Network error: " + str(e) + ")" raise error.APIConnectionError(msg)
def _handle_request_error(self, e): # Catch SSL error first as it belongs to ConnectionError, # but we don't want to retry if isinstance(e, requests.exceptions.SSLError): msg = ("Could not verify Octane's SSL certificate. Please make " "sure that your network is not intercepting certificates. " "If this problem persists, let us know at " "[email protected].") err = "%s: %s" % (type(e).__name__, str(e)) should_retry = False # Retry only timeout and connect errors; similar to urllib3 Retry elif isinstance( e, (requests.exceptions.Timeout, requests.exceptions.ConnectionError), ): msg = ("Unexpected error communicating with Octane. " "If this problem persists, let us know at " "[email protected].") err = "%s: %s" % (type(e).__name__, str(e)) should_retry = True # Catch remaining request exceptions elif isinstance(e, requests.exceptions.RequestException): msg = ("Unexpected error communicating with Octane. " "If this problem persists, let us know at " "[email protected].") err = "%s: %s" % (type(e).__name__, str(e)) should_retry = False else: msg = ("Unexpected error communicating with Octane. " "It looks like there's probably a configuration " "issue locally. If this problem persists, let us " "know at [email protected].") err = "A %s was raised" % (type(e).__name__, ) if str(e): err += " with error message %s" % (str(e), ) else: err += " with no error message" should_retry = False msg = textwrap.fill(msg) + "\n\n(Network error: %s)" % (err, ) raise error.APIConnectionError(msg, should_retry=should_retry)
def _handle_request_error(self, e): msg = ( "Unexpected error communicating with Octane. " "If this problem persists, let us know at [email protected].") msg = textwrap.fill(msg) + "\n\n(Network error: " + str(e) + ")" raise error.APIConnectionError(msg)
def test_default_no_retry(self): err = error.APIConnectionError("msg") assert err.should_retry is False err = error.APIConnectionError("msg", should_retry=True) assert err.should_retry
def request_raw(self, method, url, params=None, supplied_headers=None): """ Mechanism for issuing an API call """ if self.api_key: my_api_key = self.api_key else: from octane import api_key my_api_key = api_key if my_api_key is None: raise error.AuthenticationError( "No API key provided. (HINT: set your API key using " '"octane.api_key = <API-KEY>"). You can generate API keys ' "from the Octane web interface. See https://getoctane.io/api " "for details, or email [email protected] if you have any " "questions." ) abs_url = "%s%s" % (self.api_base, url) encoded_params = urlencode(list(_api_encode(params or {}))) # Don't use strict form encoding by changing the square bracket control # characters back to their literals. This is fine by the server, and # makes these parameter strings easier to read. encoded_params = encoded_params.replace("%5B", "[").replace("%5D", "]") if method == "get" or method == "delete": if params: abs_url = _build_api_url(abs_url, encoded_params) post_data = None elif method == "post" or method == "put": post_data = json.dumps(params) else: raise error.APIConnectionError( "Unrecognized HTTP method %r. This may indicate a bug in the " "Octane bindings. Please contact [email protected] for " "assistance." % (method,) ) headers = self.request_headers(my_api_key, method) if supplied_headers is not None: for key, value in six.iteritems(supplied_headers): headers[key] = value util.log_info("Request to Octane api", method=method, path=abs_url) util.log_debug( "Post details", post_data=post_data, api_version=self.api_version, ) rbody, rcode, rheaders = self._client.request_with_retries( method, abs_url, headers, post_data ) util.log_info("Octane API response", path=abs_url, response_code=rcode) util.log_debug("API response body", body=rbody) if "Request-Id" in rheaders: request_id = rheaders["Request-Id"] util.log_debug( "Dashboard link for request", link=util.dashboard_link(request_id), ) return rbody, rcode, rheaders, my_api_key