@@ -51,6 +51,9 @@ pub const DEFAULT_GCS_BASE_URL: &str = "https://storage.googleapis.com";
5151const DEFAULT_GCS_PLAYLOAD_STRING : & str = "UNSIGNED-PAYLOAD" ;
5252const DEFAULT_GCS_SIGN_BLOB_HOST : & str = "storage.googleapis.com" ;
5353
54+ const DEFAULT_METADATA_HOST : & str = "metadata.google.internal" ;
55+ const DEFAULT_METADATA_IP : & str = "169.254.169.254" ;
56+
5457#[ derive( Debug , Snafu ) ]
5558pub enum Error {
5659 #[ snafu( display( "Unable to open service account file from {}: {}" , path. display( ) , source) ) ]
@@ -414,17 +417,31 @@ impl TokenProvider for InstanceCredentialProvider {
414417
415418 /// Fetch a token from the metadata server.
416419 /// Since the connection is local we need to enable http access and don't actually use the client object passed in.
420+ /// Respects the `GCE_METADATA_HOST`, `GCE_METADATA_ROOT`, and `GCE_METADATA_IP`
421+ /// environment variables.
422+ ///
423+ /// References: <https://googleapis.dev/python/google-auth/latest/reference/google.auth.environment_vars.html>
417424 async fn fetch_token (
418425 & self ,
419426 client : & Client ,
420427 retry : & RetryConfig ,
421428 ) -> crate :: Result < TemporaryToken < Arc < GcpCredential > > > {
422- const METADATA_IP : & str = "169.254.169.254" ;
423- const METADATA_HOST : & str = "metadata" ;
429+ let metadata_host = if let Ok ( host) = env:: var ( "GCE_METADATA_HOST" ) {
430+ host
431+ } else if let Ok ( host) = env:: var ( "GCE_METADATA_ROOT" ) {
432+ host
433+ } else {
434+ DEFAULT_METADATA_HOST . to_string ( )
435+ } ;
436+ let metadata_ip = if let Ok ( ip) = env:: var ( "GCE_METADATA_IP" ) {
437+ ip
438+ } else {
439+ DEFAULT_METADATA_IP . to_string ( )
440+ } ;
424441
425442 info ! ( "fetching token from metadata server" ) ;
426- let response = make_metadata_request ( client, METADATA_HOST , retry)
427- . or_else ( |_| make_metadata_request ( client, METADATA_IP , retry) )
443+ let response = make_metadata_request ( client, & metadata_host , retry)
444+ . or_else ( |_| make_metadata_request ( client, & metadata_ip , retry) )
428445 . await ?;
429446
430447 let token = TemporaryToken {
@@ -469,18 +486,33 @@ impl TokenProvider for InstanceSigningCredentialProvider {
469486
470487 /// Fetch a token from the metadata server.
471488 /// Since the connection is local we need to enable http access and don't actually use the client object passed in.
489+ /// Respects the `GCE_METADATA_HOST`, `GCE_METADATA_ROOT`, and `GCE_METADATA_IP`
490+ /// environment variables.
491+ ///
492+ /// References: <https://googleapis.dev/python/google-auth/latest/reference/google.auth.environment_vars.html>
472493 async fn fetch_token (
473494 & self ,
474495 client : & Client ,
475496 retry : & RetryConfig ,
476497 ) -> crate :: Result < TemporaryToken < Arc < GcpSigningCredential > > > {
477- const METADATA_IP : & str = "169.254.169.254" ;
478- const METADATA_HOST : & str = "metadata" ;
498+ let metadata_host = if let Ok ( host) = env:: var ( "GCE_METADATA_HOST" ) {
499+ host
500+ } else if let Ok ( host) = env:: var ( "GCE_METADATA_ROOT" ) {
501+ host
502+ } else {
503+ DEFAULT_METADATA_HOST . to_string ( )
504+ } ;
505+
506+ let metadata_ip = if let Ok ( ip) = env:: var ( "GCE_METADATA_IP" ) {
507+ ip
508+ } else {
509+ DEFAULT_METADATA_IP . to_string ( )
510+ } ;
479511
480512 info ! ( "fetching token from metadata server" ) ;
481513
482- let email = make_metadata_request_for_email ( client, METADATA_HOST , retry)
483- . or_else ( |_| make_metadata_request_for_email ( client, METADATA_IP , retry) )
514+ let email = make_metadata_request_for_email ( client, & metadata_host , retry)
515+ . or_else ( |_| make_metadata_request_for_email ( client, & metadata_ip , retry) )
484516 . await ?;
485517
486518 let token = TemporaryToken {
0 commit comments