diff --git a/google/auth/_default.py b/google/auth/_default.py index 7dac642e2..5410a4c2d 100644 --- a/google/auth/_default.py +++ b/google/auth/_default.py @@ -22,6 +22,8 @@ import logging import os +import six + from google.auth import environment_vars from google.auth import exceptions import google.auth.transport._http_client @@ -67,9 +69,11 @@ def _load_credentials_from_file(filename): with io.open(filename, 'r') as file_obj: try: info = json.load(file_obj) - except ValueError as exc: - raise exceptions.DefaultCredentialsError( - 'File {} is not a valid json file.'.format(filename), exc) + except ValueError as caught_exc: + new_exc = exceptions.DefaultCredentialsError( + 'File {} is not a valid json file.'.format(filename), + caught_exc) + six.raise_from(new_exc, caught_exc) # The type key should indicate that the file is either a service account # credentials file or an authorized user credentials file. @@ -80,10 +84,11 @@ def _load_credentials_from_file(filename): try: credentials = _cloud_sdk.load_authorized_user_credentials(info) - except ValueError as exc: - raise exceptions.DefaultCredentialsError( - 'Failed to load authorized user credentials from {}'.format( - filename), exc) + except ValueError as caught_exc: + msg = 'Failed to load authorized user credentials from {}'.format( + filename) + new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) + six.raise_from(new_exc, caught_exc) # Authorized user credentials do not contain the project ID. return credentials, None @@ -93,10 +98,11 @@ def _load_credentials_from_file(filename): try: credentials = ( service_account.Credentials.from_service_account_info(info)) - except ValueError as exc: - raise exceptions.DefaultCredentialsError( - 'Failed to load service account credentials from {}'.format( - filename), exc) + except ValueError as caught_exc: + msg = 'Failed to load service account credentials from {}'.format( + filename) + new_exc = exceptions.DefaultCredentialsError(msg, caught_exc) + six.raise_from(new_exc, caught_exc) return credentials, info.get('project_id') else: diff --git a/google/auth/_oauth2client.py b/google/auth/_oauth2client.py index 312326e18..71fd7bf41 100644 --- a/google/auth/_oauth2client.py +++ b/google/auth/_oauth2client.py @@ -21,6 +21,8 @@ from __future__ import absolute_import +import six + from google.auth import _helpers import google.auth.app_engine import google.oauth2.credentials @@ -30,8 +32,9 @@ import oauth2client.client import oauth2client.contrib.gce import oauth2client.service_account -except ImportError: - raise ImportError('oauth2client is not installed.') +except ImportError as caught_exc: + six.raise_from( + ImportError('oauth2client is not installed.'), caught_exc) try: import oauth2client.contrib.appengine @@ -162,5 +165,6 @@ def convert(credentials): try: return _CLASS_CONVERSION_MAP[credentials_class](credentials) - except KeyError: - raise ValueError(_CONVERT_ERROR_TMPL.format(credentials_class)) + except KeyError as caught_exc: + new_exc = ValueError(_CONVERT_ERROR_TMPL.format(credentials_class)) + six.raise_from(new_exc, caught_exc) diff --git a/google/auth/compute_engine/_metadata.py b/google/auth/compute_engine/_metadata.py index 9a22d7a86..c47be3fae 100644 --- a/google/auth/compute_engine/_metadata.py +++ b/google/auth/compute_engine/_metadata.py @@ -22,6 +22,7 @@ import logging import os +import six from six.moves import http_client from six.moves.urllib import parse as urlparse @@ -118,10 +119,11 @@ def get(request, path, root=_METADATA_ROOT, recursive=False): if response.headers['content-type'] == 'application/json': try: return json.loads(content) - except ValueError: - raise exceptions.TransportError( + except ValueError as caught_exc: + new_exc = exceptions.TransportError( 'Received invalid JSON from the Google Compute Engine' 'metadata service: {:.20}'.format(content)) + six.raise_from(new_exc, caught_exc) else: return content else: diff --git a/google/auth/compute_engine/credentials.py b/google/auth/compute_engine/credentials.py index b8fe6f5fa..3841df2a4 100644 --- a/google/auth/compute_engine/credentials.py +++ b/google/auth/compute_engine/credentials.py @@ -19,6 +19,8 @@ """ +import six + from google.auth import credentials from google.auth import exceptions from google.auth.compute_engine import _metadata @@ -89,8 +91,9 @@ def refresh(self, request): self.token, self.expiry = _metadata.get_service_account_token( request, service_account=self._service_account_email) - except exceptions.TransportError as exc: - raise exceptions.RefreshError(exc) + except exceptions.TransportError as caught_exc: + new_exc = exceptions.RefreshError(caught_exc) + six.raise_from(new_exc, caught_exc) @property def service_account_email(self): diff --git a/google/auth/jwt.py b/google/auth/jwt.py index b1eb5fb91..02533762f 100644 --- a/google/auth/jwt.py +++ b/google/auth/jwt.py @@ -47,6 +47,7 @@ import json import cachetools +import six from six.moves import urllib from google.auth import _helpers @@ -101,8 +102,9 @@ def _decode_jwt_segment(encoded_section): section_bytes = _helpers.padded_urlsafe_b64decode(encoded_section) try: return json.loads(section_bytes.decode('utf-8')) - except ValueError: - raise ValueError('Can\'t parse segment: {0}'.format(section_bytes)) + except ValueError as caught_exc: + new_exc = ValueError('Can\'t parse segment: {0}'.format(section_bytes)) + six.raise_from(new_exc, caught_exc) def _unverified_decode(token): diff --git a/google/auth/transport/_http_client.py b/google/auth/transport/_http_client.py index 4a1009641..08b1ab6c7 100644 --- a/google/auth/transport/_http_client.py +++ b/google/auth/transport/_http_client.py @@ -17,6 +17,7 @@ import logging import socket +import six from six.moves import http_client from six.moves import urllib @@ -104,8 +105,9 @@ def __call__(self, url, method='GET', body=None, headers=None, response = connection.getresponse() return Response(response) - except (http_client.HTTPException, socket.error) as exc: - raise exceptions.TransportError(exc) + except (http_client.HTTPException, socket.error) as caught_exc: + new_exc = exceptions.TransportError(caught_exc) + six.raise_from(new_exc, caught_exc) finally: connection.close() diff --git a/google/auth/transport/grpc.py b/google/auth/transport/grpc.py index 8554ffa36..0d44f6458 100644 --- a/google/auth/transport/grpc.py +++ b/google/auth/transport/grpc.py @@ -16,13 +16,17 @@ from __future__ import absolute_import +import six try: import grpc -except ImportError: # pragma: NO COVER - raise ImportError( - 'gRPC is not installed, please install the grpcio package to use the ' - 'gRPC transport.') -import six +except ImportError as caught_exc: # pragma: NO COVER + six.raise_from( + ImportError( + 'gRPC is not installed, please install the grpcio package ' + 'to use the gRPC transport.' + ), + caught_exc, + ) class AuthMetadataPlugin(grpc.AuthMetadataPlugin): diff --git a/google/auth/transport/requests.py b/google/auth/transport/requests.py index 6fc395e27..a49d3de0e 100644 --- a/google/auth/transport/requests.py +++ b/google/auth/transport/requests.py @@ -20,11 +20,17 @@ try: import requests -except ImportError: # pragma: NO COVER - raise ImportError( - 'The requests library is not installed, please install the requests ' - 'package to use the requests transport.') -import requests.exceptions +except ImportError as caught_exc: # pragma: NO COVER + import six + six.raise_from( + ImportError( + 'The requests library is not installed, please install the ' + 'requests package to use the requests transport.' + ), + caught_exc, + ) +import requests.exceptions # pylint: disable=ungrouped-imports +import six # pylint: disable=ungrouped-imports from google.auth import exceptions from google.auth import transport @@ -111,8 +117,9 @@ def __call__(self, url, method='GET', body=None, headers=None, method, url, data=body, headers=headers, timeout=timeout, **kwargs) return _Response(response) - except requests.exceptions.RequestException as exc: - raise exceptions.TransportError(exc) + except requests.exceptions.RequestException as caught_exc: + new_exc = exceptions.TransportError(caught_exc) + six.raise_from(new_exc, caught_exc) class AuthorizedSession(requests.Session): diff --git a/google/auth/transport/urllib3.py b/google/auth/transport/urllib3.py index 0dfe91309..37eb31757 100644 --- a/google/auth/transport/urllib3.py +++ b/google/auth/transport/urllib3.py @@ -32,11 +32,17 @@ try: import urllib3 -except ImportError: # pragma: NO COVER - raise ImportError( - 'The urllib3 library is not installed, please install the urllib3 ' - 'package to use the urllib3 transport.') -import urllib3.exceptions +except ImportError as caught_exc: # pragma: NO COVER + import six + six.raise_from( + ImportError( + 'The urllib3 library is not installed, please install the ' + 'urllib3 package to use the urllib3 transport.' + ), + caught_exc, + ) +import six +import urllib3.exceptions # pylint: disable=ungrouped-imports from google.auth import exceptions from google.auth import transport @@ -126,8 +132,9 @@ def __call__(self, url, method='GET', body=None, headers=None, response = self.http.request( method, url, body=body, headers=headers, **kwargs) return _Response(response) - except urllib3.exceptions.HTTPError as exc: - raise exceptions.TransportError(exc) + except urllib3.exceptions.HTTPError as caught_exc: + new_exc = exceptions.TransportError(caught_exc) + six.raise_from(new_exc, caught_exc) def _make_default_http(): diff --git a/google/oauth2/_client.py b/google/oauth2/_client.py index 468cb7e88..66251df41 100644 --- a/google/oauth2/_client.py +++ b/google/oauth2/_client.py @@ -26,6 +26,7 @@ import datetime import json +import six from six.moves import http_client from six.moves import urllib @@ -144,9 +145,10 @@ def jwt_grant(request, token_uri, assertion): try: access_token = response_data['access_token'] - except KeyError: - raise exceptions.RefreshError( + except KeyError as caught_exc: + new_exc = exceptions.RefreshError( 'No access token in response.', response_data) + six.raise_from(new_exc, caught_exc) expiry = _parse_expiry(response_data) @@ -190,9 +192,10 @@ def refresh_grant(request, token_uri, refresh_token, client_id, client_secret): try: access_token = response_data['access_token'] - except KeyError: - raise exceptions.RefreshError( + except KeyError as caught_exc: + new_exc = exceptions.RefreshError( 'No access token in response.', response_data) + six.raise_from(new_exc, caught_exc) refresh_token = response_data.get('refresh_token', refresh_token) expiry = _parse_expiry(response_data)