Unverified Commit 130703da authored by Russell Cohen's avatar Russell Cohen Committed by GitHub
Browse files

Breaking: Make `ProvideRegion::region` async (#661)

* Update region interface to be async

* Update all examples

* Update aws-auth-providers to support async regions

* Fix KMS tests

* Fix all examples again

* Update CHANGELOG, fix broken test

* Fix ses examples

* fix ses examples take 2
parent 3b8f69c1
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
vNext (Month Day, Year)
-----------------------
**Breaking Changes**
- `ProvideRegion` is now asynchronous. Code that called `provider.region()` must be changed to `provider.region().await`.
- `<awsservice>::Config::from_env()` is now also asynchronous because it must load a region
- `<awsservice>::Config::builder()` will **not** load a default region unspecified. A region must be specified directly.

**New this week**

- (When complete) Add Event Stream support (#653, #xyz)
- (When complete) Add profile file provider for region (#594, #xyz)


v0.21 (August 19th, 2021)
-------------------------

+12 −7
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ use aws_auth::provider::BoxFuture;
use aws_auth::provider::{AsyncProvideCredentials, CredentialsResult};
use aws_hyper::DynConnector;
use aws_types::os_shim_internal::{Env, Fs};
use aws_types::region::ProvideRegion;
use aws_types::region::Region;
use smithy_async::rt::sleep::AsyncSleep;

/// Default AWS Credential Provider Chain
@@ -29,7 +29,7 @@ use smithy_async::rt::sleep::AsyncSleep;
/// ```rust
/// use aws_types::region::Region;
/// let credentials_provider = aws_auth_providers::DefaultProviderChain::builder()
///     .region(&Region::new("us-west-1"))
///     .region(Region::new("us-west-1"))
///     .build();
/// ```
///
@@ -67,9 +67,14 @@ impl Builder {
    /// Set the region used when making requests to AWS services (eg. STS) as part of the provider chain
    ///
    /// When unset, the default region resolver chain will be used.
    pub fn region(mut self, region: &dyn ProvideRegion) -> Self {
        self.profile_file_builder.set_region(region.region());
        self.web_identity_builder.set_region(region.region());
    pub fn region(mut self, region: Region) -> Self {
        self.set_region(Some(region));
        self
    }

    pub fn set_region(&mut self, region: Option<Region>) -> &mut Self {
        self.profile_file_builder.set_region(region.clone());
        self.web_identity_builder.set_region(region);
        self
    }

@@ -183,7 +188,7 @@ mod test {
                    crate::default_provider_chain::Builder::default()
                        .env(env)
                        .fs(fs)
                        .region(&Region::from_static("us-east-1"))
                        .region(Region::from_static("us-east-1"))
                        .connector(conn)
                        .build()
                })
@@ -220,7 +225,7 @@ mod test {
            crate::default_provider_chain::Builder::default()
                .env(env)
                .fs(fs)
                .region(&Region::from_static("us-east-1"))
                .region(Region::from_static("us-east-1"))
                .connector(conn)
                .build()
        })
+6 −5
Original line number Diff line number Diff line
@@ -49,9 +49,10 @@ fn default_connector() -> Option<DynConnector> {
///
/// This provider chain will use defaults for all settings. The region will be resolved with the default
/// provider chain. To construct a custom provider, use [`default_provider_chain::Builder`](default_provider_chain::Builder).
pub fn default_provider() -> impl AsyncProvideCredentials {
    let resolved_region = aws_types::region::default_provider();
    default_provider_chain::Builder::default()
        .region(&resolved_region)
        .build()
pub async fn default_provider() -> impl AsyncProvideCredentials {
    use aws_types::region::ProvideRegion;
    let resolved_region = aws_types::region::default_provider().region().await;
    let mut builder = default_provider_chain::Builder::default();
    builder.set_region(resolved_region);
    builder.build()
}
+1 −1
Original line number Diff line number Diff line
@@ -363,7 +363,7 @@ async fn build_provider_chain(
    })?;
    let repr = repr::resolve_chain(&profile_set)?;
    tracing::info!(chain = ?repr, "constructed abstract provider from config file");
    exec::ProviderChain::from_repr(fs.clone(), connector, region, repr, &factory)
    exec::ProviderChain::from_repr(fs.clone(), connector, region.region().await, repr, &factory)
}

#[cfg(test)]
+3 −3
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ use aws_auth::Credentials;
use aws_hyper::{DynConnector, StandardClient};
use aws_sdk_sts::operation::AssumeRole;
use aws_sdk_sts::Config;
use aws_types::region::{ProvideRegion, Region};
use aws_types::region::Region;

use crate::profile::repr::BaseProvider;
use crate::profile::ProfileFileError;
@@ -93,7 +93,7 @@ impl ProviderChain {
    pub fn from_repr(
        fs: Fs,
        connector: &DynConnector,
        region: &dyn ProvideRegion,
        region: Option<Region>,
        repr: repr::ProfileChain,
        factory: &named::NamedProviderFactory,
    ) -> Result<Self, ProfileFileError> {
@@ -187,7 +187,7 @@ mod test {
        let chain = ProviderChain::from_repr(
            Default::default(),
            &stub_connector(),
            &Region::new("us-east-1"),
            Some(Region::new("us-east-1")),
            ProfileChain {
                base: BaseProvider::NamedSource("floozle"),
                chain: vec![],
Loading