예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
 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)
예제 #5
0
    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
예제 #6
0
    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