Skip to content

Commit 1302928

Browse files
committed
merge
1 parent e457594 commit 1302928

File tree

1 file changed

+80
-0
lines changed
  • crates/fig_api_client/src/credentials

1 file changed

+80
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
use aws_config::default_provider::region::DefaultRegionChain;
2+
use aws_config::ecs::EcsCredentialsProvider;
3+
use aws_config::environment::credentials::EnvironmentVariableCredentialsProvider;
4+
use aws_config::imds::credentials::ImdsCredentialsProvider;
5+
use aws_config::meta::credentials::CredentialsProviderChain;
6+
use aws_config::profile::ProfileFileCredentialsProvider;
7+
use aws_config::provider_config::ProviderConfig;
8+
use aws_config::web_identity_token::WebIdentityTokenCredentialsProvider;
9+
use aws_credential_types::Credentials;
10+
use aws_credential_types::provider::{
11+
self,
12+
ProvideCredentials,
13+
future,
14+
};
15+
use tracing::Instrument;
16+
17+
#[derive(Debug)]
18+
pub struct CredentialsChain {
19+
provider_chain: CredentialsProviderChain,
20+
}
21+
22+
impl CredentialsChain {
23+
/// Based on code the code for
24+
/// [aws_config::default_provider::credentials::DefaultCredentialsChain]: <https://github.com/awslabs/aws-sdk-rust/blob/563b1594679844b2ba2b0008be6bfa5076730fac/sdk/aws-config/src/default_provider/credentials.rs#L175-L196>
25+
pub async fn new() -> Self {
26+
let region = DefaultRegionChain::builder().build().region().await;
27+
let config = ProviderConfig::default().with_region(region.clone());
28+
29+
let env_provider = EnvironmentVariableCredentialsProvider::new();
30+
let profile_provider = ProfileFileCredentialsProvider::builder().configure(&config).build();
31+
let web_identity_token_provider = WebIdentityTokenCredentialsProvider::builder()
32+
.configure(&config)
33+
.build();
34+
let imds_provider = ImdsCredentialsProvider::builder().configure(&config).build();
35+
let ecs_provider = EcsCredentialsProvider::builder().configure(&config).build();
36+
37+
let mut provider_chain = CredentialsProviderChain::first_try("Environment", env_provider);
38+
39+
provider_chain = provider_chain
40+
.or_else("Profile", profile_provider)
41+
.or_else("WebIdentityToken", web_identity_token_provider)
42+
.or_else("EcsContainer", ecs_provider)
43+
.or_else("Ec2InstanceMetadata", imds_provider);
44+
45+
CredentialsChain { provider_chain }
46+
}
47+
48+
async fn credentials(&self) -> provider::Result {
49+
self.provider_chain
50+
.provide_credentials()
51+
.instrument(tracing::debug_span!("provide_credentials", provider = %"default_chain"))
52+
.await
53+
}
54+
}
55+
56+
impl ProvideCredentials for CredentialsChain {
57+
fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>
58+
where
59+
Self: 'a,
60+
{
61+
future::ProvideCredentials::new(self.credentials())
62+
}
63+
64+
fn fallback_on_interrupt(&self) -> Option<Credentials> {
65+
self.provider_chain.fallback_on_interrupt()
66+
}
67+
}
68+
69+
#[cfg(test)]
70+
mod tests {
71+
use super::*;
72+
73+
#[tokio::test]
74+
async fn test_credentials_chain() {
75+
let credentials_chain = CredentialsChain::new().await;
76+
let credentials_res = credentials_chain.provide_credentials().await;
77+
let fallback_on_interrupt_res = credentials_chain.fallback_on_interrupt();
78+
println!("credentials_res: {credentials_res:?}, fallback_on_interrupt_res: {fallback_on_interrupt_res:?}");
79+
}
80+
}

0 commit comments

Comments
 (0)