From c03cfc343fdf1ae8327fbe2059331903052ee596 Mon Sep 17 00:00:00 2001 From: Jon Wayne Parrott Date: Tue, 26 Sep 2017 14:14:57 -0700 Subject: [PATCH 1/2] Add grpc_helpers.create_channel --- core/google/api/core/helpers/grpc_helpers.py | 30 ++++++++++++++ .../api_core/helpers/test_grpc_helpers.py | 41 +++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/core/google/api/core/helpers/grpc_helpers.py b/core/google/api/core/helpers/grpc_helpers.py index 0f065b7086e1..99b1a9b542b0 100644 --- a/core/google/api/core/helpers/grpc_helpers.py +++ b/core/google/api/core/helpers/grpc_helpers.py @@ -17,6 +17,10 @@ import grpc import six +import google.auth +import google.auth.transport.grpc +import google.auth.transport.requests + from google.api.core import exceptions @@ -102,3 +106,29 @@ def wrap_errors(callable_): return _wrap_stream_errors(callable_) else: return _wrap_unary_errors(callable_) + + +def create_channel(target, credentials=None, scopes=None, **kwargs): + """Create a secure channel with credentials. + + Args: + target (str): The target service address in the format 'hostname:port'. + credentials (google.auth.credentials.Credentials): The credentials. If + not specified, then this function will attempt to ascertain the + credentials from the environment using :func:`google.auth.default`. + scopes (Sequence[str]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + kwargs: Additional key-word args passed to + :func:`google.auth.transport.grpc.secure_authorized_channel`. + + Returns: + grpc.Channel: The created channel. + """ + if credentials is None: + credentials, _ = google.auth.default(scopes=scopes) + + request = google.auth.transport.requests.Request() + + return google.auth.transport.grpc.secure_authorized_channel( + credentials, request, target, **kwargs) diff --git a/core/tests/unit/api_core/helpers/test_grpc_helpers.py b/core/tests/unit/api_core/helpers/test_grpc_helpers.py index 1b4f3a3025b6..8ee08d87a66f 100644 --- a/core/tests/unit/api_core/helpers/test_grpc_helpers.py +++ b/core/tests/unit/api_core/helpers/test_grpc_helpers.py @@ -128,3 +128,44 @@ def test_wrap_errors_streaming(wrap_stream_errors): assert result == wrap_stream_errors.return_value wrap_stream_errors.assert_called_once_with(callable_) + + +@mock.patch( + 'google.auth.default', + return_value=(mock.sentinel.credentials, mock.sentinel.projet)) +@mock.patch('google.auth.transport.grpc.secure_authorized_channel') +def test_create_channel_implicit(secure_authorized_channel, default): + target = 'example.com:443' + + channel = grpc_helpers.create_channel(target) + + assert channel is secure_authorized_channel.return_value + default.assert_called_once_with(scopes=None) + secure_authorized_channel.assert_called_once_with( + mock.sentinel.credentials, mock.ANY, target) + + +@mock.patch( + 'google.auth.default', + return_value=(mock.sentinel.credentials, mock.sentinel.projet)) +@mock.patch('google.auth.transport.grpc.secure_authorized_channel') +def test_create_channel_implicit_with_scopes( + secure_authorized_channel, default): + target = 'example.com:443' + + channel = grpc_helpers.create_channel(target, scopes=['one', 'two']) + + assert channel is secure_authorized_channel.return_value + default.assert_called_once_with(scopes=['one', 'two']) + + +@mock.patch('google.auth.transport.grpc.secure_authorized_channel') +def test_create_channel_explicit(secure_authorized_channel): + target = 'example.com:443' + + channel = grpc_helpers.create_channel( + target, credentials=mock.sentinel.credentials) + + assert channel is secure_authorized_channel.return_value + secure_authorized_channel.assert_called_once_with( + mock.sentinel.credentials, mock.ANY, target) From d2b5a2d087db5f342febde2ba6544d0428fb039f Mon Sep 17 00:00:00 2001 From: Jon Wayne Parrott Date: Tue, 26 Sep 2017 14:26:25 -0700 Subject: [PATCH 2/2] Fix import order --- core/google/api/core/helpers/grpc_helpers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/google/api/core/helpers/grpc_helpers.py b/core/google/api/core/helpers/grpc_helpers.py index 99b1a9b542b0..28e22fde8888 100644 --- a/core/google/api/core/helpers/grpc_helpers.py +++ b/core/google/api/core/helpers/grpc_helpers.py @@ -17,12 +17,11 @@ import grpc import six +from google.api.core import exceptions import google.auth import google.auth.transport.grpc import google.auth.transport.requests -from google.api.core import exceptions - # The list of gRPC Callable interfaces that return iterators. _STREAM_WRAP_CLASSES = (