@@ -176,13 +176,16 @@ def wrap_errors(callable_):
176
176
return _wrap_unary_errors (callable_ )
177
177
178
178
179
- def _create_composite_credentials (credentials = None , scopes = None , ssl_credentials = None ):
179
+ def _create_composite_credentials (credentials = None , credentials_file = None , scopes = None , ssl_credentials = None ):
180
180
"""Create the composite credentials for secure channels.
181
181
182
182
Args:
183
183
credentials (google.auth.credentials.Credentials): The credentials. If
184
184
not specified, then this function will attempt to ascertain the
185
185
credentials from the environment using :func:`google.auth.default`.
186
+ credentials_file (str): A file with credentials that can be loaded with
187
+ :func:`google.auth.load_credentials_from_file`. This argument is
188
+ mutually exclusive with credentials.
186
189
scopes (Sequence[str]): A optional list of scopes needed for this
187
190
service. These are only used when credentials are not specified and
188
191
are passed to :func:`google.auth.default`.
@@ -191,14 +194,22 @@ def _create_composite_credentials(credentials=None, scopes=None, ssl_credentials
191
194
192
195
Returns:
193
196
grpc.ChannelCredentials: The composed channel credentials object.
197
+
198
+ Raises:
199
+ google.api_core.DuplicateCredentialArgs: If both a credentials object and credentials_file are passed.
194
200
"""
195
- if credentials is None :
196
- credentials , _ = google .auth .default (scopes = scopes )
197
- else :
198
- credentials = google .auth .credentials .with_scopes_if_required (
199
- credentials , scopes
201
+ if credentials and credentials_file :
202
+ raise exceptions .DuplicateCredentialArgs (
203
+ "'credentials' and 'credentials_file' are mutually exclusive."
200
204
)
201
205
206
+ if credentials_file :
207
+ credentials , _ = google .auth .load_credentials_from_file (credentials_file , scopes = scopes )
208
+ elif credentials :
209
+ credentials = google .auth .credentials .with_scopes_if_required (credentials , scopes )
210
+ else :
211
+ credentials , _ = google .auth .default (scopes = scopes )
212
+
202
213
request = google .auth .transport .requests .Request ()
203
214
204
215
# Create the metadata plugin for inserting the authorization header.
@@ -218,7 +229,7 @@ def _create_composite_credentials(credentials=None, scopes=None, ssl_credentials
218
229
)
219
230
220
231
221
- def create_channel (target , credentials = None , scopes = None , ssl_credentials = None , ** kwargs ):
232
+ def create_channel (target , credentials = None , scopes = None , ssl_credentials = None , credentials_file = None , ** kwargs ):
222
233
"""Create a secure channel with credentials.
223
234
224
235
Args:
@@ -231,14 +242,24 @@ def create_channel(target, credentials=None, scopes=None, ssl_credentials=None,
231
242
are passed to :func:`google.auth.default`.
232
243
ssl_credentials (grpc.ChannelCredentials): Optional SSL channel
233
244
credentials. This can be used to specify different certificates.
245
+ credentials_file (str): A file with credentials that can be loaded with
246
+ :func:`google.auth.load_credentials_from_file`. This argument is
247
+ mutually exclusive with credentials.
234
248
kwargs: Additional key-word args passed to
235
249
:func:`grpc_gcp.secure_channel` or :func:`grpc.secure_channel`.
236
250
237
251
Returns:
238
252
grpc.Channel: The created channel.
253
+
254
+ Raises:
255
+ google.api_core.DuplicateCredentialArgs: If both a credentials object and credentials_file are passed.
239
256
"""
257
+
240
258
composite_credentials = _create_composite_credentials (
241
- credentials , scopes , ssl_credentials
259
+ credentials = credentials ,
260
+ credentials_file = credentials_file ,
261
+ scopes = scopes ,
262
+ ssl_credentials = ssl_credentials
242
263
)
243
264
244
265
if HAS_GRPC_GCP :
0 commit comments