Skip to content

Commit 94652e5

Browse files
barronwalamb
andauthored
use GCE metadata server env var overrides (#6015)
* use GCE metadata env var overrides * update docs Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org> --------- Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
1 parent 4978e32 commit 94652e5

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

object_store/src/gcp/credential.rs

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ pub const DEFAULT_GCS_BASE_URL: &str = "https://storage.googleapis.com";
5151
const DEFAULT_GCS_PLAYLOAD_STRING: &str = "UNSIGNED-PAYLOAD";
5252
const 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)]
5558
pub 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

Comments
 (0)