| Index: client/third_party/google/auth/compute_engine/credentials.py
 | 
| diff --git a/client/third_party/google/auth/compute_engine/credentials.py b/client/third_party/google/auth/compute_engine/credentials.py
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..572995690624adc30c3926fc93ba5f88b0137d7d
 | 
| --- /dev/null
 | 
| +++ b/client/third_party/google/auth/compute_engine/credentials.py
 | 
| @@ -0,0 +1,121 @@
 | 
| +# Copyright 2016 Google Inc.
 | 
| +#
 | 
| +# Licensed under the Apache License, Version 2.0 (the "License");
 | 
| +# you may not use this file except in compliance with the License.
 | 
| +# You may obtain a copy of the License at
 | 
| +#
 | 
| +#      http://www.apache.org/licenses/LICENSE-2.0
 | 
| +#
 | 
| +# Unless required by applicable law or agreed to in writing, software
 | 
| +# distributed under the License is distributed on an "AS IS" BASIS,
 | 
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
| +# See the License for the specific language governing permissions and
 | 
| +# limitations under the License.
 | 
| +
 | 
| +"""Google Compute Engine credentials.
 | 
| +
 | 
| +This module provides authentication for application running on Google Compute
 | 
| +Engine using the Compute Engine metadata server.
 | 
| +
 | 
| +"""
 | 
| +
 | 
| +from google.auth import credentials
 | 
| +from google.auth import exceptions
 | 
| +from google.auth.compute_engine import _metadata
 | 
| +
 | 
| +
 | 
| +class Credentials(credentials.Scoped, credentials.Credentials):
 | 
| +    """Compute Engine Credentials.
 | 
| +
 | 
| +    These credentials use the Google Compute Engine metadata server to obtain
 | 
| +    OAuth 2.0 access tokens associated with the instance's service account.
 | 
| +
 | 
| +    For more information about Compute Engine authentication, including how
 | 
| +    to configure scopes, see the `Compute Engine authentication
 | 
| +    documentation`_.
 | 
| +
 | 
| +    .. note:: Compute Engine instances can be created with scopes and therefore
 | 
| +        these credentials are considered to be 'scoped'. However, you can
 | 
| +        not use :meth:`~google.auth.credentials.ScopedCredentials.with_scopes`
 | 
| +        because it is not possible to change the scopes that the instance
 | 
| +        has. Also note that
 | 
| +        :meth:`~google.auth.credentials.ScopedCredentials.has_scopes` will not
 | 
| +        work until the credentials have been refreshed.
 | 
| +
 | 
| +    .. _Compute Engine authentication documentation:
 | 
| +        https://cloud.google.com/compute/docs/authentication#using
 | 
| +    """
 | 
| +
 | 
| +    def __init__(self, service_account_email='default'):
 | 
| +        """
 | 
| +        Args:
 | 
| +            service_account_email (str): The service account email to use, or
 | 
| +                'default'. A Compute Engine instance may have multiple service
 | 
| +                accounts.
 | 
| +        """
 | 
| +        super(Credentials, self).__init__()
 | 
| +        self._service_account_email = service_account_email
 | 
| +
 | 
| +    def _retrieve_info(self, request):
 | 
| +        """Retrieve information about the service account.
 | 
| +
 | 
| +        Updates the scopes and retrieves the full service account email.
 | 
| +
 | 
| +        Args:
 | 
| +            request (google.auth.transport.Request): The object used to make
 | 
| +                HTTP requests.
 | 
| +        """
 | 
| +        info = _metadata.get_service_account_info(
 | 
| +            request,
 | 
| +            service_account=self._service_account_email)
 | 
| +
 | 
| +        self._service_account_email = info['email']
 | 
| +        self._scopes = info['scopes']
 | 
| +
 | 
| +    def refresh(self, request):
 | 
| +        """Refresh the access token and scopes.
 | 
| +
 | 
| +        Args:
 | 
| +            request (google.auth.transport.Request): The object used to make
 | 
| +                HTTP requests.
 | 
| +
 | 
| +        Raises:
 | 
| +            google.auth.exceptions.RefreshError: If the Compute Engine metadata
 | 
| +                service can't be reached if if the instance has not
 | 
| +                credentials.
 | 
| +        """
 | 
| +        try:
 | 
| +            self._retrieve_info(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)
 | 
| +
 | 
| +    @property
 | 
| +    def service_account_email(self):
 | 
| +        """The service account email.
 | 
| +
 | 
| +        .. note: This is not guaranteed to be set until :meth`refresh` has been
 | 
| +            called.
 | 
| +        """
 | 
| +        return self._service_account_email
 | 
| +
 | 
| +    @property
 | 
| +    def requires_scopes(self):
 | 
| +        """False: Compute Engine credentials can not be scoped."""
 | 
| +        return False
 | 
| +
 | 
| +    def with_scopes(self, scopes):
 | 
| +        """Unavailable, Compute Engine credentials can not be scoped.
 | 
| +
 | 
| +        Scopes can only be set at Compute Engine instance creation time.
 | 
| +        See the `Compute Engine authentication documentation`_ for details on
 | 
| +        how to configure instance scopes.
 | 
| +
 | 
| +        .. _Compute Engine authentication documentation:
 | 
| +            https://cloud.google.com/compute/docs/authentication#using
 | 
| +        """
 | 
| +        raise NotImplementedError(
 | 
| +            'Compute Engine credentials can not set scopes. Scopes must be '
 | 
| +            'set when the Compute Engine instance is created.')
 | 
| 
 |