@@ -176,13 +176,16 @@ def wrap_errors(callable_):
176176 return _wrap_unary_errors (callable_ )
177177
178178
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 ):
180180 """Create the composite credentials for secure channels.
181181
182182 Args:
183183 credentials (google.auth.credentials.Credentials): The credentials. If
184184 not specified, then this function will attempt to ascertain the
185185 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.
186189 scopes (Sequence[str]): A optional list of scopes needed for this
187190 service. These are only used when credentials are not specified and
188191 are passed to :func:`google.auth.default`.
@@ -191,14 +194,22 @@ def _create_composite_credentials(credentials=None, scopes=None, ssl_credentials
191194
192195 Returns:
193196 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.
194200 """
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."
200204 )
201205
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+
202213 request = google .auth .transport .requests .Request ()
203214
204215 # Create the metadata plugin for inserting the authorization header.
@@ -218,7 +229,7 @@ def _create_composite_credentials(credentials=None, scopes=None, ssl_credentials
218229 )
219230
220231
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 ):
222233 """Create a secure channel with credentials.
223234
224235 Args:
@@ -231,14 +242,24 @@ def create_channel(target, credentials=None, scopes=None, ssl_credentials=None,
231242 are passed to :func:`google.auth.default`.
232243 ssl_credentials (grpc.ChannelCredentials): Optional SSL channel
233244 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.
234248 kwargs: Additional key-word args passed to
235249 :func:`grpc_gcp.secure_channel` or :func:`grpc.secure_channel`.
236250
237251 Returns:
238252 grpc.Channel: The created channel.
253+
254+ Raises:
255+ google.api_core.DuplicateCredentialArgs: If both a credentials object and credentials_file are passed.
239256 """
257+
240258 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
242263 )
243264
244265 if HAS_GRPC_GCP :
0 commit comments