From 2d0958c0c217c683b880b32529b178a2048832ec Mon Sep 17 00:00:00 2001 From: Jon Wayne Parrott Date: Wed, 22 Mar 2017 16:14:42 -0700 Subject: [PATCH] Remove oauth2client --- google/gax/_grpc_oauth2client.py | 94 ------------------------------- google/gax/grpc.py | 11 +--- setup.py | 2 +- tests/test__grpc_oauth2client.py | 97 -------------------------------- tests/test_grpc.py | 12 ++-- 5 files changed, 10 insertions(+), 206 deletions(-) delete mode 100644 google/gax/_grpc_oauth2client.py delete mode 100644 tests/test__grpc_oauth2client.py diff --git a/google/gax/_grpc_oauth2client.py b/google/gax/_grpc_oauth2client.py deleted file mode 100644 index b271793..0000000 --- a/google/gax/_grpc_oauth2client.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2015, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# pylint: disable=too-few-public-methods -"""Provides gRPC authentication support using oauth2client.""" - -from __future__ import absolute_import - -import grpc -import oauth2client.client - - -class AuthMetadataPlugin(grpc.AuthMetadataPlugin): - """A `gRPC AuthMetadataPlugin`_ that inserts the credentials into each - request. - - .. _gRPC AuthMetadataPlugin: - http://www.grpc.io/grpc/python/grpc.html#grpc.AuthMetadataPlugin - - Args: - credentials (oauth2client.client.Credentials): The credentials to - add to requests. - """ - def __init__(self, credentials, ): - self._credentials = credentials - - def _get_authorization_headers(self): - """Gets the authorization headers for a request. - - Returns: - Sequence[Tuple[str, str]]: A list of request headers (key, value) - to add to the request. - """ - bearer_token = self._credentials.get_access_token().access_token - return [ - ('authorization', 'Bearer {}'.format(bearer_token)) - ] - - def __call__(self, context, callback): - """Passes authorization metadata into the given callback. - - Args: - context (grpc.AuthMetadataContext): The RPC context. - callback (grpc.AuthMetadataPluginCallback): The callback that will - be invoked to pass in the authorization metadata. - """ - callback(self._get_authorization_headers(), None) - - -def get_default_credentials(scopes): - """Gets the Application Default Credentials.""" - credentials = ( - oauth2client.client.GoogleCredentials.get_application_default()) - return credentials.create_scoped(scopes or []) - - -def secure_authorized_channel( - credentials, target, ssl_credentials=None): - """Creates a secure authorized gRPC channel.""" - if ssl_credentials is None: - ssl_credentials = grpc.ssl_channel_credentials() - - metadata_plugin = AuthMetadataPlugin(credentials) - call_credentials = grpc.metadata_call_credentials(metadata_plugin) - channel_creds = grpc.composite_channel_credentials( - ssl_credentials, call_credentials) - - return grpc.secure_channel(target, channel_creds) diff --git a/google/gax/grpc.py b/google/gax/grpc.py index f9b0f55..7301c1f 100644 --- a/google/gax/grpc.py +++ b/google/gax/grpc.py @@ -33,12 +33,7 @@ from grpc import RpcError, StatusCode -# Preferentially use google-auth. -try: - from google.gax import _grpc_google_auth as _grpc_auth -# Fallback to oauth2client. -except ImportError: - from google.gax import _grpc_oauth2client as _grpc_auth +from google.gax import _grpc_google_auth API_ERRORS = (RpcError, ) @@ -106,9 +101,9 @@ def create_stub(generated_create_stub, channel=None, service_path=None, target = '{}:{}'.format(service_path, service_port) if credentials is None: - credentials = _grpc_auth.get_default_credentials(scopes) + credentials = _grpc_google_auth.get_default_credentials(scopes) - channel = _grpc_auth.secure_authorized_channel( + channel = _grpc_google_auth.secure_authorized_channel( credentials, target, ssl_credentials=ssl_credentials) return generated_create_stub(channel) diff --git a/setup.py b/setup.py index 9a9a6b4..f9cc9a1 100644 --- a/setup.py +++ b/setup.py @@ -40,7 +40,7 @@ 'future>=0.16.0, <0.17dev', 'googleapis-common-protos>=1.5.2, <2.0dev', 'grpcio>=1.0.2, <2.0dev', - 'oauth2client>=2.0.0, <4.0dev', + 'google-auth>=0.8.0, <2.0dev', 'ply==3.8', 'protobuf>=3.0.0, <4.0dev', ] diff --git a/tests/test__grpc_oauth2client.py b/tests/test__grpc_oauth2client.py deleted file mode 100644 index 2393c4a..0000000 --- a/tests/test__grpc_oauth2client.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2016, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# pylint: disable=missing-docstring,no-self-use,no-init,invalid-name -"""Unit tests for _grpc_oauth2client.""" - -from __future__ import absolute_import - -import mock -import unittest2 - -from google.gax import _grpc_oauth2client - - -class TestAuthMetadataPlugin(unittest2.TestCase): - TEST_TOKEN = 'an_auth_token' - - def test(self): - credentials = mock.Mock() - credentials.get_access_token.return_value = mock.Mock( - access_token=self.TEST_TOKEN) - - metadata_plugin = _grpc_oauth2client.AuthMetadataPlugin(credentials) - - self.assertFalse(credentials.create_scoped.called) - - callback = mock.Mock() - metadata_plugin(None, callback) - - callback.assert_called_once_with([ - ('authorization', 'Bearer {}'.format(self.TEST_TOKEN))], None) - - -class TestGetDefaultCredentials(unittest2.TestCase): - TEST_TOKEN = 'an_auth_token' - - @mock.patch('oauth2client.client.GoogleCredentials.get_application_default') - def test(self, factory): - creds = mock.Mock() - creds.get_access_token.return_value = mock.Mock( - access_token=self.TEST_TOKEN) - factory_mock_config = {'create_scoped.return_value': creds} - factory.return_value = mock.Mock(**factory_mock_config) - fake_scopes = ['fake', 'scopes'] - - got = _grpc_oauth2client.get_default_credentials(fake_scopes) - - factory.return_value.create_scoped.assert_called_once_with(fake_scopes) - self.assertEqual(got, creds) - - -class TestSecureAuthorizedChannel(unittest2.TestCase): - FAKE_TARGET = 'service_path:10101' - - @mock.patch('grpc.composite_channel_credentials') - @mock.patch('grpc.ssl_channel_credentials') - @mock.patch('grpc.secure_channel') - @mock.patch('google.gax._grpc_oauth2client.AuthMetadataPlugin') - def test( - self, auth_metadata_plugin, secure_channel, ssl_channel_credentials, - composite_channel_credentials): - credentials = mock.Mock() - - got_channel = _grpc_oauth2client.secure_authorized_channel( - credentials, self.FAKE_TARGET) - - ssl_channel_credentials.assert_called_once_with() - secure_channel.assert_called_once_with( - self.FAKE_TARGET, composite_channel_credentials.return_value) - auth_metadata_plugin.assert_called_once_with(credentials) - self.assertEqual(got_channel, secure_channel.return_value) diff --git a/tests/test_grpc.py b/tests/test_grpc.py index f44438e..cd13ae2 100644 --- a/tests/test_grpc.py +++ b/tests/test_grpc.py @@ -46,8 +46,8 @@ class TestCreateStub(unittest2.TestCase): FAKE_SERVICE_PATH = 'service_path' FAKE_PORT = 10101 - @mock.patch('google.gax.grpc._grpc_auth.get_default_credentials') - @mock.patch('google.gax.grpc._grpc_auth.secure_authorized_channel') + @mock.patch('google.gax._grpc_google_auth.get_default_credentials') + @mock.patch('google.gax._grpc_google_auth.secure_authorized_channel') def test_creates_a_stub_with_default_credentials( self, secure_authorized_channel, get_default_credentials): fake_scopes = ['one', 'two'] @@ -63,8 +63,8 @@ def test_creates_a_stub_with_default_credentials( self.assertEqual(got_channel, secure_authorized_channel.return_value) - @mock.patch('google.gax.grpc._grpc_auth.get_default_credentials') - @mock.patch('google.gax.grpc._grpc_auth.secure_authorized_channel') + @mock.patch('google.gax._grpc_google_auth.get_default_credentials') + @mock.patch('google.gax._grpc_google_auth.secure_authorized_channel') def test_creates_a_stub_with_explicit_credentials( self, secure_authorized_channel, get_default_credentials): credentials = mock.Mock() @@ -80,8 +80,8 @@ def test_creates_a_stub_with_explicit_credentials( self.assertEqual(got_channel, secure_authorized_channel.return_value) - @mock.patch('google.gax.grpc._grpc_auth.get_default_credentials') - @mock.patch('google.gax.grpc._grpc_auth.secure_authorized_channel') + @mock.patch('google.gax._grpc_google_auth.get_default_credentials') + @mock.patch('google.gax._grpc_google_auth.secure_authorized_channel') def test_creates_a_stub_with_given_channel( self, secure_authorized_channel, get_default_credentials): fake_channel = mock.Mock()